我有一个Linux设备驱动程序,该驱动程序与一个设备相连,该设备理论上可以使用64位地址执行DMA。我想测试一下是否确实有效。
有没有一种简单的方法可以强制Linux计算机不使用物理地址4G以下的任何内存?如果内核映像位于低内存中就可以了;我只想能够强制我知道所有动态分配的缓冲区,而为我分配的任何内核或用户缓冲区都无法以32位寻址的情况。这有点蛮力,但是比我能想到的任何东西都要全面。
这应该可以帮助我发现(1)硬件配置不正确或未加载完整地址(或只是普通损坏),以及(2)意外和不必要地使用退回缓冲区(因为无处可退回)。
澄清 :我正在运行x86_64,所以我不在乎大多数旧的32位寻址问题。我只想测试驱动程序可以使用64位物理地址正确地与众多缓冲区接口。
/usr/src/linux/Documentation/kernel- parameters.txt
memmap = exactmap [KNL,X86]启用精确设置 E820内存映射,由用户指定。 这样的memmap = exactmap行可以基于 BIOS输出或其他要求。参见memmap = nn @ ss 选项说明。 memmap = nn [KMG] @ss [KMG] [KNL]强制使用特定内存区域 要使用的内存区域,从ss到ss + nn。 memmap = nn [KMG] #ss [KMG] [KNL,ACPI]将特定内存标记为ACPI数据。 要使用的内存区域,从ss到ss + nn。 memmap = nn [KMG] $ ss [KMG] [KNL,ACPI]将特定内存标记为保留。 要使用的内存区域,从ss到ss + nn。 示例:从0x18690000-0x1869ffff中排除内存 memmap = 64K $ 0x18690000 要么 memmap = 0x10000 $ 0x18690000
如果添加memmap=4G$0到内核的引导参数,则将不再能够访问较低的4GB物理内存。同样,您的系统将不再引导…但是其中的一些变化(memmap=3584M$512M?)可能会允许不足4GB的内存用于系统引导,但不足以在其中分配驱动程序的DMA缓冲区。
memmap=4G$0
memmap=3584M$512M