我们的物理内存中的某些部分永久的分配给内核,并用来存放内核代码以及静态的内核数据结构。其余的部分我们称为动态内存,这不仅是进程所需要的宝贵资源,也是内核本身所需要的宝贵资源。下面通过三部分来描述内核如何给自己分配动态内存,尽可能做到当需要时分配,不需要时释放。
页框管理
采用4KB页框大小作为标准的内存分配单元。
在以下情况下页框是不空闲的:包含用户态进程的数据,某个软件高速缓存的数据,动态分配的内核数据结构,设备驱动程序缓冲的数据,内核模块的代码等等。
页框的信息保存在一个类型为page的页描述符中。所有的page存放在一个mem_map数组中。每个描述符长达为32字节,所以mem_map所需要的空间略小于整个物理内存大小的1%。
virt_to_page(addr)宏产生线性地址对应的页描述符地址。就是将虚拟地址转换为物理地址。
pfn_to_page(pfn)宏产生和页框号pfn(page frame number)对应的页描述符地址。获取页框号的物理地址。
页描述符page中包含有一个_count字段,为页的引用计数器。如果为-1,那么说明该页框空闲,可以被分配给任何一个进程或者内核本身;如果大于0或者等于0,则说明页框被分配给了一个或者多个进程,或者用于存放一些内核数据结构。page_count函数就是返回这个count的值加1,也即是该页使用者的数目。
flags字段包含多达32个用于描述页框状态的标志。、