2012-02-04 34 views
1

我通過alloc_page(GFP_USER)分配內存,並且我分配了多個頁面。 我需要做的,我會看到它作爲連續區域(我需要從它緩衝),所以我想撤銷它*(vm_beg + off)在內核空間中創建連續區域

我知道用戶空間中的mmap是可能的,但我如何在內核空間中做到這一點?

回答

5

如果您需要分配虛擬連續內存,那麼您可以使用vmalloc()這樣做(更多信息here)。實際的物理內存可能是分散的,所以如果您打算在CPU MMU之外使用某個硬件塊(例如DMA,PCI總線)的緩衝區,那麼vmalloc()可能不是您最好的選擇。

您可能應該使用kmalloc()用於大多數目的(更多信息here)。區別在於vmalloc()將始終修改頁表以獲取新內存(有點像userland中的mmap())。另一個區別是kmalloc()給你物理上連續內存,並且通常比vmalloc()更快,它必須始終修改頁表。

關於Linux內存的一個非常好的信息來源是Linux Device Drivers 3(特別是你的案例中的第15章),你可能會找到你內部大部分問題的答案。