1. 三种地址
- 逻辑地址:
- 实模式下由"段基地址+段内偏移"组成
- 保护模式下由 段选择符+端内偏移组成
- 线性地址: 逻辑地址经过分段机制后形成的线性地址, 它是平坦的; 若不启动分页, 则线性地址就是物理地址
- 物理地址:线性地址经过分页转换后形成的地址
2.实模式寻址方式
8086CPU数据总线为16位,也就是一次最多能取2 ^ 16 = 64KB数据,这个数据也解释了实模式下为什么每个段最大只有64KB。
其地址总线为20位,这样它能寻址的能力其实是2 ^ 20 = 1MB
如何用16位寄存器实现1MB寻址能力?
分段. 8086CPU将1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示段基地址由16位段寄存器值左移4位表达,段内偏移表示相对于某个段起始位置的偏移量(最大寻址为64kB即2^16bit)
3.保护模式寻址
3.1 分段机制
段选择符为16位,它不直接指向段,而是通过指向的段描述符,段描述符(一会介绍)再定义段的信息。下图为段选择符的结构
- TI用来指明全局描述符表GDT还是局部描述符表LDT,RPL表示请求特权级,索引值为13位
- 在保护模式下最多可以表示2^13=8192个段描述符, 而TI又分GDT和LDT(如图3所示),所以一共可以表示81922=16384个段描述符,
- 段内偏移地址为32位值,所以一个段最大可达4GB,这样163844GB=64TB,这就是所谓的64TB最大寻址能力,也即逻辑地址/虚拟地址
- 在保护模式实际编程中,如下一条语句:jmpi 0, 8。其中的8即段选择符,8的二进制表示为:0000 0000 0000 1000b,所以这条语句的意思是跳转到GDT表(TI=0)中的第2个(段描述符表从0开始编号,所以这里的1指表中的第2个)段描述符定义的段中,其段内偏移为0。