2017-08-07 45 views

回答

3

简而言之,你不能。

mem_lowermem_upper是陈旧的字段,指的是conventional memoryextended memory
引述specifications

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

低位内存从地址0开始,高位内存从地址1开始兆字节 mebibyte。较低内存的最大可能值为640 千字节千兆字节。

高位内存返回的值最大为第一个高位内存空间的地址减1 1兆字节兆字节。这不保证是这个价值。

这个片段的两个关键方面是:

  1. flags字段需要访问mem_*字段之前进行测试。
  2. mem_lowermem_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_lowermem_upper的作为OSDev wiki指示使用。


DIMMs与秩,银行,列和行数,但存储器控制器通常使此寻址线性和连续访问。