X86 从GRUB2多引导信息结构获取总可用RAM

X86 从GRUB2多引导信息结构获取总可用RAM,x86,kernel,i386,grub2,X86,Kernel,I386,Grub2,我设法访问了i386内核中的GRUB多引导信息结构(multiboot\u info\u t),其中有两个字段分别称为mem\u lower和mem\u upper。我如何使用它们来获得可用的RAM总量(字节)?简单地说,你不能 mem_lower和mem_upper是过时的字段,指的是和。 引述: 如果设置了标志字中的位0,则mem.*字段有效。 mem_lower和mem_upper分别表示较低和较高的内存量,单位为千字节 下部内存从地址0开始,上部内存从地址1 MB开始。较低内存的最大可能

我设法访问了i386内核中的GRUB多引导信息结构(
multiboot\u info\u t
),其中有两个字段分别称为
mem\u lower
mem\u upper
。我如何使用它们来获得可用的RAM总量(字节)?

简单地说,你不能

mem_lower
mem_upper
是过时的字段,指的是和。
引述:

如果设置了
标志
字中的位0,则
mem.*
字段有效。
mem_lower
mem_upper
分别表示较低和较高的内存量,单位为千字节

下部内存从地址0开始,上部内存从地址1 MB开始。较低内存的最大可能值为640 KB

为上层内存返回的值最大为第一个上层内存孔的地址减去1兆字节mebibyte。不能保证为该值

本摘录的两个关键方面是:

  • 在访问
    mem.*
    字段之前,需要测试
    标志
    字段
  • mem_lower
    mem_upper
    字段严重处理内存漏洞。尤其是
    mem_upper
    将扩展内存的第一个连续块的大小保持到第一个孔 第二点非常重要,值得进一步讨论。
    虽然可以在内存控制器级别1访问内存本身,但作为一个连续块,它在内存子系统级别(以前是,现在是)不是连续的。
    内存子系统在分配给内存的连续地址范围中创建了漏洞,其方法是不回收特定的子范围(从而浪费内存),或者将子范围移动到更高的地址

    这种看似奇怪的行为背后的原因深深植根于IBM PC的历史演变。
    一个完整的讨论不属于主题,但可以安排一个简短的版本。 最初,IBM为传统内存保留了1MiB地址空间中的第一个640KiB,为映射ROM(包括BIOS ROM)保留了剩余的384KiB。
    请注意,内存控制器不得响应640KiB以上的读/写访问,以便访问ROM

    当1MiB屏障被破坏时(包括或不包括随意的),从640KiB到1MiB的范围不能用于向后兼容性。 这创建了第一个孔:标准孔。
    286只有一个24位地址总线,因此有一个16Mb地址空间。
    同时,已在IBM PC兼容硬件上赢得了比赛。
    一些ISA扩展卡附带了扩展ROM,标准孔耗尽,在16MiB地址空间的末尾保留了1MiB孔。
    我把这个洞称为洞。
    当从32位系统过渡到64位系统时,PCI(e)也发生了几乎相同的情况,从而生成了

    除此之外,还有一些可读/写的内存区域,但它们携带了BIOS所列出的宝贵信息,即。
    操作系统不能随意覆盖这些范围,因此必须向其报告

    所有这一切最终导致了这样的结果:它没有返回内存大小(根据上面的讨论,这是没有意义的),而是返回一个内存映射,该映射由范围及其类型(可用、保留、可回收、坏、NVS)组成

    这也反映在GRUB
    multiboot\u info\u t
    structure字段
    mmap\u*
    中,您应该使用这些字段来代替
    mem\u lower
    mem\u upper
    ,如中所示


    1使用秩、列、列和行号访问,但内存控制器通常使这种寻址线性且连续