9

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

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

这应该可以帮助我发现 (1) 硬件配置不正确或未加载完整地址(或只是简单损坏)以及 (2) 意外和不必要地使用反弹缓冲区(因为无处可反弹)。

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

4

2 回答 2

7

/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 排除内存
                                 内存映射=64K$0x18690000
                                 或者
                                 内存映射=0x10000$0x18690000

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

于 2009-12-16T02:12:51.857 回答
0

IIRC 在内核配置中有一个选项可以使用 PAE 扩展,这将使您能够使用超过 4GB 的内存(我对内核配置有点生疏——我重新编译的最后一个内核是 2.6.4——所以请原谅我没有回忆)。您确实知道如何触发内核配置

make clean && make menuconfig

希望这会有所帮助,最好的问候,汤姆。

于 2009-12-16T00:34:42.530 回答