2009-12-16 85 views
7

我有一個Linux設備驅動程序,該設備驅動程序與理論上可以使用64位地址執行DMA的設備進行接口連接。我想測試,看看這實際上工作。強制Linux使用4G內存嗎?

有沒有一種簡單的方法可以強制Linux機器不使用物理地址4G以下的任何內存?如果內核映像處於低內存狀態,則可以;我只是希望能夠強制一種情況,即我知道所有動態分配的緩衝區,並且爲我分配的任何內核或用戶緩衝區都不能在32位中尋址。這是一個小小的蠻力,但比我能想到的其他任何東西都更全面。 (1)硬件配置不正確或加載了完整的地址(或者只是簡單的中斷),以及(2)意外和不必要的反彈緩衝區使用(因爲沒有地方反彈到)。

澄清:我正在運行x86_64,所以我不關心大多數舊的32位尋址問題。我只想測試一個驅動程序可以使用64位物理地址與多個緩衝區正確對接。

回答

7

/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 [email protected] 
         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緩衝區將分配到那裏。

+0

這似乎與我需要的非常接近,有兩點需要注意:首先,memmap = nn $ ss可以阻止內核讀取內存映射設備,包括PCI/PCIe總線上的所有內容。第二,我沒有辦法防止啓動時需要的內存,但隨後被釋放(如initrd映像)作爲DMA緩衝區被回收。 仍然有用的答案,謝謝。 – 2009-12-17 14:00:23

0

IIRC在內核配置中有一個使用PAE擴展的選項,可以使用4GB以上的內存(我在內核配置上有點生疏 - 我重新編譯的最後一個內核是2.6.4 - 所以請原諒我缺乏召回)。你知道如何觸發一個內核配置

make clean && make menuconfig

希望這有助於 最好的問候, 湯姆。

+1

你誤會了;我想啓動一個僅使用> 4GB內存的系統。 – 2009-12-16 01:35:06

+0

@Eric Seppanen:我的歉意!對!我絕對誤解了。當我看到ephemient的答案時,我去了!我完全忘記了所有的memmap引導參數,但從來沒有使用它......它讓你意識到,當你沒有很多的內存時,你不用去使用這些引導參數......對於混淆抱歉! :( – t0mm13b 2009-12-16 23:09:01