免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liklstar

[内核模块] 在内核态创建一个队列并将该队列的句柄返回给用户态的调用者 [复制链接]

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-03-21 09:01 |显示全部楼层
liklstar 发表于 2014-03-20 18:51
我要的不仅仅是一种简单的用户与内核的通信方式,而是一种“直接”的、消除了“多次拷贝”、“上下文切 ...

我给的案例只是内核和用户态交互的一种方式,当然也可以通过这种方式直接传递数据,看你自己选择了。
我理解你说的零拷贝,其实就是通用的mmap /dev/mem就可以实现的,但是由于用户态和内核态之间需要传递相关控制信息,所以,需要有一种内核和用户态直接的交互方式,方式很多,就如上述链接中的共享内存,也可以用asuka2001帅哥的ioctl,都行~~

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2014-03-21 09:06 |显示全部楼层
asuka2001 发表于 2014-03-20 20:19
回复 20# liklstar

既然 mmap可以将设备寄存器暴露给用户空间,为什么不可以将一些页面暴露给用户空间。 ...

帅哥说的很详细,思路差不多(ioctl&共享内存)~,要害还在于mmap,我没表达清楚,汗~~

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
发表于 2014-03-21 09:32 |显示全部楼层
  标记下学习了。虽然分开了知道你们在讨论什么。但合在一起,我怎么就完全没听懂:wink:

论坛徽章:
6
季节之章:冬
日期:2015-01-20 17:18:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-12-20 06:20:00程序设计版块每日发帖之星
日期:2016-06-09 06:20:00每日论坛发贴之星
日期:2016-06-09 06:20:002016科比退役纪念章
日期:2017-01-12 14:08:57
发表于 2014-03-21 10:31 |显示全部楼层
humjb_1983 发表于 2014-03-21 09:06
帅哥说的很详细,思路差不多(ioctl&共享内存)~,要害还在于mmap,我没表达清楚,汗~~


还有一事不明,想向你和asuka2001请教:数据在用户态和内核态之间的拷贝到底在什么情况下发生?什么情况下没有?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-03-21 10:40 |显示全部楼层
回复 34# liklstar

用户进程向内核要求分配内存,那么数据存在于进程的用户空间中,不在内核空间中。这种时候必然需要从用户空间复制到内核空间。

只有当内核自身申请内存,或者把用户进程的内存映射进内核空间,才不需要复制数据!

论坛徽章:
6
季节之章:冬
日期:2015-01-20 17:18:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-12-20 06:20:00程序设计版块每日发帖之星
日期:2016-06-09 06:20:00每日论坛发贴之星
日期:2016-06-09 06:20:002016科比退役纪念章
日期:2017-01-12 14:08:57
发表于 2014-03-21 10:44 |显示全部楼层
本帖最后由 liklstar 于 2014-03-21 10:58 编辑
humjb_1983 发表于 2014-03-21 08:57
这里只涉及用户态和内核通信,使用这种共享内存的方式,可以实现你需要的"用户态和内核态直接传递控制信 ...


你说的:“...而实际网卡需要的数据区可以单独分配...”是指存放真正由网卡发送和接收的数据的缓存吧?按照你的意思,是不是这部分数据区也要在内核分配,然后mmap到用户进程以便进程操纵?

我是这样想的:能否在用户空间分配最终要传输的数据的缓冲区(描述符队列依然在内核态),之后将这些缓冲区作虚/实地址转换并锁定在内存中,即:注册内存,然后将这个虚-实对应关系存放在网卡板载内存(或内核空间)。当网卡发送/接收数据时查找这个对应关系,完成最终的收发。

这样作的好处是,当系统中有多个进程(比如:100个)与外界通信时,就不会发生内核空间紧张的问题了,是不是这样?

论坛徽章:
6
季节之章:冬
日期:2015-01-20 17:18:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-12-20 06:20:00程序设计版块每日发帖之星
日期:2016-06-09 06:20:00每日论坛发贴之星
日期:2016-06-09 06:20:002016科比退役纪念章
日期:2017-01-12 14:08:57
发表于 2014-03-21 10:51 |显示全部楼层
asuka2001 发表于 2014-03-21 10:40
回复 34# liklstar

用户进程向内核要求分配内存,那么数据存在于进程的用户空间中,不在内核空间中。这 ...


谢谢指点!你说的:“或者把用户进程的内存映射进内核空间”,这个是什么意思?用户进程虚地址空间怎么映射到内核空间啊?一般来说,这个映射是干什么用的呢?

论坛徽章:
6
季节之章:冬
日期:2015-01-20 17:18:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2015-12-20 06:20:00程序设计版块每日发帖之星
日期:2016-06-09 06:20:00每日论坛发贴之星
日期:2016-06-09 06:20:002016科比退役纪念章
日期:2017-01-12 14:08:57
发表于 2014-03-21 11:02 |显示全部楼层
asuka2001 发表于 2014-03-21 10:40
回复 34# liklstar

用户进程向内核要求分配内存,那么数据存在于进程的用户空间中,不在内核空间中。这 ...


内核申请了内存并向该内存写了数据,但用户空间没有这个数据,这时内核要向用户空间传输这个数据,这种情况不需要内存拷贝吗?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-03-21 11:37 |显示全部楼层
回复 37# liklstar

用户空间中一个 pte指向一个物理页面,内核也创建一个 pte塞入内核空间,让该 pte指向同样的一个物理页面!

内核将用户空间的页面映射进内核空间的用法我没研究过,有经验的人多共享下!

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2014-03-21 11:39 |显示全部楼层
回复 38# liklstar

同样一个物理页面而已,用户程序和内核通过不同的 VA访问,为什么需要复制!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP