Linux kernel 与内核加载程序的x86内存布局混淆

Linux kernel 与内核加载程序的x86内存布局混淆,linux-kernel,x86,bootloader,Linux Kernel,X86,Bootloader,我是Linux内核新手,正在阅读内核加载程序的内存布局,但对下面给出的图表感到困惑 0A0000 +------------------------+ | Reserved for BIOS | Do not use. Reserved for BIOS EBDA. 09A000 +------------------------+ | Command line | | Stack/heap

我是Linux内核新手,正在阅读内核加载程序的内存布局,但对下面给出的图表感到困惑

0A0000  +------------------------+
        |  Reserved for BIOS     |  Do not use.  Reserved for BIOS EBDA.
09A000  +------------------------+
        |  Command line          |
        |  Stack/heap            |  For use by the kernel real-mode code.
098000  +------------------------+  
        |  Kernel setup          |  The kernel real-mode code.
090200  +------------------------+
        |  Kernel boot sector    |  The kernel legacy boot sector.
090000  +------------------------+
        |  Protected-mode kernel |  The bulk of the kernel image.
010000  +------------------------+
        |  Boot loader           |  <- Boot sector entry point 0000:7C00
001000  +------------------------+
        |  Reserved for MBR/BIOS |
000800  +------------------------+
        |  Typically used by MBR |
000600  +------------------------+ 
        |  BIOS use only         |
0A0000+------------------------+
|为BIOS保留|请勿使用。为BIOS EBDA保留。
09A000+------------------------+
|命令行|
|堆栈/堆|供内核实模式代码使用。
098000  +------------------------+  
|内核设置|内核实模式代码。
090200  +------------------------+
|内核引导扇区|内核遗留引导扇区。
090000  +------------------------+
|受保护模式内核|内核映像的大部分。
010000  +------------------------+
|引导加载程序|
现在第一件事是0x100000地址在上面的图中

0x100000不在图表上,因为只有第一个兆字节是特殊的。超过该点时,物理内存至少在15-16MB点之前是连续的

第二件事是,当它说内核实模式块可重定位到“0x10000和低内存结束之间的任何地址”时,意味着它可重定位到0x10000到000600之间的地址

实模式代码可以存在于大约1MB以下的任何位置,并且可能在0x9A000或EBDA开始的任何位置结束

当它说低内存意味着内存下降到000600,高内存上升到0A0000


在图表上,从0xA0000向下,到0。

请参阅以了解内存不足的原因。此外,地址
0x000000
将是低内存的开始,因此低内存的结束意味着地址越大。感谢Shahbaz,你的评论让我的图片更清晰。感谢Alexey的友好回复,可以完美地说,实模式代码位于09A000以下的任何位置,而受保护模式内核必须位于高内存(0x100000)上,该内存最初位于090000和010000之间。是的,实模式代码不能高于该点。内核的受保护模式部分首先加载到1MB以下,然后移动到1MB以上,因为它是使用仅在实模式下工作的BIOS I/O函数加载的。从理论上讲,您可以通过切换模式(realprotected)将内核分为小部分加载并复制到1MB以上,但看起来实际情况并非如此。还有一点需要确认,给定图表中的最高地址0A0000远低于最大1 MB地址空间。0xA0000到1MB是为视频内存和ROM BIOS保留的。您在该区域没有正常的RAM。