2

我正在爲該設備編寫一個Linux設備驅動程序以及一個模擬器。爲了讓設備驅動程序正常工作,我需要爲它提供內存資源。如果使用模擬器,我需要在模擬器中分配這些資源。在Linux中模擬設備 - 需要一種方法來分配RAM中的資源

問題是,我不能在系統RAM中分配資源,因爲系統RAM地址上不允許使用ioremap()。

我現在使用的方法是使用內核命令行中的mem選項來限制系統可見的內存量。我寧願使用其他方法,因爲我不想告訴所有用戶編輯他們的GRUB設置並限制他們的RAM使用。

理想情況下,我希望保留模擬器模塊中的內存,並在模擬器模塊卸載後釋放它。另一個好的方法是儘可能少選擇首次加載模擬器並保存在內存中的內存。

據我所知,模擬器應該將內存標記爲保留或斷開連接。但是我沒有看到任何可以做到的導出函數。我需要從一個內核模塊來完成。要求用戶重新編譯他們的內核是不現實的。

對於使用可選內核接口(如內存熱插拔),我很確定。它們在流行的發行版內核上啓用,所以大多數用戶應該可以使用它。但是我找不到任何可用於模塊的API來保留或「斷開」存儲器塊。

+0

我不太確定你將能夠從模塊做到這一點。當然可以使用你提到的mem參數,或者https://www.kernel.org/doc/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt設備樹綁定,甚至可以竊取內核的啓動碼。你不能只是'kmalloc'模擬器的內存,然後讓你的驅動程序更聰明,所以它區分phy和虛擬地址? –

+0

*「在系統RAM地址上不允許使用ioremap()」。* - 這可能取決於體系結構甚至是該體系結構的版本。對於ARM,請參閱[ARM的乘法映射內存混亂](https://lwn.net/Articles/409689/)。你想在特定的物理地址記憶嗎?否則,查看用於DMA可用內存的各種內存分配器。 – sawdust

+0

我能夠通過使用mark_page_reserved()來處理ioremap(),但我仍在掙扎着資源分配,這是一個單獨的問題。 – proski

回答

0

我能找到一個很好的解決方案。有兩個方面的問題,資源保留和資源重新映射到內核地址空間。

可通過查找包含RAM資源並使用request_resource()在其下分配仿真器資源來解決預留問題。被測驅動程序可以調用request_region(),但它應該使用設備資源的父資源而不是iomem_resource。我認爲這是一種合理的方法,可以從父代獲取資源,而不是遍歷整個資源樹,儘管後者在內核中是很常見的做法。

更激進的方法是在RAM資源上取消設置IORESOUCE_BUSY。這將容納預留iomem_resource下的資源的司機,但對我來說似乎相當不安全。

重映射問題通過將每個「資源」內存頁標記爲保留來解決。有一個宏,它操縱頁面標誌。只要確保分配頁面對齊的內存。

該網站的工作代碼太長;它可以在http://marc.info/?l=linux-mm&m=149280134601521

相關問題