强制Linux只使用4G内存?

我有一个Linux设备驱动程序,与理论上可以使用64位地址执行DMA的设备接口。 我想testing看看,这实际上工作。

有一个简单的方法,我可以强制Linux机器不使用物理地址4G以下的任何内存? 如果内核映像处于低内存状态,则可以。 我只是想强制一种情况,我知道所有dynamic分配的缓冲区,并且为我分配的任何内核或用户缓冲区都不能在32位中寻址。 这是一个小小的蛮力,但比我能想到的任何事情都要更全面。

这应该帮助我抓住(1)硬件configuration不正确或加载了完整的地址(或者只是简单的中断),以及(2)意外和不必要的反弹缓冲区使用(因为没有地方反弹)。

澄清 :我正在运行x86_64,所以我不关心大多数旧的32位寻址问题。 我只是想testing一个驱动程序可以正确地使用64位物理地址与多个缓冲区进行交互。

Solutions Collecting From Web of "强制Linux只使用4G内存?"

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

IIRC内核配置中有一个选项使用PAE扩展,这将使您能够使用4GB以上(我在内核配置上有点生疏 – 我重新编译的最后一个内核是2.6.4–所以请原谅我不记得)。 你知道如何触发一个内核配置

make clean && make menuconfig

希望这有助于,最好的问候,汤姆。