在我的引导加载程序代码中,有一个部分是通过加载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.什么是跳远?
1.转换到保护模式对CPU有什么影响?
1.什么是 CODE_SEG,为什么要使用偏移量 start_protected_mode?我们不能像jmp start_protected_mode
一样进行正常跳转吗?我知道这是GDT中代码描述符的位置,但这是否会自动被CPU识别为引导加载程序代码的位置?
1条答案
按热度按时间2sbarzqh1#
1.远跳转是加载CS寄存器以及E/RIP的跳转。
1.设置CR 0的位0会改变CPU执行段寄存器加载的方式。它也会改变许多其它指令的操作方式。但是,它不会改变缓存的CS描述符信息。因此,在进入保护模式后,CPU仍在16位模式下执行指令。