内核内存管理
系统内存布局——内核空间和用户空间
虚拟地址空间
-
大小:4G(32位系统)
-
分割为内核空间虚拟地址和用户空间虚拟地址
-
分割方式:用户空间为较低的3GB虚拟地址空间,内核使用剩余的1GB
-
内核地址在地址空间的起始位置的默认值:0xc0000000,
此值可以修改:X86:0xc0000000, ARM:80000000 -
访问内核空间地址需要特权模式
-
常见布局
.------------------------0xffffffff(4GB)
内核空间地址
.------------------------CONFIG_PAGE_OFFSET 0xc0000000
用户空间地址.------------------------00000000
-
每个进程共享地址空间的原因:将内核的虚拟地址映射到每个进程的虚拟地址空间能够避免每次进入或退出内核时内存地址切换产生的开销
-
内存管理单元将内存分为大小固定的单元——页面,一个页面包含4096字节(4KB)
虚拟地址和物理地址的映射
-
内存页、虚拟页:长度固定的连续虚拟内存块
-
帧(页面帧):固定长度的连续物理内存块
-
页面表:用来存储虚拟地址和物理地址之间映射
-
内存与页面对齐:内存地址正好从页面的开头开始。
地址是系统页面大小(4096)整数倍的所有内存都称为与页面对齐
内核地址——低端和高端内存
-
低端内存:内核地址空间的第一个896MB空间
内核空间中存在逻辑地址的内存
逻辑地址:线性映射到物理地址上的内核空间中的地址,可以用偏移量或位掩码将其转换为物理地址 -
高端内存是指超过896MB的那部分,内核用它临时映射1GB以上的物理内存。
虚拟内存地址访问
- 虚拟内存地址构成:虚拟页码和偏移量
- 访问虚拟内存对应的物理内存:
- 提取偏移量和虚拟页码
- 遍历进程的页面表
- 匹配虚拟页码和物理页面,访问该页面帧中的数据
- 根据偏移量找到帧中正确的位置
页面分级
N级中的每个表项将指向N+1级表中的项
四级分页模式
- 页面全局目录(PGD):每个进程只有一个PGD,最多包含1024项
- 页面上部目录(PUD)
- 页面中间目录(PMD)
- 页面表(PTE)
页面查找和TLB
- 转换后备缓冲器(TLB):缓存最近访问的虚拟页面的PTE
每次内存访问时,MMU首先检查TLB中最近使用过的页面, - TLB查找:访问虚拟内存时,CPU遍历TLB,试图找到正在访问页面的虚拟页码
- TLB命中:当找到TLB项时