X86 从GRUB2多引导信息结构获取总可用RAM
我设法访问了i386内核中的GRUB多引导信息结构(X86 从GRUB2多引导信息结构获取总可用RAM,x86,kernel,i386,grub2,X86,Kernel,I386,Grub2,我设法访问了i386内核中的GRUB多引导信息结构(multiboot\u info\u t),其中有两个字段分别称为mem\u lower和mem\u upper。我如何使用它们来获得可用的RAM总量(字节)?简单地说,你不能 mem_lower和mem_upper是过时的字段,指的是和。 引述: 如果设置了标志字中的位0,则mem.*字段有效。 mem_lower和mem_upper分别表示较低和较高的内存量,单位为千字节 下部内存从地址0开始,上部内存从地址1 MB开始。较低内存的最大可能
multiboot\u info\u t
),其中有两个字段分别称为mem\u lower
和mem\u upper
。我如何使用它们来获得可用的RAM总量(字节)?简单地说,你不能
mem_lower
和mem_upper
是过时的字段,指的是和。引述: 如果设置了
标志
字中的位0,则mem.*
字段有效。mem_lower
和mem_upper
分别表示较低和较高的内存量,单位为千字节
下部内存从地址0开始,上部内存从地址1 MB开始。较低内存的最大可能值为640 KB
为上层内存返回的值最大为第一个上层内存孔的地址减去1兆字节mebibyte。不能保证为该值
本摘录的两个关键方面是:
mem.*
字段之前,需要测试标志
字段李>
mem_lower
和mem_upper
字段严重处理内存漏洞。尤其是mem_upper
将扩展内存的第一个连续块的大小保持到第一个孔李>
第二点非常重要,值得进一步讨论。虽然可以在内存控制器级别1访问内存本身,但作为一个连续块,它在内存子系统级别(以前是,现在是)不是连续的。
内存子系统在分配给内存的连续地址范围中创建了漏洞,其方法是不回收特定的子范围(从而浪费内存),或者将子范围移动到更高的地址 这种看似奇怪的行为背后的原因深深植根于IBM PC的历史演变。
一个完整的讨论不属于主题,但可以安排一个简短的版本。 最初,IBM为传统内存保留了1MiB地址空间中的第一个640KiB,为映射ROM(包括BIOS ROM)保留了剩余的384KiB。
请注意,内存控制器不得响应640KiB以上的读/写访问,以便访问ROM 当1MiB屏障被破坏时(包括或不包括随意的),从640KiB到1MiB的范围不能用于向后兼容性。 这创建了第一个孔:标准孔。
286只有一个24位地址总线,因此有一个16Mb地址空间。
同时,已在IBM PC兼容硬件上赢得了比赛。
一些ISA扩展卡附带了扩展ROM,标准孔耗尽,在16MiB地址空间的末尾保留了1MiB孔。
我把这个洞称为洞。
当从32位系统过渡到64位系统时,PCI(e)也发生了几乎相同的情况,从而生成了 除此之外,还有一些可读/写的内存区域,但它们携带了BIOS所列出的宝贵信息,即。
操作系统不能随意覆盖这些范围,因此必须向其报告 所有这一切最终导致了这样的结果:它没有返回内存大小(根据上面的讨论,这是没有意义的),而是返回一个内存映射,该映射由范围及其类型(可用、保留、可回收、坏、NVS)组成 这也反映在GRUB
multiboot\u info\u t
structure字段mmap\u*
中,您应该使用这些字段来代替mem\u lower
和mem\u upper
,如中所示
1使用秩、列、列和行号访问,但内存控制器通常使这种寻址线性且连续