【问题标题】:Problem understanding far jump after entering protected mode进入保护模式后理解远跳的问题
【发布时间】:2022-09-25 03:32:12
【问题描述】:

在我的引导加载程序代码中有一个部分,我们通过加载 GDT 并启用控制寄存器位将 cpu 切换到保护模式。

这是引导加载程序代码的一部分:

init_pm:
    ...
    cli
    lgdt [GDT_descriptor]

    mov eax, cr0
    or eax, 1
    mov cr0, eax

    ; far jump
    jmp CODE_SEG:start_protected_mode

[bits 32]
start_protected_mode:
    ...

这些是常数:

CODE_SEG equ code_descriptor - GDT_start
DATA_SEG equ data_descriptor - GDT_start

所以我的问题如下:

  1. 什么是跳远?

  2. 切换到保护模式到底对 cpu 有什么影响?

  3. 什么是CODE_SEG以及为什么我们将它与偏移量一起使用start_protected_mode?我们不能像jmp start_protected_mode 那样做一个正常的跳跃吗?我知道它是 GDT 中代码描述符的位置,但这会自动被 cpu 识别为引导加载程序代码的位置吗?

    标签: assembly x86 bootloader protected-mode


    【解决方案1】:
    1. 远跳转是加载 CS 寄存器和 E/RIP 的跳转。

    2. 设置 CR0 的第 0 位会改变 CPU 执行段寄存器加载的方式。它还改变了许多其他指令的操作方式。但是,它不会更改缓存的 CS 描述符信息。所以进入保护模式后,CPU仍然在16位模式下执行指令。

    3. GDT 中的代码段描述符是一个 32 位的代码段。将此描述符加载到 CS 中会导致处理器开始以 32 位模式执行指令。如果您使用近跳转而不是远跳转,处理器会尝试将指令解释为 16 位指令。

    【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2017-01-27
    • 2020-06-08
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多