我设法在我的i386内核中访问GRUB多重引导信息结构(multiboot_info_t
),并且分别有两个字段mem_lower
和mem_upper
。如何使用它们来获取总可用RAM(以字节为单位)?
答案 0 :(得分:3)
简单地说,你不能。
mem_lower
和mem_upper
是过时的字段,指的是conventional memory和extended memory。
引用specifications:
如果设置
flags
字中的位0 ,则mem_*
字段有效。
mem_lower
和mem_upper
分别以千字节kibibytes表示低内存和高内存的数量。较低的内存从地址0开始,高端内存从地址1
兆字节mebibyte开始。较低存储器的最大可能值是640千字节kibibytes。为高端内存返回的值最大值是第一个高端内存孔的地址减1
兆字节mebibyte。不能保证这个值。
此摘录的两个主要方面是:
flags
字段之前,需要先测试mem_*
字段。 mem_lower
和mem_upper
字段非常严重地处理内存漏洞。特别是mem_upper
保持第一个连续的扩展记忆块的大小直到第一个孔。 第二点非常重要,值得进一步讨论
虽然可以访问内存本身,但是在内存控制器级别 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_lower
和mem_upper
,如e820 service所示。
1 使用等级,库,列和行号访问OSDev wiki,但内存控制器通常使此寻址线性且连续。