操作系统保护模式
保护模式
cpu有两种工作模式:实模式和保护模式。当我们打开cpu的时候,cpu是在实模式下工作的,经过某种机制,才进入到保护模式。在保护模式下,cpu有更好的寻址能力,为32位操作系统提供服务。
从16位到32位操作系统
在16位操作系统下,寻址是依靠段加偏移的,从而达到1MB的寻址能力,段时地址的一部分,由cs,ds等寄存器保存。
但是在32位操作系统下,一个寄存器就有4GB的寻址能力,但是段还是被保留了下来,不过段值寄存器表示的不再是段值,而是一个索引,这个索引只想一个数据结构表的表项。这个表就是GDT(global
descriptor table)全局描述符表。
GDT
GDT:全局描述符表,存放段描述符,每个段描述符占8字节,共8192个段描述符,每个段描述符对应一个段,段的大小由段描述符的基地址和限长决定。
Descriptor:描述符,是GDT中的一个表项。
GDTPtr:GDT指针,是一个48位的寄存器,高16位是GDT的限长,低32位是GDT的基地址。 既然如此,我们如何将段寄存器和描述符对应起来呢
答案是通过选择子(selector)
Selector:选择子,是一个16位的寄存器,高13位是索引,低3位是RPL(请求特权级),RPL是用来判断当前进程的权限,0是最高权限,3是最低权限。索引是在GDT中的一个偏移。如
1
SelectorVideo equ LABEL_VIDEO - LABEL_GDT
从实模式到保护模式
1. 设置GDT
将需要的物理地址赋值给到段描述符中。|初始化descriptor
将GDT物理地址赋值给GDtPtr数据结构, 初始化GDTPtr
然后将GdtPtr中的数据加载到gdtr寄存器中。| 初始化gdtr
2. 关闭中断
因为保护模式下中断处理机制是不同的所以要关中断。
3. 打开A20地址线
20位地址线只能访问1MB的内存,打开A20地址线可以访问4MB的内存。这是为了在80286(可以访问4MB),下兼容8086(访问1MB)。A20默认是关闭的,打开后,就可以访问4MB的内存。开关是通过8042键盘控制器来控制的,
可以通过操作操作端口92h来实现。
4. 设置cr0寄存器
cro寄存器的第0位是PE位,此位0表示实模式,1表示保护模式。设置为1,进入保护模式.
在设置完后cpu就进入保护模式了,但是cs的值仍然是实模式下的值,需要将代码段的选择子装入cs。
5. 设置cs
1 |
|
会把 SelectorCode32 装入 cs,并跳转到 Code32Selector:0 处
从保护模式到实模式
1. 将normal selector装入ds,es,fs,gs,ss
以使对应段描述符高速缓冲寄存器中含有合适的段界限和属性 ### 2. 设置cr0寄存器为0
3. 跳转回实模式
jmp cs_real_mode:LABEL_REAL_ENTRY