orange's学习--实模式与保护模式切换

版权声明:原创作者:http://blog.csdn.net/port23 。 欢迎讨论转载,请注明来源: https://blog.csdn.net/port23/article/details/86751150

------------------------------------------------------------
由实模式进入保护模式简单,做好准备条件后,直接far jmp(必须修改CS的值才能修改CS的属性缓冲寄存器)就可以了。
下面总结一下从实模式进入保护模式的主要步骤:
1.  准备GDT(在实模式下设置GDT项目的值,都是线性地址的值,需要按照实模式的方法计算)。
2.  用lgdt加载gdtr。
3.  打开A20。
4.  置cr0的PE位。
5.  跳转,进入保护模式。

仅仅需要
 jmp  写成dword关键字 即可,其实不写也可以,因为一般都是跳转到选择子的0地址。
    ; 真正进入保护模式
    jmp    dword SelectorCode32:0    ; 执行这一句会把 SelectorCode32 装入 cs,
                    ; 并跳转到 Code32Selector:0  处


------------------------------------------------------------
但是由保护模式 跳到实模式比较困难,
我们从实模式进入保护模式时直接用一个跳转就可以了,但是返回的时候却稍稍复杂一些。因为在准备结束保护模式回到实模
式之前,需要加载一个合适的描述符选择子到有关段寄存器,以使对应段描述符高速缓冲寄存器中含有合适的段界限和属性。而
且,我们不能从32位代码段返回实模式,只能从16位代码段中返回。这是因为无法实现从32位代码段返回时cs高速缓冲寄存器中的属性符合实模式的要求(实模式不能改变段属性)。

无论保护模式还是实模式 都有 段描述符高速缓冲寄存器,实模式的段属性和段界限 需要在保护模式下设置成合法的。
新增的Normal描述符,段界限64K,属性DA_DRW,在返回实模式之前把对应选择子SelectorNormal加载到ds、es和ss正好合适。

在实模式下装载段寄存器并不会影响段告诉缓冲寄存器的值,比如段界限(其实在实模式也没有必要改变,应为段界限一直都是0ffffh),这也就是为甚麽所有讲保护模式的树在讲到有保护模式切换到实模式时都要加载一个normal选择子的原因了


实模式的要求:是指实模式下的标准段属性,一般段界限为0FFFFH,段属性为可读写。 

从保护模式进入实模式的主要步骤:
需要新增一个Normal描述符,是16位的代码,
由32位代码跳转到Normal描述符指定的16位代码,设置各个段寄存器
修改cr0寄存器到实模式,
使用jmp far指令修改cs的值(这儿的jmp指令的从源码的角度来看是far jmp,CS段指定的是0,其实是通过修改内存的方式已经保存了实模式的CS段值)

然后再在实模式下关闭A20地址线,回到DOS的中断调用。
 

猜你喜欢

转载自blog.csdn.net/port23/article/details/86751150