1 问题的由来
在学习操作系统引导启动程序部分,看到寻址模式由实模式切换到保护模式,不知道它们二者有何区别。
2 实模式
对于8086/8088这类16位处理器,寄存器都是16位的。
而8086/8088CPU有20根地址总线,即寻址空间可以达到220 = 1M。
然而16位的寄存器只能组合出216 = 64K个地址。
于是使用两个16位寄存器来寻址:一个寄存器叫段寄存器;另一个寄存器叫偏移寄存器。
内存地址 = 段寄存器<<4 + 偏移寄存器的值。
例如段寄存器 = 0x500,偏移寄存器的值是0x100;则内存地址为0x5100。
段寄存器与偏移寄存器的组合方式如下表所示。
CS:IP | 指向指令的位置 |
SS:SP | 指向栈顶 |
SS:BP | 可指向整个栈 |
DS:偏移量 | 指向数据段 |
ES:偏移量 | 指向附加段 |
3 保护模式
首先保护模式是针对32位CPU的,32位的CPU寻址空间达到232 = 4G。
实模式下,可访问内存中的任何一个位置,不安全。
为了限制每个段的访问空间,设置了一个表。表的名字为GDT(Global Descriptor Table 段描述符表),表里有很多表项,每个表项8个字节。
下图为一个表项的信息。
一个段就有一个相应的表项来限制它。
保护模式下:内存地址=段基址+偏移地址。
4 疑问
如今的CPU都是64位了,寻址模式是什么?
参考
CPU的实模式和保护模式(一)
https://zhuanlan.zhihu.com/p/42309472
「学习笔记」对实模式/保护模式的三种访问内存机制的理解
https://www.cnblogs.com/bEngi1/p/12173719.html
汇编学习1--寄存器学习