小编Jor*_*lon的帖子

Linux内核设备驱动程序从设备DMA到用户空间内存

我希望尽快将支持DMA的PCIe硬件设备中的数据导入用户空间.

问:如何将"使用/和/通过DMA传输直接I/O连接到用户空间"

  1. 通过LDD3读取,似乎我需要执行一些不同类型的IO操作!?

    dma_alloc_coherent给我一个可以传递给硬件设备的物理地址.但是在传输完成时需要设置get_user_pages并执行copy_to_user类型调用.这似乎是浪费,要求设备DMA进入内核内存(充当缓冲区),然后再将其传输到用户空间.LDD3 p453:/* Only now is it safe to access the buffer, copy to user, etc. */

  2. 我理想的是一些记忆:

    • 我可以在用户空间中使用(也许通过ioctl调用请求驱动程序来创建DMA'able内存/缓冲区?)
    • 我可以从物理地址获取传递给设备,以便所有用户空间必须执行的是对驱动程序执行读取操作
    • read方法将激活DMA传输,阻塞等待DMA完成中断并随后释放用户空间读取(用户空间现在可以安全使用/读取存储器).

我是否需要单页流映射,设置映射和用户空间缓冲区映射get_user_pages dma_map_page

到目前为止,我的代码get_user_pages在用户空间的给定地址设置(我称之为直接I/O部分).然后,dma_map_page用一个页面get_user_pages.我将设备的返回值dma_map_page作为DMA物理传输地址.

我使用一些内核模块作为参考:drivers_scsi_st.cdrivers-net-sh_eth.c.我会看看infiniband代码,但无法找到哪一个是最基本的!

提前谢谢了.

linux linux-device-driver linux-kernel dma

30
推荐指数
3
解决办法
4万
查看次数

标签 统计

dma ×1

linux ×1

linux-device-driver ×1

linux-kernel ×1