下面继续汇编的笔记,80386的保护模式。
1.描述符长8个字节。按描述的对象来分,有存储段,系统段和门描述符。
存储段是存放由程序可以直接进行访问的代码和数据的段。
要注意8个字节的各个属性域。32位基址和20位的段界限各自分成了两部分存放,
这是为了使80286存储段描述符继续有效。
段属性中的P,DPL,DT,TYPE,G,D,AVL。
P是否有效段。
DPL特权级。
TYPE属性。
G作为粒度标志位,只对段界限有效,对段基址无效,段基址总是以字节为单位。
D符的意义根据TYPE的不同而不同。
AVL是软件可利用位。
于是:
DESCRIPTOR STRUC
LIMITL DW O ;段界限低16位
BASEL DW 0 ;基址低16位
BASEM DW 0 ;基址中间8位
ATTRIBUTES DW 0 ;属性段,含段界限的高4位
BASEH DW 0 ;基址高8位
DESCRIPTOR ENDS
2.GDT,LDT,IDT
描述符表本身可以形成一个特殊的数据段,可含8K个描述符。
GDT实现了段的共享,而LDT实现了段隔离和数据保护。任务间的切换不切换GDT,只切换LDT。
3.段选择子
实模式下,逻辑空间中存储单元的地址由段值和段内偏移组成。
保护模式下,由段选择子和段内偏移组成。
选择子长16位。13位描述符索引,1位引用指示,2位RPL请求特权级。
由于选择子用13位表示�����述符索引,所以可以区分8096个描述符,这就是描述符表最多可含8096个描述符的原因。
4.控制寄存器
CR0,保护控制位PE,PG;mp,ts,et,em.
CR1,保留。
CR2,页异常的线性地址保存。
CR3,页目录表始址。
5.系统地址寄存器
GDTR全局描述符表寄存器(48b)。GDT不能由GDT本身之内的描述符进行描述定义,所以提供了一个寄存器。
LDTR局部描述符表寄存器,规定当前任务使用的局部描述符表LDT。实际上每个任务的LDT作为系统的一个特殊段,
由一个描述符描述,并且描述符存放在GDT中。
IDTR中断描述符表寄存器,指向中断描述符表IDT。
TR任务状态段寄存器,指示描述了当前任务的任务状态段的描述符选择子,从而规定了当前任务的状态段。
6.模式间的跳转
更改CR0的PE位。为访问1M以上的内存空间需要打开A20地址线(92H端口的第二位置一)。
看了几个模式跳转以及32位~16位转换的例子。稍微明白点了。
该贴由koei转至本版2014-5-2 16:13:43