我继承了支持一些Linux内核驱动程序(我的经验非常有限)。我的问题如下。它是一个嵌入式环境,硬件具有512MB的物理内存。但是,传递给内核的引导参数通过使用变量linuxMem = mem = 256M将内存限制为256MB。在我对这个环境变量的研究中,我理解这一点 这限制了内核可以管理的内存量为256MB。 然而,在我的目标上运行的一些应用程序代码中,我看到打开/ dev / mem以及返回的文件描述符的后续mmap,并且mmap调用的offset参数位于物理内存的高256MB中。 事情似乎工作得很好。所以我的问题是“如果内核据说不知道上面的256MB会怎么样?”
答案 0 :(得分:3)
严格地说,mem = 256M是内核参数,而不是环境变量。此参数仅告知内核使用如此多的内存,但它不会使系统完全忽略机器中安装的物理芯片。它可用于模拟物理内存少于实际可用内存的系统,但它并不完全等同于打开盒子并拉出其中一个内存芯片。
查看the docs for this parameter,您可以明确地看到有限范围之外的地址可以在某些情况下使用,这就是为什么他们建议在某些情况下也使用memmap=
。因此,您无法为超出限制的应用程序分配内存,但您可以查看某些物理地址的内容,似乎某些设备驱动程序会利用这种可能性。
答案 1 :(得分:2)
mmap()
返回虚拟地址,而不是物理地址。
设备完全有可能只有64MB内存而mmap()
可以映射大约1GB的内容。