+ -
当前位置:首页 → 问答吧 → copy_from_user vs memcpy

copy_from_user vs memcpy

时间:2010-12-12

来源:互联网

关于为什么不用memcpy,google到了个这:
Two reasons. First, an VA passed as argument of a syscall may
refer to a page which is not present in memory. In such case,
copy_from_user causes a controlled pagefault, which would trigger
an oops if you just accessed the VA. Second, on a few platforms
kernel and user VA overlap, and so there is no way to access
user VA outside of copy_from_user. It cannot be ignored because
the main platform, i386, has a similar mode, called "4:4 split".

看着好像有道理,呵呵。我也试了一下,memcpy在我试的情况下也可以用(建了个proc然后用那个write进行测试,结果是memcpy sprintf都可以,而且无论内核这边的buf是静态还是动态,> 4k || < 4k都行),所以memcpy只是会在某些情况下不能使用,但是哪些情况呢,上面说的user的地址不在页表里了,还有就是有些体系结构user的地址空间和kernel的有重叠。


不知这个解释是不是全部,或者大家谁知道在什么情况下会发生不在页表里,哪些体系结构地址空间有重叠?


主要是想拿出来讨论讨论,有兴趣的同学来说说

作者: unbutun   发布时间: 2010-12-12

回复 unbutun
个人认为copy_from_user和memcpy的区别主要就是:copy_from_user做了很多有效性检查。
至于你说的什么情况下页表会不存在,其中一种可能就是页表被交换到swap中了,因为用户态申请的空间在内存紧张的时候是最先被swap的。

作者: 瀚海书香   发布时间: 2010-12-12