强制Linux只使用超过4G的内存?

时间:2009-12-16 00:23:58

标签: linux linux-kernel linux-device-driver

我有一个Linux设备驱动程序,它接口到一个理论上可以使用64位地址执行DMA的设备。我想测试看看这确实有效。

有没有一种简单的方法可以强制Linux机器不使用物理地址4G以下的任何内存?如果内核映像处于低内存状态,则可以。我只是希望能够强制我知道所有动态分配的缓冲区的情况,并且为我分配的任何内核或用户缓冲区都不能以32位进行寻址。这是一种蛮力,但比我能想到的任何其他事情都更全面。

这应该有助于我抓住(1)未正确配置或装满完整地址的硬件(或者只是简单破坏)以及(2)意外和不必要地使用弹跳缓冲器(因为无处弹跳)到)。

澄清:我正在运行x86_64,所以我不关心大多数旧的32位寻址问题。我只是想测试驱动程序是否可以使用64位物理地址与大量缓冲区正确连接。

2 个答案:

答案 0 :(得分:7)

/usr/src/linux/Documentation/kernel-parameters.txt

        memmap=exactmap [KNL,X86] Enable setting of an exact
                        E820 memory map, as specified by the user.
                        Such memmap=exactmap lines can be constructed based on
                        BIOS output or other requirements. See the memmap=nn@ss
                        option description.

        memmap=nn[KMG]@ss[KMG]
                        [KNL] Force usage of a specific region of memory
                        Region of memory to be used, from ss to ss+nn.

        memmap=nn[KMG]#ss[KMG]
                        [KNL,ACPI] Mark specific memory as ACPI data.
                        Region of memory to be used, from ss to ss+nn.

        memmap=nn[KMG]$ss[KMG]
                        [KNL,ACPI] Mark specific memory as reserved.
                        Region of memory to be used, from ss to ss+nn.
                        Example: Exclude memory from 0x18690000-0x1869ffff
                                 memmap=64K$0x18690000
                                 or
                                 memmap=0x10000$0x18690000

如果将memmap=4G$0添加到内核的引导参数,则将无法再访问较低的4GB物理内存。此外,您的系统将不再启动...但是此处的某些变体(memmap=3584M$512M?)可能允许系统启动时有足够的4GB以下的内存,但不足以在那里分配驱动程序的DMA缓冲区。

答案 1 :(得分:0)

IIRC在内核配置中有一个选项可以使用PAE扩展,这将使你能够使用超过4GB(我在内核配置上有点生疏 - 我重新编译的最后一个内核是2.6.4 - 所以请原谅我缺乏召回)。你知道如何触发内核配置

make clean && make menuconfig

希望这有帮助, 最好的祝福, 汤姆。