首页 > 代码库 > x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器

x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器

基于Xv6-OS 分析CR0 寄存器


之前一直觉得晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换?

-------------------------------------------------------------------------------------------------------------------------------------------


下面这段代码来自Xv6的boot/boot.S


这就是CPU real model 和 protected model的“分水岭”

根源在于控制这两种运行模式的寄存器——CR0 发生的变化

在Xv6里面这种CPU模式的切换发生的非常早,在boot.s几条汇编指令执行之后立马切换,切换之后,CPU便以protected model运行


下面是CR0的layout



再看这段代码(CR0_PE_ON在boot.S开头定义了,值为1)


意思就是把cr0寄存器的最低位置为1,So.... PE经历这段过程之后就进入到了protected model

PE: CR0的0位是启用保护位(protection enable)。当设置该位的时候即开启了保护模式,系统上电复位的时候该位默认为0,于是是实模式 real model. PE置1的保护,实质上是开启段级保护,就是只进行了分段,没有开启分页机制。如果要开启分页机制需要同时置位PE和PG


其实搞清楚以上的东东,就明白了,什么时候会开启保护模式,怎么开启的问题


接着继续看看CR0里面还有哪些“宝贝”





PG: 分页标志位。当设置该位时开启分页机制,当复位的时候则禁止分页机制,此时所有的线性地址等于物理地址。在开启这个标志位之前必须已经或者同时开启PE. 启用分页的条件就是PE PG同时为1


WP:(intel 80486以上的机器会有)该位是写保护位, write protection bit. 该位为1时,CPU会禁止用户特权级为0(超级用户)向read only page写入数据。但是复位的时候允许。这个标志位主要与 COW(copy on write)有关系.


NE:number error 协处理器错误,为1时,启用x87协处理器的内部报告机制,如果是0,就是用PC形式的x87协处理器的报告机制。(感觉目前我不会接触这东东。。)



当改变PE PG时候,必须小心。只有当执行程序至少有部分代码和数据在线性地址空间和物理地址空间中具有相同地址时,我们才能改变PG位的设置。此时这部分具有相同地址的代码在分页和未分页的世界起着桥梁作用。无论是否开启分页机制,这部分代码都具有相同的地址。另外,开启分页PG=1之前,必须先刷新TLB。在修改了PG之后,必须使用一个长跳转语句,以刷新处理器执行管道中已经获取的不同模式下的任何命令。 


ET: 系统中有80387协处理器,置为1,有一个80287或者没有,置为0


TS EM MP 都浮点数处理有关系












x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器