免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3874 | 回复: 2
打印 上一主题 下一主题

关于内核与用户地址空间的问题,期待解惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-07 18:23 |显示全部楼层 |倒序浏览
在写字符驱动时,发现一个不能理解的问题:
实现读写时,使用copy_to_user或copy_from_user来在内核与用户之间传递参数,但是我们可以在ioctl中用第三个参数传递一个结构体给内核
问题是:在ioctl中使用的地址却是用户传递过来的地址(是用户将地址以一个长整型值传递过来的,用ioctl函数中的第三个参数),并且ioctl函数用这个地址直接去找对应的结构体,居然能找到用户赋值过的那个结构体~感觉这个有点奇怪了,内核怎么会认识用户传过来的地址呢(内核地址空间跟用户的是不一样的嘛)?那如果内核能直接使用用户传递的地址的话,我们干吗还去用copy_to_user这样的函数呢?直接传过来不就好了?
想不明白了,请各位指教下下~~
3Q~

论坛徽章:
0
2 [报告]
发表于 2008-10-07 21:08 |显示全部楼层
没错,好象系统调用就是通过copy_from_user这样的函数来传递参数的吧。

但是我不能理解的一点是:
我通过ioctl从用户传递一个结构体的地址(注意这里参数传的地址是用户空间的逻辑地址,如0xb******)到内核,在驱动程序中直接使用这个参数作为起始地址去读取结构体里面的内容,这样为什么能读到正确的内容呢?我确实在驱动程序中把读取结构体内容的起始地址打印出来,居然是跟用户传递时的地址值一样,也就是0xb*******这样的地址。
按理来说内核应该不认识像0xb******这样的逻辑地址啊,内核中的逻辑地址应该是0xc*******的撒。

论坛徽章:
0
3 [报告]
发表于 2008-10-08 09:48 |显示全部楼层

原来是这样啊!就是说内核是0~4G的逻辑地址都可以使用的咯~

那这样的话,我觉得很多地方我们都可以不管内核空间和用户空间啊,也不需要用copy_from_user和copy_to_user来传递参数值了(当然,也许像你说的那样,这种方式不适合传大量数据;但内核直接使用用户地址这种方式确实是没有问题的?),我改了下驱动,在read和write中也不用copy_from_user这样的API来做,而是直接用用户传过来的地址,结果也是对的!

我想我应该具体了解下copy_from_user这样的API到底做了什么事情才行~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP