关于内核内存管理的学习,我想先大致理清一下各个概念之间的关系以及为什么会出现这个概念.还有就是运行的流程图(持续补充,想到什么就来补上)
第一次接触内存管理是从学C语言时malloc()函数开始的,当时老师讲了虚拟内存,听的也是一知半解,关于虚拟内存,我很好奇的是怎么个虚拟法以及带来的效果.但是要明白虚拟内存,应该先了解什么是MMU,页表,物理内存,物理页面,建立映射关系,按需分配,缺页中断,写时复制等机制与概念.
当了解MMU时,除了其工作原理之外,还会接触到Linux内核如何建立页表映射,包括用户空间页表的建立和内核空间页表的建立,以及内核是如何查询页表和修改页表的.
当了解物理内存和物理页面时,会接触到一些数据结构,比如struct pg_data_t,struct zone,struct page等.这三个描述了系统中物理内存的组织架构。
当了解怎么分配物理页面时,会接触到伙伴系统机制和页面分配器(page allocator),页面分配器非常复杂~
当了解malloc()怎么分配出物理内存时,会接触到缺页中断,也是非常复杂且要命机制.
把物理内存搞清之后,不自觉就会想和虚拟内存的映射关系.(没完没了-.-)虚拟内存和物理内存采用建立页表的方法,来完成建立映射关系。进程的虚拟内存一般用struct vm_area_struct数据结构描述,为什么和进程的地址空间建立映射的页面有的叫匿名页面,有的叫page cache页面呢?(我搞清了 我再回来改0.0)
终于,虚拟内存和物理内存已经建立了映射关系(默认都弄清了 呵呵呵),但是这个是以页为基础的,可是有时内核需要小于一个页面大小的内存,那么slab机制就诞生了~
以上就是基本了解的基本流程吧,但是会出问题,比如用户持续分配和使用内存导致物理内存不足怎么办?这时页面回收机制和反向映射机制就诞生了~
这是从分配角度,从解除映射的角度来看也会出问题,物理内存和虚拟内存的映射关系经常是建立后又被解除了,时间一长,系统的物理页面变得凌乱不堪,碎片化严重,这时,内核如果还是按照需要配分大块连续的内存就会变得很困难,哼,内存规整机制(Memory Compaction)就诞生了.