在linux0.11中对内存的管理是以页为单位的,一个页面是指连续的4K字节物理内存。
通过页目录和页表项可以寻址或管理指定的页面。
内存管理的主要功能
虚拟地址–>物理内存
在8086CPU中,程序寻址使用的是由段选择符和偏移地址构成的地址,这个地址并不能直接寻址物理内存,因此被称为虚拟地址。
虚拟(逻辑)地址首先通过分段管理机制首先变换成CPU32位线性地址(称作中间地址)
- 实际函数中操作的地址为当前进程数据段的段内偏移,然后会根据该段的段基址和段内偏移确定一个线性地址
然后利用分页管理机制将此线性地址映射到物理地址。
- 分页机制会将线性地址分为页目录项、页表项、和页内偏移三部分。利用这三部分确定该线性地址指向的实际物理地址
分页管理机制
一个系统中可以同时存在多个页目录表,在linux0.11中只使用了一个页目录表,当前页目录表用寄存器CR3来确定。
- 页目录(占用一页内存)中每个页目录项(4字节)用来寻址一个页表
- 页表(占用一页内存)中的每个页表项(4字节)用来寻址一页物理内存页
- 所以我们可以用一个页目录项和一个页表项确定一个对应的物理内存页。
- 因为每页为4K字节,所以页目录=页表=4K字节
- 而页目录和页表中每项占4字节,所以页目录和页表中最多有1024项
- 所以一个页目录最多寻址:1页目录×1024页表×1024页表项×4K字节页大小 = 4G的内存空间
为了使用分页管理机制
一个32位的线性地址如下图被分为了三个部分
三部分分别寻址页目录项、寻址页表项、和代表页偏移地址。从而能寻址到线性地址指定的物理内存位置。
页表项结构如下图
31~12位为页的物理起始地址,因为每个页的物理地址都应为4K(0x1000)的整数倍,所以低12位地址恒为0,这里在页表项中用来做一些标志位。
1/0 | |
---|---|
P页面存在于内存标志 | 存在/否 |
R/W | 读/写 |
U/S | 用户/超级用户 |
A页面已访问 | 是/否 |
D页面内容已修改 | 是/否 |
以上部分图片出自《linux内核完全注释》