免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4826 | 回复: 19

[内核模块] 如何将用户空间的虚拟地址传递给内核驱动程序 [复制链接]

论坛徽章:
0
发表于 2017-08-23 11:42 |显示全部楼层
在原来的程序设计中,流程为:
驱动层通过__get_free_pages申请4M的空间,通过remap_pfn_range + mmap的实现驱动与用户层的数据访问。 驱动层通过中断的方式从外设将数据写入该空间,用户通过查询方式查看驱动是否取到数据,若取到查copy到一个大数组中进入后序的处理。由于是单核的处理芯片,这种方式有个致命的缺点:
1、当用户来不及copy数据的时候,驱动层的数据会被覆盖,得到不完整的数据流(200M的图像数据)。
2、驱动层有一层数据copy,用户通过mmap又进行了一次数据copy,效率非常低。

现在我想只进行一次数据copy,通过用申请一个大空间(200M),将用户空间的虚拟地址映射到驱动层逻辑地址,这个整个过程只有驱动层一次的数据copy,就将数据填充到用户申请的空间了,不知这样是否可行,如何实现。

论坛徽章:
0
发表于 2017-08-23 11:43 |显示全部楼层
http://bbs.chinaunix.net/thread-2143560-1-1.html
这个是否可以参考一下?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-08-23 16:42 |显示全部楼层
回复 1# lijiehunan
内核态申请,用户态 mmap 能解决吗



论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2017-08-23 16:43 |显示全部楼层
回复 1# lijiehunan

反过来操作估计是有难度的。因为用户空间 alloc 的地址,都是经过 libc 处理的。

论坛徽章:
0
发表于 2017-08-26 10:13 |显示全部楼层
是的,反过来操作很麻烦,首先前提是我要一次性处理的数据量非常大,应用程序申请的存储空间没法保持其物理地址的连续性,如果参考链接地址的使用的方法的话,我只能申请N个页大小的空间,然后将每个空间的地址传递给驱动层,这几乎是不可行的。另外我的DDR只有512M,也没法申请高地址空间。

论坛徽章:
0
发表于 2017-08-26 10:14 |显示全部楼层
内核态申请空间大小在限,满足不了我的需求。

论坛徽章:
0
发表于 2017-08-26 10:23 |显示全部楼层
之前没怎么接触过Linux,不知道显卡驱动是如何处理大数据通讯的,我这个问题应该和它类似

论坛徽章:
0
发表于 2017-08-27 10:01 |显示全部楼层
在网上又查了资料,基本上无法将应用层大的内存地址直接传递给驱动层进行数据copy,不过有另一种可行的办法,就是在驱动层通过这二种方法申请连续的大块空间:
http://bbs.chinaunix.net/thread-1954277-1-1.html
1 采用预留的方式,在内核态用io_remap.
2 alloc_bootmem分配,要修改内核.在内核启动的时候分配.
驱动层直接将所有的数据copy到大块空间,通过mmap再传递给应用层,优点的驱动层不会发生丢数据的情况,不足是还是得进行二次的数据copy。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2017-08-31 08:23 |显示全部楼层
lijiehunan 发表于 2017-08-26 10:23
之前没怎么接触过Linux,不知道显卡驱动是如何处理大数据通讯的,我这个问题应该和它类似

imx显卡用mmap

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
发表于 2017-08-31 08:26 |显示全部楼层
回复 1# lijiehunan

中断里访问特定进程的用户态空间么?很难吧。用mmap不行么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP