关于PCIe设备驱动读取设备某个特定缓冲区的问题

cwangsh 2018-06-29 10:02:02

请教大家一个关于PCIe设备驱动开发的问题。我有一个特殊用途的卡,卡上有固定数量(比如六个)的缓存区域。主机上有六个进程需要分别处理各自对应的缓存区里的数据。一种简单的做法是用一个分发进程调用驱动,把卡上六个缓存区的数据分发到六个进程各自的内存空间,但这会增加内存拷贝的次数。比如,数据先由卡读入到驱动程序的内核空间,然后内核空间的数据被拷贝到分发进程的内存,然后分发进程再把数据分别拷贝到六个进程的各自用户空间。

我的想法是,如果设备驱动支持传入一个参数,比如 六个进程各自执行 read(设备句柄,缓冲区编号,写入的目标地址,字节数量等),这样,每个进程把卡上的数据读入到各自进程的内存空间,可以减少一次内存拷贝的时间,尤其数据量大时很有意义,因为我的应用对时延要求很高。

我的问题是,linux或windows的驱动开发,是否支持自定义的参数传入?比如这个缓冲区编号,这个编号决定了驱动程序要读的那个区域。

多谢指导 :-)
...全文
339 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
curious_cat 2018-07-19
  • 打赏
  • 举报
回复
时延要求很高时只能使用DMA传输, 下面以windows WDF内核驱动为例:
1. 应用程序申请用户态内存作为缓冲区;
2. 使用ReadFile或DeviceIoControl读取设备数据,这些API传入应用程序分配的缓冲区指针;
3. 驱动程序里面接收到这些I/O请求后,锁定该缓冲区,获取其对应的物理地址;将物理地址填充到DMA控制器里面,启动DMA传输数据到用户分配的缓冲区。
4. DMA传输完成后,完成这些I/O请求,ReadFile或DeviceIoControl返回。

以上是同步I/O的处理过程,使用异步I/O会更复杂一点,但是更灵活。

cwangsh 2018-07-03
  • 打赏
  • 举报
回复
居然没有人能回答?那我的50个积分怎么退还啊?

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧