免费注册 查看新帖 |

Chinaunix

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

请教个关于copy_from_user的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-23 21:55 |只看该作者 |倒序浏览
新手,有个疑问,google了半天也没找到答案。跟大家讨论一下,请知道的不吝指教

应用程序用malloc分配内存,然后给内核的copy_from_user用, 为什么能正常工作呢?

下面是一些我的理解:
1. malloc后并没有真正分配物理内存,而是要在使用的时候才会分配(do_page_fault), 对么?
2. 所以我觉得copy_from_user中用到malloc的内存应该会出错啊?
3. copy_from_user的fixup,我理解只是在使用非法的内存或没分配的内存时,让copy_from_user返回错误值退出。所以fixup似乎不能解决malloc的问题啊?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2012-04-23 23:10 |只看该作者
   感觉你的逻辑是不是有点问题: malloc出来的内存没有被初始化过直接让copy_from_user调用? 你这是打算传递什么给内核呢。。

论坛徽章:
0
3 [报告]
发表于 2012-04-24 08:36 |只看该作者
malloc出来的内存,让copy_from_user拷贝到内核内存。

论坛徽章:
0
4 [报告]
发表于 2012-04-24 12:11 |只看该作者
上周才看copy_from_user,LZ可以看毛德操情景分析250页讲解这个问题。还有我认为malloc分配的内存一般会马上使用,怎么会没有建立虚拟内存到物理内存的映射呢?那样的话系统的效率太低了!

论坛徽章:
0
5 [报告]
发表于 2012-04-24 12:16 |只看该作者
谢谢!
我看了情景分析,但没找到我想要的答案。

我理解,malloc的内存,要在真正使用的时候,才会关联物理内存(page on demand)。

论坛徽章:
0
6 [报告]
发表于 2012-04-24 16:38 |只看该作者
我的理解是:不管异常发生在什么地方,都会触发do_page_fault、都会尝试去修复该异常(比如设置页表项、分配页面、从磁盘读数据、等)
刚malloc而没有建立映射的内存,可以在这里得到修复(也就是为其建立映射)

至于fixup,那是异常无法修复的情况下使用的,目的是让处理流程跳过触发异常的内核代码。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
7 [报告]
发表于 2012-04-24 18:07 |只看该作者
kouu是正解!

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2012-04-24 21:11 |只看该作者
这个地方倒是ULK讲的稍微详细一点。

这这种情况属于:内核态发生page fault,fault address在3G之下且位于进程某段有效地址空间之内,相关权限也OK。这时会分配内在建立页表神马神马,然后继续恢复运行。

Fix-up发生时:内核态发生page fault, fault address在3G之下,但是不在进程的任何有效地址空间之内或权限有问题。这时才会去找相应fixup code并执行。

论坛徽章:
0
9 [报告]
发表于 2012-04-25 10:36 |只看该作者
多谢楼上的回答,听上去很有道理,呵呵

论坛徽章:
0
10 [报告]
发表于 2012-04-25 11:54 |只看该作者
本帖最后由 MagicBoy2010 于 2012-04-25 11:56 编辑

以前写的一篇文章,希望能有点参考作用:
http://www.embexperts.com/forum. ... &extra=page%3D2

"我后来想能不能想个办法验证一下,在网上看到有人说用户空间的malloc是先分配虚拟空间,用到的时候才映射物理地址。这正好满足我们的要求,结果不是很理想,我不知道这个malloc到底是不是具有类似copy-on-write这样大的特性,总之memcpy对这种情况没有报任何异常。那就干脆来狠的,直接估摸着一个可能还没被映射的用户空间的虚地址,传递给了内核空间的驱动程序,于是问题来了:memcpy发生了oops,copy_from_user正常运行了。"

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP