基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析

基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析

ID:47353861

大小:76.55 KB

页数:8页

时间:2019-08-08

基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析_第1页
基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析_第2页
基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析_第3页
基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析_第4页
基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析_第5页
资源描述:

《基于ARM 构架(带MMU)的copy_from_user与copy_to_user详细分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、基于ARM构架(带MMU)的copy_from_user与copy_to_user详细分析在学习Linux内核驱动的时候,一开始就会碰到copy_from_user和copy_to_user这两个常用的函数。这两个函数在内核使用的非常频繁,负责将数据从用户空间拷贝到内核空间以及将数据从内核空间拷贝到用户空间。在4年半前初学Linux内核驱动程序的时候,我只是知道这个怎么用,并没有很深入的分析这两个函数。这次研究内核模块挂载的时候,又碰到了它们。决定还是认真跟踪一下函数。首先这两个函数的原型在arch/arm/include/asm/uacc

2、ess.h文件中:1staticinlineunsignedlong__must_checkcopy_from_user(void*to,constvoid__user*from,unsignedlongn)2{3if(access_ok(VERIFY_READ,from,n))4n=__copy_from_user(to,from,n);5else/*securityhole-plugit*/6memset(to,0,n);7returnn;8}910staticinlineunsignedlong__must_checkcopy_to_

3、user(void__user*to,constvoid*from,unsignedlongn)11{12if(access_ok(VERIFY_WRITE,to,n))1n=__copy_to_user(to,from,n);2returnn;3}这两个函数从结构上来分析,其实都可以分为两个部分:1、首先检查用户空间的地址指针是否有效(难点)2、调用__copy_from_user和__copy_to_user函数在这个分析中,我们先易后难。首先看看具体数据拷贝功能的__copy_from_user和__copy_to_user函数对于A

4、RM构架,没有单独实现这两个函数,所以他们的代码位于include/asm-generic/uaccess.h4/*5*带有MMU的构架应该覆盖这两个函数6*/7#ifndef__copy_from_user8staticinline__must_checklong__copy_from_user(void*to,9constvoid__user*from,unsignedlongn)10{11if(__builtin_constant_p(n)){12switch(n){13case1:1*(u8*)to=*(u8__force*)fro

5、m;2return0;3case2:4*(u16*)to=*(u16__force*)from;5return0;6case4:7*(u32*)to=*(u32__force*)from;8return0;9#ifdefCONFIG_64BIT10case8:11*(u64*)to=*(u64__force*)from;12return0;13#endif14default:15break;16}17}1819memcpy(to,(constvoid__force*)from,n);20return0;21}22#endif2324#ifn

6、def__copy_to_user25staticinline__must_checklong__copy_to_user(void__user*to,26constvoid*from,unsignedlongn)27{28if(__builtin_constant_p(n)){29switch(n){30case1:31*(u8__force*)to=*(u8*)from;32return0;33case2:34*(u16__force*)to=*(u16*)from;35return0;1case4:2*(u32__force*)to=

7、*(u32*)from;3return0;4#ifdefCONFIG_64BIT5case8:6*(u64__force*)to=*(u64*)from;7return0;8#endif9default:10break;11}12}1314memcpy((void__force*)to,from,n);15return0;16}17#endif点击(此处)折叠或打开18GCC的内建函数__builtin_constant_p用于判断一个值是否为编译时常数,如果参数值是常数,函数返回1,否则返回0。从这两个函数中可以看出其实结构是一样的,首先

8、看看n是不是常数,如果是并为1、2、4、8(64bit)则直接就用一个赋值语句拷贝数据。如果不是常数或n过大,则使用memcpy函数。而这个memcpy函数位于lib/strin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。