gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:50:13 24 4
gpt4 key购买 nike

我试图了解机器如何从开机到运行内核。根据我的收集,在启动期间切换到保护模式以便访问更多可寻址内存是有用的,即使我们最终会切换到更传统的虚拟内存计划(页目录和页表以及分段关闭) .

看来要切换到保护模式必须做三件事:

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

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

最佳答案

第一个问题可能是:为什么Intel在设计芯片时不采用设置PE就会进入保护模式的方式?

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

换句话说:如果地址“mov CR0,EAX”位于地址0x0100:0x1200,那么下一条执行的指令将位于地址0x0100:0x1203。因此,只有与跳转指令结合使用才能切换到保护模式;否则切换 PE 本身会产生不必要的跳转(从 0x0100:0x1203 实模式到 0x0100:0x1203 保护模式)。

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

我不确定在远跳转之前加载其他段寄存器(例如 DS)是否已经起作用,因此如果您在远跳转之前加载 DS 寄存器,则将从 GDT 中获取基地址和限制。很高兴尝试一下......

关于assembly - 在CR0中设置PE标志如何启用保护模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26679682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com