保护模式是通过对程序使用的存储区采用分段分页的存储管理机制,达到分级使用,互补干扰的保护目的,为每个任务提供一个虚拟的处理器,使每个任务可以单独执行,而不是像实模式一样,只有一个处理器。
以32位处理器为例,8个通用寄存器分别是eax,ebx,ecx,edx,esi,edi,栈顶寄存器esp,栈帧寄存器ebp。还有指令寄存器eip,以及六个段寄存器,CS代码段地址寄存器,存放代码段的起始地址,DS数据段地址寄存器,存放数据段的起始地址,SS堆栈段地址寄存器,存放堆栈段的起始地址,ES附加段地址寄存器,存放附加段的起始地址,FS是32位新增的辅助段,GS是32位新增的辅助段。
段选择子在段描述符的存储表中找到段对应的基地址,然后基地址加上段中的偏移地址,就是资源在内存中的物理地址。
保护模式的作用就是,分清不同任务使用的存储区域,不允许随便使用其它任务的数据和代码,每个任务都有自己独立的段。
必要条件:要标记每段存储区的所有者或被使用的权限级别,要标记使用者是谁,CPU判断此次访问是否合法。
每个段描述符由,段基地址(32位),段长度(20位,段长度单位是2的12次方),访问权限,所以段描述符的长度为64位。因为段寄存器只有16位,所以用段描述符表来存储描述符,段寄存器的高13位作为索引来访问此表,获得64位的段描述符。
GDT全局描述符表,主要存放操作系统和各任务公用的描述符
GDTR 48位高32位存放GDT基址,低16为存放GDT限长。
LDT局部描述符表,主要存放各个任务的私有描述符
LDTR 16位,高13为存放LDT在GDT中的索引值。
段寄存器高13位用来存放描述表的索引号,低2位表示使用描述符的特权级别,中间一位表示该描述符从GDT还是LDT找,0表示GDT,1表示LDT。
具体过程,首先是通过GDTR找到GDT的地址,并获取GDT长度,然后通过LDTR的高13位作为索引,找到任务在GDT中的描述符,通过该描述符,获取任务的LDT地址,最后,通过段寄存器的高13位作为索引在任务的LDT中找到描述符,得到段基地址,最后用段基地址加上偏移地址,计算出资源的物理地址。下图为此寻址过程的图示。