2013-05-12 33 views
3

我希望能夠將單個用戶空間地址映射到多個低內核內存塊。我有一個驅動程序,我使用pci_alloc_consistent()分配多個4MB塊。理想情況下,我希望用戶空間進程將8MB(即2個4MB塊)視爲映射到其虛擬地址空間的單個緩衝區。這可能在mmmap()中嗎?或者,有沒有辦法使用pci_alloc_consistent()(或其他apis,只要內存兼容dma)來分配大於4MB的內核內存塊?mmap可以處理Linux驅動程序中的非連續頁面範圍嗎?

我會很感激任何指針。 謝謝。

回答

1

看看功能vm_insert_page()remap_pfn_range() in mm/memory.c。 你可以找到一個例子:驅動器/媒體/用v412核心/ videobuf2-DMA-sg.c,功能vb2_dma_sg_mmap()

+0

我還不太清楚如何做到這一點。在我看來,我不能使用remap_pfn_range(),因爲我必須通過pci_alloc_consistent()分別分配緩衝區。也就是說,我正在處理2個不同的虛擬/物理地址。 – dczulak 2013-05-13 21:27:41

+0

vm_insert_page()似乎工作,但只有當我通過pci_alloc_consistent()分配的每個內存塊的內存塊上調用get_page()時。否則,只有第一個頁面與vm_insert_page()一起工作。我不太確定後果是什麼(每個緩衝區調用get_page()1280)。 – dczulak 2013-05-14 01:51:53

+0

'vm_insert_page()'插入一個頁面,因此您必須爲緩衝區中的每個頁面執行此操作。這就是VB2 DMA sg所做的。你應該'virt_to_page()'從虛擬地址檢索一個'page'。 Internallu,'vm_insert_page()'會做'get_page()'來增加引用計數器 – Federico 2013-05-14 06:23:12