前言:段页式的访存的内容还没有结束。。。还有一部分知识,线性地址到物理地址的转换。话不多说,让我们开始吧。
假设页的大小是 4KB,每个页表项占 4B,则理论上一个页表有多大?(虚拟空间大小是 4GB)
页表项数目 = 4 GB / 4 KB = 1 MB
所以,
页表大小 = 1 MB × 4 B = 4 MB
注意!
页的大小是 4KB。也就是说,一个页是放不下的。所以我们要采用多级页表的方式。
(在这里说的是 IA-32 架构,也就是只有两层页表)
线性地址
------> 物理地址
的整体过程如下:
用文字叙述:
在这里一共要介绍 3 种「控制寄存器」
CR0:控制寄存器(转自维基百科)
Bit | Name | Full Name | Description |
---|---|---|---|
0 | PE | Protected Mode Enable | 如果为 1,则系统处于保护模式,否则系统处于实模式 |
1 | MP | Monitor co-processor | 控制 WAIT / FWAIT 指令与 CR0 中 TS 标志的交互 |
2 | EM | Emulation | 如果设置,则不存在 x87 浮点单元,如果清除,则存在 x87 浮点单元 |
3 | TS | Task switched | 仅在使用 x87 指令后才允许在任务切换时保存 x87 任务上下文 |
4 | ET | Extension type | 在 386 上,它允许指定外部数学协处理器是 80287 还是 80387 |
5 | NE | Numeric error | 设置时启用内部 x87 浮点错误报告,否则启用 PC 样式 x87 错误检测 |
16 | WP | Write protect | 设置后,当权限级别为 0 时,CPU 无法写入只读页面 |
18 | AM | Alignment mask | 如果 AM 设置,AC 标志(在 EFLAGS 寄存器中)设置,并且权限级别为 3,则启用对齐检查 |
29 | NW | Not-write through | 全局启用/禁用直写式缓存 |
30 | CD | Cache disable | 全局启用/禁用内存缓存 |
31 | PG | Paging | 如果为 1,则启用分页并使用 CR3 寄存器,否则禁用分页。 |
在本例子中,CR0 寄存器主要用来标明使不使用分页。
CR2:页故障(page fault)线性地址寄存器
存放引起页故障的线性地址。只有在 CR0 中的 PG=1 时,CR2 才有效。
CR3:页目录基址寄存器
保存页目录表的起始地址。只有当 CR0 中的 PG=1 时,CR3 才有效。
这样就完成了访存的所有内容。我们来回顾一下
IA-32中,执行“movl 8(%ebp), %eax” 中取数操作的大致过程如下:
原文:https://www.cnblogs.com/pipci/p/12404023.html