我設法訪問我的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與秩,銀行,列和行數,但存儲器控制器通常使此尋址線性和連續訪問。
- 1. 使用結構從類獲取信息
- 2. 窗戶的API來獲取RAM信息
- 3. WMI硬件,獲取RAM信息
- 4. 從構建中獲取BuildAgent信息
- 5. 從結果集中獲取信息,而
- 6. 是否可以從Exception.StackTrace中提取一些結構化信息?
- 7. 從php多維json中獲取信息
- 8. 獲取更多的結果,信息
- 9. 如何使用VB6獲取CPU名稱,總RAM等硬件信息?
- 10. 如何通過WMI查詢獲取GB中的總物理內存(RAM)信息?
- 11. 從Jenkins獲取構建信息API
- 12. 從DataGridView中獲取信息
- 13. 從PID獲取結構信譽
- 14. 使用GroupPrincipal可以從UserPrincipal獲取更多信息
- 15. For循環從結構中提取信息不起作用?
- 16. 如何從c中的屬性信息中獲取引用#
- 17. 如何從SRCSRV獲取更多信息?
- 18. 從System.Data.SQLite.SQLiteException獲取更多信息
- 19. 從CvHoughCircles獲取更多信息
- 20. 從很多表格獲取信息
- 21. 從HttpContext.User獲取更多信息
- 22. 從AxHost獲取更多調試信息?
- 23. 從Rprof獲取更多信息()
- 24. 從不可見頁面獲取信息
- 25. 可以從JSON API獲取信息
- 26. 程序在java中獲取有關Ram的信息
- 27. 如何從引用搜索引擎獲取查詢信息
- 28. 從表單中獲取用戶信息
- 29. 從預約架構中獲取用戶信息
- 30. SQLException獲取更多信息