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

时间:2017-08-07 12:28:03

标签: x86 kernel i386 grub2

我设法在我的i386内核中访问GRUB多重引导信息结构(multiboot_info_t),并且分别有两个字段mem_lowermem_upper。如何使用它们来获取总可用RAM(以字节为单位)?

1 个答案:

答案 0 :(得分:3)

简单地说,你不能。

mem_lowermem_upper是过时的字段,指的是conventional memoryextended memory
引用specifications

  

如果设置flags字中的位0 ,则mem_*字段有效。
  mem_lowermem_upper分别以千字节 kibibytes表示低内存和高内存的数量。

     

较低的内存从地址0开始,高端内存从地址1 兆字节 mebibyte开始。较低存储器的最大可能值是640 千字节 kibibytes。

     

为高端内存返回的值最大值是第一个高端内存孔的地址减1 兆字节 mebibyte。不能保证这个值。

此摘录的两个主要方面是:

  1. 在访问flags字段之前,需要先测试mem_*字段。
  2. mem_lowermem_upper字段非常严重地处理内存漏洞。特别是mem_upper保持第一个连续的扩展记忆块的大小直到第一个孔。
  3. 第二点非常重要,值得进一步讨论 虽然可以访问内存本身,但是在内存控制器级别 1 ,作为一个连续的块,它在内存子系统级别上不是连续的(曾经是north-bridge,现在是{ {3}})。
    存储器子系统通过简单地不回收特定的子范围 - 从而浪费该存储器 - 或通过在较高地址处移动子范围,在分配给存储器的连续地址范围中创建

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

    当1MiB屏障被破坏时(包括或不包括uncore),640KiB到1MiB的范围不能用于向后兼容。 这创造了第一个洞:标准洞 286只有一个24位地址总线,因此是16MiB地址空间 与此同时,HMA已经赢得了ISA bus并且在IBM PC兼容硬件中发生了。 一些ISA扩展卡带有扩展ROM,标准孔耗尽,在16MiB地址空间的末尾保留了1MiB孔。
    我称这个洞为MCA bus 当从32位转换到64位系统生成ISA hole时,PCI(e)几乎发生了同样的事情。

    除了这些漏洞之外,还有一些可读/写的存储器范围,但它们带有BIOS所提供的宝贵信息 - 即PCI hole。 操作系统不能不小心覆盖这些范围,因此必须向其报告。

    所有这些都在ACPI tables达到高潮,而不是返回内存大小(根据上面的讨论没有意义),它返回一个由范围组成的内存映射他们的类型(可用,保留,可回收,坏,NVS)。

    这也反映在GRUB multiboot_info_t结构字段mmap_*中,您应该使用它来代替mem_lowermem_upper,如e820 service所示。

    1 使用等级,库,列和行号访问OSDev wiki,但内存控制器通常使此寻址线性且连续。