从GRUB2多重引导信息结构中获取总可用RAM
我设法访问我的i386内核中的GRUB多重引导信息结构(multiboot_info_t
),并且有两个字段分别称为mem_lower
和mem_upper
。我如何使用它们来获得总可用RAM(以字节为单位)?从GRUB2多重引导信息结构中获取总可用RAM
简而言之,你不能。
mem_lower
和mem_upper
是陈旧的字段,指的是conventional memory和extended memory。
引述specifications:
如果位0在
flags
字设置,则mem_*
字段是有效的。mem_lower
和mem_upper
分别表示千字节千字节中的较低和较高内存的数量。低位内存从地址0开始,高位内存从地址1开始
兆字节mebibyte。较低内存的最大可能值为640千字节千兆字节。高位内存返回的值最大为第一个高位内存空间的地址减1 1兆字节兆字节。这不保证是这个价值。
这个片段的两个关键方面是:
- 的
flags
字段需要访问mem_*
字段之前进行测试。 -
mem_lower
和mem_upper
字段非常严重地处理内存漏洞。特别是mem_upper
将第一个连续的扩展内存块的大小保持到第一个洞。
第二点非常重要,值得进一步讨论。
虽然可以访问内存本身,但在内存控制器级别上,作为连续块,它在内存子系统级别上不是连续的(曾经是north-bridge,现在是uncore)。
内存子系统在分配给内存的连续地址范围内创建空洞,或者通过简单地不回收特定的子范围 - 从而浪费该内存 - 或通过在较高地址处移动子范围。
这个看似奇怪的行为背后的原因深深扎根于IBM PC的历史发展。
完整的讨论不在话题中,而是可以制定一个简短的版本。 最初,IBM为传统内存预留了1MiB地址空间的第一个640KiB,剩余的384KiB用于映射ROM - 包括BIOS ROM。
请注意,内存控制器必须不响应640KiB以上的读/写访问,才能访问ROM。
当1MiB障碍被破坏(包括或不是随意的HMA)时,640KiB到1MiB的范围不能用于向后兼容。 这创建了第一个洞:标准洞。
286只有一个24位地址总线,因此一个16MiB地址空间。
与此同时,ISA bus已经赢得了MCA bus,并且发生在IBM PC兼容硬件中。
一些ISA扩展卡附带扩展ROM,并且标准孔已经耗尽,在16MiB地址空间的末尾保留了1MiB的孔。
我把这个洞叫做ISA hole。
当从32位系统转换到64位系统时,PCI(e)发生的情况与PCI hole差不多。
除了这些漏洞之外,还有一些可读/写的内存范围,但它们携带BIOS提供的宝贵信息 - 即ACPI tables。
此类范围不能被操作系统不小心覆盖,因此必须向其报告。
所有这一切都在e820 service达到高潮,代替返回的存储器大小(在讨论的光以上是没有意义的)返回由范围的存储器映射与它们的类型(可保留的,可回收,坏,NVS)。
这也反映在GRUB multiboot_info_t
结构域mmap_*
,你应该在的地方mem_lower
和mem_upper
的作为OSDev wiki指示使用。
的DIMMs与秩,银行,列和行数,但存储器控制器通常使此寻址线性和连续访问。