实模式和加载linux内核令人困惑

实模式和加载linux内核令人困惑

据我所知,保护模式将在内核中激活,而在 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:

相关内容