-
-
[原创]1.滴水中级班(内核驱动)——保护模式
-
发表于: 2025-9-18 00:08 455
-

操作系统都是运行在保护模式下的

保护模式通过两种机制:1.段的机制。2.页的机制。通过上面两个机制来达到保护的目的,主要保护系统的数据结构如GDT表、IDT表还有一些关键的寄存器比如CR0寄存器。我们学习保护模式主要就是学习什么是段的机制,什么是页的机制,在后面学习的时候就称为段和页。
1.段寄存器


其中这里的ds实际上就是一个段寄存器,同样的还有ss,这个base就是段寄存器里面的一个成员。段寄存器一共有8个,在OD里面可以看到右侧面板里的ES、CS、SS、DS、FS和GS,这里还需要额外记住的就是LDTR和TR这两个寄存器


段寄存器的结构比较复杂,段寄存器是96位的,但是可见部分只有右边的16位,还有80位是不可见的,

依旧是回到OD里面,可以看到每个段寄存器后面都有四个十六进制数,由于我们能看到的只有右边的16位,又因为一个字节是8位,一个十六进制数是4位,所以16位=2字节=4个十六进制数,所以每个段寄存器后面有四个十六进制数

段寄存器的结构体表示如上图所示。我们到后面会慢慢解释,这里先提一嘴:这个16位的Attributes是属性的意思,表示当前的段寄存器是可都得、可写的还是可执行的;这个32位的Base指的是当前的段是从哪里开始的;这个32位的Limit指的是当前的段的整个长度有多少。

接下来演示一下对段寄存器的读与写,很多教材上说段寄存器只有16位,其实这个说法是错的,真正的说法的段寄存器的可读部分只有16位,我们在读的时候只能读它的可见部分,所以读的时候,前面要给一个16位的寄存器。接着是写寄存器,注意写的时候是96位的,换而言之,读的时候只能16位,但是写的时候是96位。

答案:1.每个段寄存器都有一个你看不到的、与之关联的描述符高速缓存器 (Descriptor Cache) 或者称为影子寄存器 (Shadow Register)。这个缓存器有80位(在32位和64位模式下)。所以,所谓的“96位”实际上是:16位可见的选择子 (Visible Selector)和80位不可见的描述符高速缓存器 (Invisible Descriptor Cache),总共 16 + 80 = 96位。