如何在CR0中设置PE标志启用保护模式?

时间:2014-10-31 15:21:52

标签: assembly operating-system kernel protected-mode real-mode

我试图了解机器如何从开机到运行内核。从我收集到的内容来看,在启动期间切换到保护模式以获得对更多可寻址内存的访问是有用的,即使我们最终将切换到更常规的虚拟内存计划,页面目录和页面表并关闭分段

似乎要切换到保护模式3必须要做的事情:

  1. 设置全局描述符表(gdt)并使用lgdt指令
  2. 加载它
  3. 将控制寄存器CR0中的PE标志位设置为使能(即,值为1)
  4. 使用ljmp
  5. 执行长跳转

    我想知道将段寄存器和指令指针转换为索引和偏移量以便与gdt一起使用的逻辑。这个逻辑是由硬件完成的吗?如果是这样的硬件,为什么要执行该过程的ljmp部分?为什么不简单地在CR0中设置PE标志以启用保护模式(没有跟随ljmp)?

1 个答案:

答案 0 :(得分:1)

第一个问题可能是:为什么英特尔没有以设置PE进入保护模式的方式设计芯片?

答案:这实际上是不可能的;假设CS寄存器包含一个基址为0x10 * CS的选择器。

换句话说:如果地址" mov CR0,EAX"位于地址0x0100:0x1200,然后执行的下一条指令将在地址0x0100:0x1203。因此,切换到保护模式只能与跳转指令一起使用;否则切换PE本身会发生不必要的跳转(从0x0100:0x1203实模式到0x0100:0x1203保护模式)。

从技术上讲,CPU内部存储所有使用的选择器的选择器信息。只要选择器寄存器发生变化,就会加载限制,基数等。这意味着需要加载CS寄存器来更新CS寄存器的基数,限制等。这意味着:必须进行远跳(因为这将加载CS寄存器)。也许RETF也会起作用......

我不确定加载其他段寄存器(例如DS)是否在远跳之前已经工作,因此如果在远跳之前加载DS寄存器,则基地址和限制将取自GDT 。很高兴尝试这个......