当前位置:首页>Linux>2026W25技术:book-深入理解Linux虚拟内存管理-框架1.0

2026W25技术:book-深入理解Linux虚拟内存管理-框架1.0

  • 2026-10-11 07:21:54
2026W25技术:book-深入理解Linux虚拟内存管理-框架1.0

缘起

  • 这本书其实之前(读过一下),但只是抄书,现在又不知道是啥了,最近在看另一本书(内存和进程时),正好有个电子书在电脑上,就稍微串了下体系
  • 全书13章,我大概分为3部分,其实内容部分倒占比不多,占比多的是附录,目前代码都到7.x版本了,
  • 用时34min,20260626,23:19-23:53,

    内容

  • 分为3部分
    • 硬件抽象层,物理内存怎么管理(建立逻辑关系),
    • 资源分配层(内存充足时)
    • 异常处理层,内存不够时,怎么处理,

2.1、硬件抽象层(2-4章)

  • chap02上来就是NUMA(这是cpu的架构),lscpu可以看出其有几个numa节点(nodes),
  • chap03页表管理,struct page{}
    • 引入3层结构 (PGD, PMD, PTE)
      ,
  • chap04进程地址空间,从进程的角度看(是有个固定的结构的),mm_struct,
    总结(自己串起来的逻辑是啥)
  • 1、进程通过 mm_struct 管理其整个虚拟地址空间,系统调用 (mmap、 brk),字段中有VMA的数量,
  • 2、空间由若干个 VMA 组成,每个 VMA 描述一段连续的虚拟地址区域(vm_area_struct, 红黑树, 链表)
  • 3、CPU 访问虚拟地址时,MMU 通过 页表 来查找对应的物理地址(这里有3层逻辑结构,PGD,PMD,PTE,
  • 4、如果页表查找失败(比如没有映射),就会触发缺页异常。这是TLB机制,
  • 5、内核响应异常时,会通过伙伴系统从合适的内存区域 (Zone) 中分配一个物理页框。主要应用是alloc_pages,
  • 6、分配成功后,会更新 页表 (PTE),并建立虚拟地址与物理页框的映射
  • 7、内核通过 struct page 来管理所有物理页框。

2.2、资源分配层(5-8章)

  • 内存初始化
    (建立个地图),chap05引导内存分配器,
  • 物理页分配(连续与非连续内存)
    ,chap06物理页面分析,chap07非连续内存
  • slab分配器
    ,chap08slab分配器
    总结(最终的几个调用场景,都会到)
  • 1、缺页异常(匿名页),do_anonymous_page()→ alloc_zeroed_user_highpage()→ alloc_pages()
  • 2、缺页异常(文件映射),do_fault()→ do_fault()→ alloc_page()
  • 3、内核模块 kmalloc,kmalloc()→ SLAB/SLUB → 如果 SLAB 层没有空闲对象,调用 alloc_pages()
  • 4、用户态 mmap,mmap()→ do_mmap() → 首次访问时触发缺页 → 同上
  • 5、驱动申请 DMA 内存,dma_alloc_coherent() → alloc_pages()
  • SLAB 是伙伴系统的上层封装
    ,

2.3、异常处理层(9-13章)

  • 这部分没细看,只是建立一个框架
  • 内存紧张,先回收
    ,Chap10页框回收(先回收不用的页)
    • LRU 链表、kswapd、内核线程、页面老化机制
  • 内存紧张到,回收的空间也不够用
    ,Chap11交换管理(将匿名页换出到磁盘)
    • 回收到的空间不能直接丢弃,需要交换出去
      ,将内存页换出到磁盘上的交换分区(swap)
  • 回收+交换,还不够用
    ,Chap13内存溢出管理(OOM Killer进程)
  • 32 位系统访问大内存【硬件限制】
    ,Chap09高端内存映射
    • 32 位系统下,内核无法直接访问所有物理内存(>896MB)。如何访问高地址的物理内存?
    • 通过临时映射(kmap、kmap_atomic)将高端内存页框映射到内核虚拟地址空间。
  • 进程间共享数据
    ,Chap12共享内存(VFS / tmpfs)
    • mmap基于 VFS 的实现,以及tmpfs、shmem等共享内存机制。

最后

  • 初步整理,只是为了弄个框架,不然的话,直接看知识点有点脑壳疼,也没办法记住一些知识点,

最新文章

随机文章