我正在爲該設備編寫一個Linux設備驅動程序以及一個模擬器。爲了讓設備驅動程序正常工作,我需要爲它提供內存資源。如果使用模擬器,我需要在模擬器中分配這些資源。在Linux中模擬設備 - 需要一種方法來分配RAM中的資源
問題是,我不能在系統RAM中分配資源,因爲系統RAM地址上不允許使用ioremap()。
我現在使用的方法是使用內核命令行中的mem
選項來限制系統可見的內存量。我寧願使用其他方法,因爲我不想告訴所有用戶編輯他們的GRUB設置並限制他們的RAM使用。
理想情況下,我希望保留模擬器模塊中的內存,並在模擬器模塊卸載後釋放它。另一個好的方法是儘可能少選擇首次加載模擬器並保存在內存中的內存。
據我所知,模擬器應該將內存標記爲保留或斷開連接。但是我沒有看到任何可以做到的導出函數。我需要從一個內核模塊來完成。要求用戶重新編譯他們的內核是不現實的。
對於使用可選內核接口(如內存熱插拔),我很確定。它們在流行的發行版內核上啓用,所以大多數用戶應該可以使用它。但是我找不到任何可用於模塊的API來保留或「斷開」存儲器塊。
我不太確定你將能夠從模塊做到這一點。當然可以使用你提到的mem參數,或者https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt設備樹綁定,甚至可以竊取內核的啓動碼。你不能只是'kmalloc'模擬器的內存,然後讓你的驅動程序更聰明,所以它區分phy和虛擬地址? –
*「在系統RAM地址上不允許使用ioremap()」。* - 這可能取決於體系結構甚至是該體系結構的版本。對於ARM,請參閱[ARM的乘法映射內存混亂](https://lwn.net/Articles/409689/)。你想在特定的物理地址記憶嗎?否則,查看用於DMA可用內存的各種內存分配器。 – sawdust
我能夠通過使用mark_page_reserved()來處理ioremap(),但我仍在掙扎着資源分配,這是一個單獨的問題。 – proski