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

cwangsh 2018-06-29 10:02:02

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

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

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

多谢指导 :-)
...全文
268 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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个积分怎么退还啊?
回复
相关推荐
发帖
驱动开发/核心开发
创建于2007-09-28

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
申请成为版主
帖子事件
创建了帖子
2018-06-29 10:02
社区公告
暂无公告