80x86的保护模式

时间:2022-05-20 21:43:16

什么是保护模式?

通过对程序使用的存储区采用分段、分页的存储管理机制, 达到分组使用、互不干扰的保护目的。能为每个任务提供一台虚拟处理器,使每个任务单独执行,快速切换。

所以,内存地址由段基地址、偏移地址构成。

在内存中段怎么描述?

段的描述符:段基地址(32位)、段长度(20位,单位为2^12,即4K)、访问权限, 总计64位。

出于系统的兼容问题,段寄存器都是16位的, 那么如何表示64位的段描述符呢?

通过描述符表:将段寄存器的高13位作为索引来访问该表(描述符表本身也有一个基址,加上这13位的偏移地址), 从而获得64位的段描述符。

描述符表分为两类:

1. GDT是全局描述符表,主要存放操作系统和各任务公用的描述符, 也存放LDT描述符。

2. LDT是局部描述符表, 主主要存放各个任务的私有描述符。

段寄存器:高13位用来指示描述符在描述符表中的索引号, 低两位是表示使用描述符的特权级别。另外一位(TI)是GDT和LDT的信号量,如果TI = 0, 则使用GDT, 如果 TI为1, 则使用LDT。

如何从GDT里找到需要的描述符呢??

芯片上有一个GDT寄存器,是48位,存放着GDT的位置与长度, 对程序员是可见。

先从GDT寄存器中找到GDT的基址,然后从段寄存器中找到需要的描述符的索引值,这样就找到了需要的描述符了。如下图所示:

80x86的保护模式

如何找到LDT上需要的描述符呢??

芯片上也有一个LDT寄存器, 是48位的,存放着LDT在GDT里的索引值与。

先从GDT寄存器里找到GDT的基址,再从LDT寄存器里找到LDT的索引值,这样就找到了LDT的描述符, 也就找到了LDT的基址了,然后从段寄存器里找到需要的描述符的索引值 ,这样就找到了需要的描述符了。如下图所示:

80x86的保护模式