我有一个 Linux 设备驱动程序,它连接到一个理论上可以使用 64 位地址执行 DMA 的设备。我想测试一下这是否真的有效。
有没有一种简单的方法可以强制 Linux 机器不使用物理地址 4G 以下的任何内存?如果内核映像内存不足也没关系;我只是希望能够强制实现一种情况,即我知道所有动态分配的缓冲区,并且为我分配的任何内核或用户缓冲区都无法以 32 位寻址。这有点蛮力,但比我能想到的任何其他方法都更全面。
这应该可以帮助我捕获(1)未正确配置或加载完整地址(或只是完全损坏)的硬件以及(2)意外和不必要地使用反弹缓冲区(因为没有地方可以反弹)。
澄清:我运行的是 x86_64,所以我不关心大多数旧的 32 位寻址问题。我只是想测试驱动程序是否可以使用 64 位物理地址与多个缓冲区正确连接。
/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 缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)