2

我继承了对一些 linux 内核驱动程序的支持(我的经验非常有限)。我的问题如下。这是一个嵌入式环境,硬件有 512MB 的物理内存。但是,传递给内核的引导参数通过使用变量 linuxMem=mem=256M 将内存限制为 256MB。在我对这个环境变量的研究中,我了解到这将内核可以管理的内存量限制为 256MB。然而,在我的目标上运行的一些应用程序代码中,我看到了 /dev/mem 的打开和返回的文件描述符的后续 mmap,并且 mmap 调用的偏移参数位于物理内存的上部 256MB 中。事情似乎运作良好。所以我的问题是“如果内核不知道上面的 256MB,为什么它会起作用?”

4

2 回答 2

3

严格来说,mem=256M 是内核参数,不是环境变量。这个参数只是告诉内核使用这么多内存,但不会让系统对机器中安装的物理芯片完全视而不见。它可以用来模拟一个物理内存比实际可用内存少的系统,但它并不完全等同于打开你的盒子并拉出其中一个内存芯片。

查看此参数的文档,您可以明确地看到在某些情况下可以使用超出限制范围的地址,这就是他们建议memmap=在某些情况下也使用的原因。因此,您不能为您的应用程序分配超出限制的内存,但您可以查看在某个物理地址找到的内容,并且似乎某些设备驱动程序利用了这种可能性。

于 2012-05-23T21:48:04.623 回答
2

mmap()返回虚拟地址,而不是物理地址。

一台设备完全有可能只有 64MB 的内存并mmap()映射大约 1GB 的东西。

于 2012-05-23T19:58:20.800 回答