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



在我的引导加载程序代码中,有一节我们通过加载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以及我们为什么将其与偏移量一起使用启动受保护模式?我们不能像jmp start_protected_mode那样做一个正常的跳跃吗?我知道这是GDT中代码描述符的位置,但这会自动被cpu识别为引导加载程序代码的位置吗?

  1. 一个远跳是加载CS寄存器和E/RIP的一个。

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

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

最新更新