据我所知,保护模式将在内核中激活,而在 grub 阶段它仍然是实模式。我的误解是:在实模式下,可用的总内存小于1MB,但是grub如何将内核甚至根文件系统(通常大于1MB)加载到内存中?
答案1
GRUB 不必将整个内核加载到内存中。内核映像分为两部分:
- 实模式内核代码,体积小,可在640kB可用内存阈值内加载;
- 内核的其余部分以保护模式运行,并在第一个兆字节的内存之后加载。
引导加载程序仅加载实模式内核代码,而实模式内核代码又会引导其余部分(请参阅 参考资料go_to_protected_mode()
)arch/x86/boot/pm.c
。这就是进程如何保持在实模式下运行的内存限制内的原因。
小提示:GRUB 可能会运行在两个都实模式和保护模式,取决于它在做什么。它可能会切换到保护模式以进行某些操作(某些硬件检测和菜单显示)。然而,你认为当它到达内核时它处于实模式,这是正确的。
答案2
可以通过BIOS int 0x15、0x87函数在实模式下完成。必须针对源和目标正确填写 GDT。cx
- 要移动的字节数。
push edx
push es
xor ax, ax
mov es, ax
mov ah, 0x87
mov si, gdt
int 0x15
jc error
pop es
pop edx
ret
gdt:
times 16 db 0
dw 0xffff ; segment limit
.src:
dw 0
db 2
db 0x93 ; data access rights
dw 0
dw 0xffff ; segment limit
.dest:
dw 0
db 0x10 ; load protected-mode kernel to 100000h
db 0x93 ; data access rights
dw 0
times 16 db 0
error: