assembly 在进入保护模式后,理解远跳转时出现问题

7ivaypg9  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(141)

在我的引导加载程序代码中,有一个部分是通过加载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识别为引导加载程序代码的位置?

2sbarzqh

2sbarzqh1#

1.远跳转是加载CS寄存器以及E/RIP的跳转。
1.设置CR 0的位0会改变CPU执行段寄存器加载的方式。它也会改变许多其它指令的操作方式。但是,它不会改变缓存的CS描述符信息。因此,在进入保护模式后,CPU仍在16位模式下执行指令。

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

相关问题