1
我通過alloc_page(GFP_USER)
分配內存,並且我分配了多個頁面。 我需要做的,我會看到它作爲連續區域(我需要從它緩衝),所以我想撤銷它*(vm_beg + off)
。在內核空間中創建連續區域
我知道用戶空間中的mmap
是可能的,但我如何在內核空間中做到這一點?
我通過alloc_page(GFP_USER)
分配內存,並且我分配了多個頁面。 我需要做的,我會看到它作爲連續區域(我需要從它緩衝),所以我想撤銷它*(vm_beg + off)
。在內核空間中創建連續區域
我知道用戶空間中的mmap
是可能的,但我如何在內核空間中做到這一點?
如果您需要分配虛擬連續內存,那麼您可以使用vmalloc()
這樣做(更多信息here)。實際的物理內存可能是分散的,所以如果您打算在CPU MMU之外使用某個硬件塊(例如DMA,PCI總線)的緩衝區,那麼vmalloc()
可能不是您最好的選擇。
您可能應該使用kmalloc()
用於大多數目的(更多信息here)。區別在於vmalloc()
將始終修改頁表以獲取新內存(有點像userland中的mmap()
)。另一個區別是kmalloc()
給你物理上連續內存,並且通常比vmalloc()
更快,它必須始終修改頁表。
關於Linux內存的一個非常好的信息來源是Linux Device Drivers 3(特別是你的案例中的第15章),你可能會找到你內部大部分問題的答案。