Linux 内存管理:从页帧到非连续内存区域
1. 动态内存管理概述
在操作系统中,动态内存是一种宝贵的资源,不仅进程需要,内核自身也需要。系统的整体性能在很大程度上取决于动态内存的管理效率。因此,现代多任务操作系统都致力于优化动态内存的使用,仅在需要时分配,并尽快释放。
2. 页帧管理
Linux 采用 4KB 的页帧大小作为标准内存分配单位,主要有两个原因:一是分页电路发出的页错误异常易于解释;二是 4KB 是大多数磁盘块大小的倍数,能使主内存和磁盘之间的数据传输更高效,且比 4MB 大小更易于管理。
2.1 页描述符
内核需要跟踪每个页帧的当前状态,这些状态信息存储在类型为struct page的页描述符中,所有页描述符都存储在mem_map数组中。页描述符的部分重要字段如下:
| 类型 | 名称 | 描述 |
| ---- | ---- | ---- |
|struct list_head|list| 包含指向页描述符双向链表中前后项的指针 |
|struct address_space *|mapping| 当页插入页缓存时使用 |
|unsigned long|index| 页中数据在磁盘映像中的位置或换出页的标识符 |
|atomic_t|co