小编Mar*_*Dem的帖子

跳转到 64 位长模式时出现三重错误

以下从 32 位保护模式(启用 A20)转换到 64 位长模式的代码似乎给我带来了问题。我将 1GiB 页面从 0x00000000 恒等映射到 0x3fffffff;启用 PAE;启用 EFER MSR 中的长模式位;安装 GDT;启用分页;然后对我的 64 位入口点进行模拟 FAR JMP:

lea eax, [PML4]
mov cr3, eax

mov eax, cr4
or eax, 100000b
mov cr4, eax

mov ecx, 0xc0000080
rdmsr
or eax, 100000000b
wrmsr

mov eax, cr0
mov ebx, 0x1
shl ebx, 31
or eax, ebx
mov cr0, eax

call gdt64_install
push 8
push longmode
retf ;<===================== faults here
Run Code Online (Sandbox Code Playgroud)

当执行指令时,程序在BOCHSRETF中出现三次错误,但似乎没有返回任何错误。如果我info tab在这次跳转之前输入,我会得到:

0x00000000-0x3fffffff -> 0x000000000000-0x00003fffffff
Run Code Online (Sandbox Code Playgroud)

在我看来,分页正在工作。这是sreg …

paging x86 assembly x86-64 osdev

5
推荐指数
1
解决办法
693
查看次数

标签 统计

assembly ×1

osdev ×1

paging ×1

x86 ×1

x86-64 ×1