我有一个Linux设备驱动程序,它接口到一个理论上可以使用64位地址执行DMA的设备。我想测试看看这确实有效。
有没有一种简单的方法可以强制Linux机器不使用物理地址4G以下的任何内存?如果内核映像处于低内存状态,则可以。我只是希望能够强制我知道所有动态分配的缓冲区的情况,并且为我分配的任何内核或用户缓冲区都不能以32位进行寻址。这是一种蛮力,但比我能想到的任何其他事情都更全面。
这应该有助于我抓住(1)未正确配置或装满完整地址的硬件(或者只是简单破坏)以及(2)意外和不必要地使用弹跳缓冲器(因为无处弹跳)到)。
澄清:我正在运行x86_64,所以我不关心大多数旧的32位寻址问题。我只是想测试驱动程序是否可以使用64位物理地址与大量缓冲区正确连接。
答案 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)
make clean && make menuconfig
希望这有帮助, 最好的祝福, 汤姆。