一些预备知识:
段描述符:描述一个段的属性和保护模式下其他参数的数据(基址,限长,优先级),一个段描述符占8B
GDT:全局描述符表,包含系统中所有任务都可用的段描述符,通常包含描述操作系统所用的代码段,数据段和堆栈段的描述符以及各任务的LDT段。
LDT:局部描述符表,每个任务都有一个独立的LDT,它包含每个任务私有的代码段,数据段,堆栈段的描述符和该任务所使用的一些门描述符。
虚拟地址格式表示为: xxxx:yyyyyyyy
xxxx表示段选择器中的内容,共16位,高13位为段描述符位置索引,低3位其他用途
yyyyyyyy表示段内偏移地址
计算线性地址,首先找到段基址,最后加上段内偏移。
段基址的计算分成两种情况:
1)先从GDTR寄存器中获取GDT的基址
2)段描述符的位置=GDT基址+段选择器中索引值*8B
3)从段描述符中得到段基址
1)也是从GDTR中获取GDT基址
2)从LDTR中获取LDT所在段的位置索引,记S
3)此LDT的段描述符位置=GDT基址+S*8B
4)从此段描述符中获取LDT基址,记A
5)最终的段描述符位置=A+段选择器中索引值*8B
6)从最后的段描述符中得到段基址
如果 段基址 + 段内偏移 < 段限
则 线性地址 = 段基址 + 段内偏移
80386新增控制寄存器CR0,第32位(位31)PG位控制是否启用内存分页机制。PG=1时启用,线性地址需通过地址映射机制转换成物理地址。PG=0时不启用,线性地址就是物理地址。
(未完待续...)
"门":指向某个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,进入门所规定的入口点。
IDT:中断描述符表,每个描述符占用8B,包括门的种类和中断服务程序入口地址,IDTR中高32位为IDT在内存中的基址(线性地址),低16位为IDT长度(相当于指定了中断数量)
windows使用DLL来代替中断服务程序提供系统功能,所以win32汇编中int指令失去意义,调用API的指令就相当于使用int指令完成系统功能。虽然80x86处理器设置了4个优先级(0~3级),0为特权级,3为用户级,为了便于移植到Alpha计算机,windows只支持0,3两个优先级。
(未完待续...)