操作系统保护模式

保护模式

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
jmp dword selector_code:0

会把 SelectorCode32 装入 cs,并跳转到 Code32Selector:0 处

从保护模式到实模式

1. 将normal selector装入ds,es,fs,gs,ss

以使对应段描述符高速缓冲寄存器中含有合适的段界限和属性 ### 2. 设置cr0寄存器为0

3. 跳转回实模式

jmp cs_real_mode:LABEL_REAL_ENTRY

4.重新设置段寄存器的值,关闭A20地址线并打开中断


操作系统保护模式
https://jfsas.github.io/2024/09/29/操作系统保护模式/
作者
JFSAS
发布于
2024年9月29日
许可协议