---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)深入浅出操作系统 - 目录
文章目录
1. x86系列处理器上的页式内存管理
- 硬件层面 直接支持内存分页机制
- 默认情况下不使用分页机制(段式内存管理)
- 分页机制 启动后,使用 二级页表 对内存进行管理
1.1 x86系列处理器的分页方式(32位)
- x86分页机制示意图
- 一些小结论(对应上图中的10、10、12):
- 页目录大小:
2 ^ 10 = 1024 项(也即多少个页表),每项4字节,共计2^10 * 4 = 2^12 = 4KB
- 子页表大小:
2 ^ 10 = 1024 项(也即多少个页面),每项4字节,共计2^10 * 4 = 2^12 = 4KB
- 页大小:
2 ^ 12 = 4KB
- 页目录大小:
- 一些重要结论(针对32位 x86 处理器)
- 页目录占用1内存页(可访问1024个子页表)
- 单个子页表占用1内存页(可访问1024个页面)
- 页面起始地址按4K字节对齐(总是4096整数倍)
- 分页后可访问的虚拟内存空间为:
( 1024 * 1024 ) * 4KB = 4GB
1.2 最简单的分页构建方式
1.3 x86系列处理器上的页属性
- 由于物理页面的地址必须按照4K字节对齐
- 因此,页目录(页表)可使用地址的低12位进行属性描述
1.4 x86对分页的硬件支持
- 将 cr3 指向页目录地址(可切换不同的页目录)
- 将 cr0 最高位设置为1(硬件级开启分页机制)
1.5 汇编小贴士
- loop
- 循环指令,将 cx 减 1,若 cx 不为 0,则执行标签处代码
mov ax, 0
mov cx, 10
label:
add ax, cx
loop label
- stosb、stosw、stosd
- 把 al、ax、eax 中的值存储到 edi 指向的内存单元中
- 同时 edi 的值根据方向标志增加或者减少(cld增加、std减少)
mov es, ax
mov edi, 0
mov eax, 0xFF
cld
stosd
; [es:0] --> 0xFF
; edi --> 4
2. 编程实验:x86处理器上的分页实现
2.1 stosd
【参看链接】:27 - x86系统上的内存分页 / 27 / 00
2.2 分页实现
【参看链接】:27 - x86系统上的内存分页 / 27 / 01
- 设置页目录
- 设置子页表
3. 小结
- x86处理器直接支持内存分页机制(默认关闭)
- 分页机制启动后 ,使用二级页表对内存进行管理
- 页目录和单个子页表占用1内存页(4K内存)
- 页面起始地址按4K字节对齐
- 分页后可访问的虚拟内存空间为4G