2017-08-07 52 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與秩,銀行,列和行數,但存儲器控制器通常使此尋址線性和連續訪問。