簡體   English   中英

我的 PCI 設備驅動程序如何將 PCI memory 重新映射到用戶空間?

[英]How can my PCI device driver remap PCI memory to userspace?

我正在嘗試為 QEMU 上的虛擬 PCI 設備實現 PCI 設備驅動程序。 設備將 BAR 區域定義為 RAM,驅動程序可以執行 ioremap() 該區域並毫無問題地訪問它。 下一步是將此區域(或其中的一部分)分配給用戶應用程序。 為此,我還實現了 an.mmap function 作為我的驅動程序文件操作的一部分。 這個 mmap 只是簡單地使用了 remap_pfn_range,但它也傳遞了之前 ioremap() 返回的 memory 指針的 pfn。

但是,在運行用戶空間應用程序時,mmap 是成功的,但是當應用程序嘗試訪問 memory 時,它被殺死並且我收到以下 dmesg 錯誤。

" a.out:地址 7f66248b8000 處損壞的頁表

..一些頁表信息..

壞頁表:000f [#2] SMP NOPTI

..和核心轉儲..“有誰知道我做錯了什么?我錯過了一步嗎?或者它可能是特定於 QEMU 的錯誤?我正在運行 x86_softmmu 作為我的 QEMU 配置,而我的 kernel 是 4.14

我已經解決了這個問題並通過驅動程序將 map PCI memory 管理到用戶空間。 正如@IanAbbott暗示的那樣,我已經更改了我在自定義->mmap()中使用的pfn remap_pfn_range() function 的 pfn 輸入。

原來是:

io_remap_pfn_range(vma, vma->vm_start, pfn, vma->vm_end - vma->vm_start, vma->vm_page_prot));

其中pfn是從ioremap()返回的緩沖區指針的結果。 我將pfn更改為:

pfn = pci_resource_start(pdev, BAR) >> PAGE_SHIFT;

這基本上指向 BAR 指向的實際起始地址。 我的工作remap_pfn_range() function 現在是:

io_remap_pfn_range(vma, vma->vm_start, pci_resource_start(pdev, BAR) >> PAGE_SHIFT, vma->vm_end - vma->vm_start,vma->vm_page_prot);

我確認它可以通過對驅動程序中的緩沖區指針進行一些虛擬寫入,然后在我的用戶空間應用程序中讀取並執行一些寫入來確認它的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM