【发布时间】: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
所以我的问题如下:
-
什么是跳远?
-
切换到保护模式到底对 cpu 有什么影响?
-
什么是CODE_SEG以及为什么我们将它与偏移量一起使用start_protected_mode?我们不能像
jmp start_protected_mode那样做一个正常的跳跃吗?我知道它是 GDT 中代码描述符的位置,但这会自动被 cpu 识别为引导加载程序代码的位置吗?
标签: assembly x86 bootloader protected-mode