一尘不染

强制Linux在4G上仅使用内存?

linux

我有一个Linux设备驱动程序,该驱动程序与一个设备相连,该设备理论上可以使用64位地址执行DMA。我想测试一下是否确实有效。

有没有一种简单的方法可以强制Linux计算机不使用物理地址4G以下的任何内存?如果内核映像位于低内存中就可以了;我只想能够强制我知道所有动态分配的缓冲区,而为我分配的任何内核或用户缓冲区都无法以32位寻址的情况。这有点蛮力,但是比我能想到的任何东西都要全面。

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

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


阅读 458

收藏
2020-06-07

共1个答案

一尘不染

/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缓冲区。

2020-06-07