2012-07-03 50 views
1

我正在編寫一個Linux驅動程序,它分配一些內存和用戶空間應用程序mmap()的內存。正確釋放和取消內核內存映射

現在我正在爲該模塊編寫退出處理程序,並且我正試圖弄清楚什麼是一些安全的假設。

首先,當內核模塊退出處理程序被調用時,可以安全地假設所有內存都未被映射(無論是由應用程序還是由內核)?或者在釋放內存之前必須在內核驅動程序中手動取消映射?

我問這個問題,因爲內核應該知道模塊是否正在退出,內核也會處理解映射過程。如果內核在調用退出處理程序之前處理解映射,那麼我可以釋放內存。如果這是真的,並且如果用戶空間應用程序試圖訪問該內存,那麼應用程序會出現分段錯誤。這是因爲虛擬地址不再指向有效的物理內存,或者進程沒有權限訪問該頁面上的虛擬地址(假設內核未映射內存)。如果內核驅動程序未映射內存,也會發生同樣的情況。這是真的?

+0

我懷疑,無論你分配和映射你將負責清理自己。但不知道。 – Wug

+0

我確定這是爲了分配,但對於映射是不確定的,因爲這是由用戶空間完成的,而'munmap()'完全由內核處理。 – Joshua

回答

1

現階段退出並不安全。只是否認卸貨。

這不是自動的,當進行一個mmap()時,您必須增加您的模塊使用計數。

如果你想粗魯,殺死用戶進程。

+0

好的,所以我應該禁止模塊卸載,直到所有內存都未映射。這是如何處理的,因爲內核已經控制了'mumap()'系統調用? – Joshua

+0

你的應用程序「mmap()」是怎麼做到的?作爲塊設備?作爲'/ sysfs'條目?或procfs? debugfs? –

+0

它正在映射一個字符設備。 – Joshua