实模式和保护模式
实模式
-
特点
- 20位分段内存
- 不支持内存保护
- 最早期8086 CPU的工作方式
- 数据总线16位
- 一次最多取
2 ^ 16 = 64KB数据 - 这也是每个段的极限大小
- 一次最多取
- 地址总线20位
- 刚好有
2 ^ 20 = 1MB寻址空间
- 刚好有
- 所有寄存器都是16位
- 数据总线16位
-
【问题来了】16位寄存器,怎么做到地址总线20位?
-
【答案】利用分段
- 方法
- 用另一个寄存器设置段基地址
- 计算时自动左移4位(即取最高4位),跟偏移地址组合起来
- 例子
jmp f000:e05b - 算法
(f000 << 4) + e05b = fe05b - 解释
-
这里段基地址为f000 即1111 0000 0000 0000
-
左移4位后得到f 0000 即1111 0000 0000 0000 0000
-
低16位跟e05b相加即可
-
- 方法
保护模式
-
特点
- 均升级为32位,最大4GB寻址空间
- 支持内存保护
- 从80826 CPU开始采用保护模式,但也向前兼容了实模式
-
【问题来了】保护模式如何做到宣称的64TB虚拟地址空间?
-
【答案】利用 段选择符 指向 段描述符,得到其中的32位的段基地址,然后跟偏移地址组合起来
-
逻辑地址
- 组成为:高16位段选择符 + 低32位段内偏移地址
-
段选择符
- 总长16位
- 组成:13位索引 + 1位TI + 2位RPL
索引:指向段描述符TI- 0表示从GDT全局描述符表去找
- 1表示从LDT局部描述符表去找
- 每个表有
2 ^ 13 = 8192个索引 (GDT+LDT两个表就是16384个) - 这样虚拟地址空间就是
16384 * 4GB = 64TB
-
例子
jmpi 0, 8中的8就是段选择符- 8的二进制低4位表示为
1000 - 解释为
1 0 00 - 表示到GDT找第2个段描述符 (因为从0开始计数)
-
段描述符
- 总长64位,其中32位是段基地址
- 后面拼接逻辑地址中的32位段内偏移地址,生成线性地址
- 总长64位,其中32位是段基地址
-