基于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 都浮点数处理有关系