如何從 Linux 核心中保留一塊記憶體?
我有一個設備需要一塊專門為其保留的記憶體,無需作業系統干預。有沒有辦法告訴 BIOS 或作業系統保留一塊記憶體,它不能使用它?
我在 openSUSE 機器上使用這個設備。
您要求的是 DMA。您需要編寫驅動程序來保留此記憶體。
是的,我意識到您說過您不希望作業系統進行干預,並且驅動程序成為作業系統的一部分,但是在沒有驅動程序保留的情況下,核心認為所有記憶體都屬於它。(除非你告訴核心忽略記憶體塊,根據 Aaron 的回答,就是這樣。)
Rubini、Corbet 和 Kroah-Hartmann 撰寫的“ Linux 設備驅動程序,3/e ”的第 15 章(PDF)涵蓋了 DMA 和相關主題。
如果你想要這個的 HTML 版本,我在網上其他地方找到了該章的第二版。請注意,第 2 版現在已經有十多年的歷史了,它是在核心 2.4 是新版本時問世的。從那時起,核心的記憶體管理子系統已經做了很多工作,因此它可能不再適用。
如果你想讓作業系統完全忽略它,你需要使用“
memmap
.”來製造一個記憶體洞。請參閱此參考。例如,如果你想要 512M 在 2GB 的屏障上,你可以memmap=512M$2G
在你的核心命令行上加上“”。您需要檢查您的
dmesg
設備以找到一個連續的洞來偷竊,這樣您就不會踩到任何設備;這是特定於您的主機板+卡的。這不是推薦的做事方式 - 請參閱 Warren Young 的回答以了解如何正確執行此操作(核心驅動程序 + DMA)。我正在回答你問的確切問題。如果您打算為最終使用者製作此內容,那麼如果您對他們這樣做,他們會討厭您……相信我,這是我知道這個答案的唯一原因。
編輯:如果您使用帶有 grubby 的 grub2(例如 CentOS 7),您需要確保轉義 $。
\
之前應該有單$
。例子:$ sudo -v $ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000' $ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"