如何从实模式到保护模式?
  2BWqHcq9d41a 2023年12月22日 28 0


如何从实模式到保护模式?_保护模式


在还是16位CPU的天下时,并没有实模式这一说。直到CPU发展到32位,推出保护模式后,为了区别两种模式,便将之前的模式称为实模式。处于向下兼容的考虑,现代的CPU依然保持对16位模式的兼容,刚开机时,32位的CPU是先处于16位的实模式的,而后再进入保护模式。

一、实模式

1. 实模式的特点

1、地址总线只使用了20根,寻址范围为220B=1MB
2、寄存器只使用了16位,所以如果只用单一的寄存器来寻址的话只能访问到216B=64KB的空间。
3、分段,访问内存采用“段+偏移”的方式,即“段基址:段内偏移地址”,而真实的物理地址为段基址*16 + 段内偏移地址,如此便用16位的寄存器访问到了20位的空间(乘以16相当于左移4位)。

2. 实模式的特点

1、程序引用的地址都是真实的物理地址,不安全,也不灵活。
2、程序可随意修改自己的段基址,任意访问改变所有内存。
3、访问超过64KB的内存便要修改段基址。
4、一次只能运行一个程序,浪费计算机资源。
5、只能只用20位的地址线,最大可用内存只有1M,远远不够使用。

二、保护模式

1. 保护模式的特点

1、地址总线使用32位,寻址范围232B = 4G
2、通用寄存器、标志寄存器、指令指针寄存器扩展到了32位,段寄存器没变。
3、仍然采用段基址:段内偏移地址的访问策略,但引入了全局描述符表,由此间接安全的访问内存。

2. 保护模式的优点

相对于实模式,基本上弥补了其缺点,便是保护模式的优点,再此便不细说了。

二、保护模式

为了安全地进行内存访问,引入了全局描述符表,使得段基址:段内偏移地址的访问策略从实模式下对物理地址的直接映射变为保护模式下对全局描述符表的间接映射。
全局描述符表中的表项称为段描述符,用来索引段描述符的东西叫作选择子,储存在段寄存器中。下面将介绍它们的具体结构,大致了解一下,知道什么样子就好,在本文中不太重要。

1. 选择子

如何从实模式到保护模式?_保护模式_02


段描述符索引值共13位,则可以索引213 = 8192个描述符,也就是说全局描述符表中最多可以有8192个描述符。

2. 段描述符

如何从实模式到保护模式?_寄存器_03


这是从网络上找的图,各属性位的意义也已标明。一个段描述符占用8字节,上图的下面32位是低4字节,上面为高4字节,能够看出除了段基址段限长字段之外还有许多属性字段,用来对内存访问进行保护,这也就是为什么用描述符来间接访问内存安全的原因所在。

三、模式过渡

有了上面的铺垫,进入保护模式的过程很简单,只需要三个步骤:

1. 打开A20

地址线编号从0开始,实模式下只用了其中20根即A0~A19,这是因为A20Gate的存在,它可以控制A20地址线的有效性,而实模式下是将A20关闭了的。因此只要打开A20便可突破1M的局限性,访问更大的内存空间。
A20Gate由键盘控制器(i8042芯片)控制,虽然由键盘控制器控制,但实际上与键盘并没有什么关系,这是IBM利用键盘控制器上剩余的输出线来对A20管理控制,物尽其用嘛。

2. 加载GDT

先在操作系统引导程序中创建GDT,再使用lgdt m16&32(m为48位内存数据)指令将m加载到GDTR寄存器,使得CPU知道全局描述符表在哪。

如何从实模式到保护模式?_实模式_04


32位的地址,16位的界限,216 / 8 = 8192,同样说明最多由8192个描述符。

3. 将CR0寄存器PE位置1

CR0寄存器是控制寄存器,大致结构如下:

如何从实模式到保护模式?_实模式_05


如图所示PE位为第0位,置1便进入了保护模式的大门。

四、FAQ

1. 两种模式都采用“段基址:段内偏移”的方式访问内存?

是的,对于IA32架构的处理器都是采用这种方式,这是骨子里的东西。只是实模式下段基址直接就存放在段寄存器中,而保护模式下段寄存器中存放的是选择子,需要用选择子去GDT中索引描述符,在描述符中找到段基址,再组合成“段基址:段内偏移”的形式。
所以保护模式访问内存多了一步寻找段基址再转化的过程,而多这一步便提高了安全性。

2. 有全局描述符表,那局部描述符表?

局部描述符表LDT是CPU厂商为了在硬件层级上原生支持多任务而创建的表,按其设想,一个任务对应一个LDT,切换任务时也要切换LDT。现代操作系统很少有使用LDT的,咱们也不过多介绍。

3. 对于实模式到保护模式的过程还是模糊,具体转化过程到底是怎样的?

三个步骤都有相应的指令,可使用汇编代码直接操作。

A20Gate由i8042控制,则需要对i8042的寄存器进行某些操作或者直接操控0x92h端口来打开。

GDT就像一个大数组,每一个表项为一个结构体,在c等高级语言中很好实现,只是在loader程序中是用汇编语言实现的,本质上并没有区别。创建好GDT之后构建lgdt指令需要的48位内存数据,之后lgdt指令将其加载到GDTR寄存器。

将CR0寄存器PE位置1也是借助相应指令实现的。

下面为一种实现,仅供参考:

如何从实模式到保护模式?_寄存器_06




实模式和保护模式是CPU两种工作模式,只有在开机时CPU工作在实模式,而后的一切工作都是在保护模式下完成的,保护模式相对于实模式的优点如前不必多说。而恰如其名,我们日常进行的计算机工作都是在“保护”下进行的,也正是这样,我们才得以进入丰富多彩的计算机世界。 喜欢本文的朋友欢迎关注公众号Rand_cs,获取更多有关系统方面的精彩类容,旨在进一步揭开系统的面纱,理清系统是如何运转的。

如何从实模式到保护模式?_寄存器_07


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月22日 0

暂无评论

推荐阅读
2BWqHcq9d41a
常用标签