orange's一个操作系统的实现--学习过程 第三章:b 从保护模式切换到实模式的一点理解

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

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


实模式的要求:是指实模式下的标准段属性,一般段界限为0FFFFH,段属性为可读写。 
用于返回实模式的代码段的段界限必须为0FFFFH,不能为实际长度,否则要么在跳转到实模式的时候出错要么在跳转到实模式后执行int 21H出错。
(个人推测原因如下:80286开始为每个段寄存器增加了段描述符高速缓冲寄存器,而这些缓冲寄存器对于程序员是不可见的,且在实模式下是不能修改的,要想改变这些高速缓冲寄存器的值必须通过在保护模式下修改相应的段寄存器的选择子来实现,这也是为什么在返回实模式之前必须把DS、ES、FS、GS、SS设置为规范段的原因。但是CS是一个特殊的段,不能通过常规方式修改,只能通过段间跳转修改,而一旦跳到实模式后又不能修改了,所以就要求在返回实模式的段的段描述符必须符合实模式下的要求。实模式下的段长度是0FFFFH,也就是64K,如果用于返回实模式的段的段界限不是0FFFFH,会导致返回实模式后实模式下的CS段的高速缓冲寄存器的段长度还是保护模式时的段界限值,这是不正确的,所以要求用于返回实模式的段的段界限必须是0FFFFH。) 
 

一开始我觉得从保护模式应该就是设置一下cr0就回到实模式了,但是书上描述比较复杂。
从保护模式到实模式转换的过程为从某个保护模式下的函数中跳到16位下,在16位模式下要做的工作是设置各个段寄存器和设置CR0,(此处需要特别特别注意的是段寄存器中的选择子必须是要定义在GDT中的,而且其段界限必须为0xffff,否则仍然可以跳回实模式,但是会有段界限异常),然后再跳到最开始引导的段中关A20和开中断(sti),之所以还要跳回最开始的引导段,是因为需要用jmp设置cs。


问题1:
跳回实模式前,设置ds、es、fs、gs、ss有什么作用,跳回实模式之后又设置了ds、es等寄存器了? 
80286开始,保护模式下,为避免每次形成线性地址的时时,都要使用选择子相关的信息而去访问内存,cpu配备了相应的段描述符高速缓冲寄存器。 所以重新加载一下ds、es、ss相当于重新设置符合要求的对应段描述符高速缓冲寄存器!

问题2:
为什么这里跳回实模式的代码段必须是在16位的代码段中? 
如果在32位的代码段中要跳回16位的实模式,那么设置完cr0后,准备用jmp跳回实模式的地址去,但是此时的cs相关的段描述符高速缓冲里面的属性还是32位保护模式的段属性,这个跟上个问题一样,清一下缓存,但是jmp跳过去之后是16位的实模式了,没法清缓存了! 

实模式下的特性:

1,怎么恢复段属性为64K段呢?
前面说了,实模式下简单的对段赋值并不会改变段属性,只会改变的是基地址,所以如果你要恢复64K段的话需要再进一次保护模式,在保护模式下加载段值GDT即可。

2.实模式下如何进行4G内存访问,进保护模式,给DS/ES/FS/GS中的一个或多个设置一个4G段,然后切回实模式,用这些段寄存器配合就可以访问4G内存了。
上面的很多人都知道,后面的很多人就不知道了。

我们假设用的FS存储的4G段,Base=0,Limit=4G
(1).为啥切换回实模式还能访问4G?
     切换实模式保护模式不会引起段属性的改变,段值并没有实际意义,仅仅在赋值的时候会影响段寄存器对应的一个属性寄存器。这也就是Intel要求切换到保护模式后要紧跟一个长跳转的原因,很多资料上说是为了清指令队列或指令预取,其实都不是,主要是为了改变CS的段属性。
(2).切回实模式后对原来的4G段赋值会怎么样?
     很多人总是小心翼翼的呵护自己的4G段,总是担心对其赋值后就没法访问4G数据了。
     其实不用担心,经过研究发现,在实模式下对段寄存器进行赋值,改变的仅仅是其基地址而已。比如FS=1000h后,这时候Base变成10000h了,Limit还是4G,注意,这里如果要访问80000h的话就不能再用FS:[80000h]了,而应该用FS:[70000h],因为你的Base变了。
 

关于从保护模式切换到实模式的相关说明

相关链接: http://blog.chinaunix.net/uid-22683402-id-1771401.html

在分段管理机制中,每个段寄存器都配有段描述符高速缓冲寄存器,这些高速缓冲寄存器在实方式下仍发挥作用,只是内容上与保护模式下有所不同。

猜你喜欢

转载自blog.csdn.net/port23/article/details/81483665
今日推荐