主要记录一些概念,大部分是看<orange's一个操作系统的实现>不理解的地方
就从代码的最开始看起
GDT (Global Descriptor Table)
GDT是全局描述附表,主要存放操作系统和各任务公用的描述符,如公用的数据和代码段描述符、各任务的TSS描述符和LDT描述符.由8字节表示.具体含义这里暂时先不列出。
在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限.
LDT是局部描述符表,主要存放各个任务的私有描述符,如本任务的代码段描述符和数据段描述符等。一个cpu对应一个gdt,但可以有多个LDT。GDT相当于一级表,而LDT包含在GDT中的二级表。
LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。LDTR记录局部描述符表的起始位置,与GDTR不同LDTR的内容是一个段选择子。由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。LDTR可以在程序中随时改变,通过使用lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。举个例子:如果我们想在表LDT2中选择第三个描述符所描述的段的地址12345678h。
1. 首先需要装载LDTR使它指向LDT2 使用指令lldt将Select2装载到LDTR
2. 通过逻辑地址(SEL:OFFSET)访问时SEL的index=3代表选择第三个描述符;TI=1代表选择子是在LDT选择,此时LDTR指向的是LDT2,所以是在LDT2中选择,此时的SEL值为1Ch(二进制为11 1 00b)。OFFSET=12345678h。逻辑地址为1C:12345678h
3. 由SEL选择出描述符,由描述符中的基址(Base)加上OFFSET可得到线性地址,例如基址是11111111h,则线性地址=11111111h+12345678h=23456789h
4. 此时若再想访问LDT1中的第三个描述符,只要使用lldt指令将选择子Selector 1装入再执行2、3两步就可以了(因为此时LDTR又指向了LDT1)
由于每个进程都有自己的一套程序段、数据段、堆栈段,有了局部描述符表则可以将每个进程的程序段、数据段、堆栈段封装在一起,只要改变LDTR就可以实现对不同进程的段进行访问。
selector(段选择子)虽然从386开始cpu进入到32位的时代,但是地址依然用“段:偏移”这样的形式来表示。实模式下,段值还可以看成是地址的个部分,比如段值为xxxxh表示以xxxx0h开始的一段内存。保护模式下,段值仍然由原来的16位cs,ds等寄存器表示,但这时的它仅仅是一个索引,索引指向一个数据结构的一个表项,表项中定义了段的起始地址,界限和属性等内容。这个数据结构就是gdt. T1代表这个段是GDT(0)还是LDT(1),RPL请求级别(内核0,服务1,2,应用程序3)4个级别,来避免低特权级的任务在不被允许的情况下访问位于高特权级别的段。
例如给出逻辑地址:21h:12345678h转换为线性地址
a. 选择子SEL=21h=0000000000100 0 01b 他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1
b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。其中32位的基址是指GDT在内存中的地址。
LDTR是局部描述符寄存器,由一个可见的16位寄存器(段选择子)和一个不可见的描述符寄存器组成(描述符寄存器实际上是一个不可见的高速缓冲区)。CPU在操作系统任务切换的时候,会将当前任务的LDT段选择子读取到LDTR中,为了提高性能同时也会将LDT中对应的数据直接读入到对应的高速缓冲中。
LDT,GDT表中最大数据:因为table limit和segment limited都是16位的,所有最多存贮64K的数据,而每个段描述符占8 BYTE,所以每个GDT或者LDT最多能存贮8192个段描述符
IDTR: 中断描述符表寄存器
用来存储指向IDT的地址和数据结果的大小。和GDTR的结构相同。
逻辑地址与线性地址的终极转换
参考抄袭:
http://hi.baidu.com/guoxiabin/item/adb915688441f0167ddecc9c
http://www.cnblogs.com/chenglei/archive/2009/08/11/1544016.html