所以,我开始开发 x86_64 爱好内核,我发现这段代码可以加载 GDT(全局描述符表),但我不明白它的作用。
load_gdt:
lgdt [rdi]
mov ax, 0x10
mov ss, ax
mov ds, ax
mov es, ax
mov rax, qword .trampoline
push qword 0x8
push rax
o64 retf
.trampoline:
ret
我知道它从 rdi 寄存器(sysv abi 中函数调用的第一个参数的寄存器)加载我的 gdt 描述符,但我不知道为什么我需要将所有段寄存器设置为 0x10 以及什么黑魔法在做什么?