实模式和保护模式
一、背景
以80x86电脑说,一开始的8086/8088系列的地址总线只有20位,所以只有1M的地址空间。通过“段基址:偏移”的方式,就可以获得实际的物理地址。
但是这种方式不安全:用户程序可以修改系统程序的内存或者其他用户程序的内存;而且内存太小了。
随着硬件的发展,后来出现了32位甚至64位的机器,地址总线就有32位或64位,地址空间可以扩展到4GB甚至更大。所以后来就出现了保护模式。保护模式可以对每个进程的内存使用进行限制,更加安全;保护模式有更大的内存空间,可以支持多进程;保护模式的内存分段、分页管理机制,为实现虚拟内存提供了硬件支持。
二、实模式
实模式的最大寻址空间为1MB。
一开始8086/8088系列的地址总线有20位,寄存器只有16位。如何用16位的寄存器表示20位的地址呢?
既然一个寄存器无法表示,那就用两个寄存器吧。前一个寄存器(段寄存器)表示在内存中的哪一段,后一个寄存器表示在这一段中的偏移地址。计算方式为:
段地址<<4 + 偏移地址 = 物理地址
段地址左移4位加上偏移地址,这样就得到了实际的物理地址。
三、保护模式
保护模式下,程序员指定逻辑地址,用16位段寄存器和32位寄存器来表示。但是这时段寄存器里面保存的值,不再是段基地址,而是一个选择子(Selector)。操作系统根据这个选择子的值,来算出段基地址,再和偏移地址相加,就是实际的物理地址。操作系统根据段寄存器里面的值,来查GDT表(Global Descriptor Table,全局描述符表)或者LDT(Local Descriptor Table,局部描述符表)表,来获得段基地址。
此时,段寄存器里面的16位,意义如下:根据2位TI确定查GDT表还是LDT表,然后根据3-15位的索引值来查表。
以GDT表为例,它首先是一个表,存放了很多表项,每一项由 基地址、界限、访问权、附加字段 组成。
基地址 | 界限 | 访问权 | 附加字段 |
---|---|---|---|
段的起始地址 | 段的长度 | R/W等 |
根据这个表,我们就得到的基地址,加上偏移地址,最终就可以得到真正的物理地址了。