内核的内存管理不同于用户空间的内存管理,首先来讲内核本身的限制点就比较多,比如内核一般不能睡眠,因此处理内存错误一般来讲是件很困难的事情,再加上其他限制以及内核内存机制不能太复杂导致想获取内核内存变成了一件难事。
一、页
在说内核的内存管理机制之前,首先我们得明白内核内存管理的基本单位才行,一般来讲内核都是以页为单位对内核进行内存管理的,正因为如此MMU(管理内存并把虚拟地址转换为物理地址的硬件)以页为单位来管理系统中的页表,从虚拟内存的角度来看,页就是最小单位。
内核中一般用struct page这个结构体来表示系统中的每个物理页,
这里我只说其中两个域的作用,_count域,相当于页的引用计数,当改计数不为0时则证明该页被引用了多少次,当其值为0时说明当前内核并未使用改页,该页就变为了空闲页。virtual域,这是个很有意思个人感觉也很重要的域,因为它就是在虚拟内存中该页的地址,换句话说就是记录了映射关系的东西。但在有些情况下有些内存并不永久的映射到内核的地址空间上,这个域的值为NULL,需要的时候必须动态映射的这些页。这指的就是内核中的高端内存。