深入理解Linux内核之内存管理

这篇博客详细解析了Linux内核的内存管理,包括页框管理、非一致性内存访问(NUMA)和内存区管理。页框管理中介绍了4KB页框作为分配单元,以及页描述符page的引用计数和状态标志。NUMA部分解释了如何优化CPU对内存的访问。内存区管理则涉及到不同类型的管理区,如DMA、KERNEL和HIGHMEM,以及如何处理硬件限制。此外,还讨论了保留的页框池、分区页框分配器和伙伴系统算法在内存分配中的作用。

我们的物理内存中的某些部分永久的分配给内核,并用来存放内核代码以及静态的内核数据结构。其余的部分我们称为动态内存,这不仅是进程所需要的宝贵资源,也是内核本身所需要的宝贵资源。下面通过三部分来描述内核如何给自己分配动态内存,尽可能做到当需要时分配,不需要时释放。

页框管理

采用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个用于描述页框状态的标志。、

非一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值