2013-01-24 132 views
0

我正在嘗試使用linux-kernel中提供的mamp()功能。 當我們在用戶空間中調用mmap()時,我們嘗試將用戶空間進程的虛擬內存區域映射到內核空間中的內存。mmap()在Linux內核中訪問未映射的內存

內核中mamp()的定義是在我的內核模塊中完成的,它嘗試在頁面中分配一些內存&在mmap系統調用期間映射它。這個內核空間內存的內存內容可以由這個模塊填充。

我想問的問題是,在內存映射後,用戶空間進程可以直接訪問映射的內存,而無需任何額外的內核過載,所以不會有系統調用,如read(),但如果內存(在內核空間映射的內核空間&內分配)包含指向內核空間內分配的其他內存(未映射)的指針,那麼用戶空間進程可以藉助映射來訪問這個未映射的內存內存的內容是指向這個未映射內存的指針。

回答

1

不,用戶空間不能追蹤映射內存中指向未映射內核內存的指針。

0

沒有用戶空間進程無法訪問未映射的內存。內核不會允許您訪問該內存。 您只能訪問通過mmap映射的那部分內存。 我認爲使用可以明確使用remap_pfn_range函數來重新映射區域。

Linux mmap man page

改變 的映射上對應於 文件的添加或刪除的區域是不確定的頁面的底層文件的大小的影響。

0

不,你不能。

然而,如果你的目的是改變對飛你mmaped區,這裏有一些選擇:

A.在用戶空間,你可以使用mremap其擴大(或縮小)現有的內存映射。在內核空間中,在你的驅動程序中,你需要實現nopage()方法或者remap_pfn_range,但是remap_pfn_range有它的侷限性,即Linux只提供保留頁面,甚至不能重新映射正常地址,比如分配的那個通過get_free_page()