保护模式与实地址模式相对应。在80286以前,CPU只有实时模式,地址总线有20位,而内存地址是16位,也就是最多能够访问2^20=1M的内存空间。在80286及以后,内存地址改为16位或32位,至少可以访问到2^32=4G的内存空间。但为了保证后续的CPU能够运行旧的CPU,只能保持向下兼容。因此,80286及以后的CPU首先进入实模式,然后通过切换机制再进入到保护模式。
在保护模式下,段是通过一系列被称之为“描述符表”的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT) 和局部描述符表(LDT)。
GDT:是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符。在实模式中,段长是固定的(为64KB),而在保护模式中,段长是可变的,其最大可达4GB。
LDT:是段描述符的一个数组。与GDT不同,LDT是一个段,其中存放的是局部的、不需要全局共享的段描述符。每一个操作系统都必须定义一个GDT,而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节,当段寄存器被加载的时候,段基地址就会从相应的表入口获得。
以80386为代表,段寄存器得到的不是段基地址,而是段描述符表的下标,及当前是处于内核态还是用户态,有权限的控制。通过查段描述符表可以得到基地址,然后段的基地址+偏移量=线性地址。此处得到的线性地址并不是直接作用于物理地址 ,而是通过分页的方式,将线性地址在映射到物理页面再到的物理地址。
32位线性地址转为物理地址:
32位分为:
页目录索引:占最高10位,指示页目录表中第几个页表描述符
页表索引:是10位。指示这页表中第几个页描述符
页描述符:线性地址的低12位为页内偏移量。