小编ali*_*eza的帖子

进入保护模式后理解远跳问题

在我的引导加载程序代码中有一个部分,我们通过加载 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:
    ...
Run Code Online (Sandbox Code Playgroud)

这些是常数:

CODE_SEG equ code_descriptor - GDT_start
DATA_SEG equ data_descriptor - GDT_start
Run Code Online (Sandbox Code Playgroud)

所以我的问题如下:

  1. 什么是远跳?

  2. 进入保护模式到底对CPU有什么影响?

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

x86 assembly protected-mode bootloader

1
推荐指数
1
解决办法
358
查看次数

标签 统计

assembly ×1

bootloader ×1

protected-mode ×1

x86 ×1