博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()
阅读量:6967 次
发布时间:2019-06-27

本文共 2163 字,大约阅读时间需要 7 分钟。

前面的一篇文章中简单的描写叙述了一下内存映射的内容,,这篇文章作为用户把内存规划好之后,在用户空间使用IOCTL对设备进行控制时的经常使用函数的代码摘录。兴许我会把这部分完好起来。

#ifdefCONFIG_MMU

externunsigned long __must_check __copy_from_user(void *to, const void __user *from,unsigned long n);

externunsigned long __must_check __copy_to_user(void __user *to, const void *from,unsigned long n);

externunsigned long __must_check __copy_to_user_std(void __user *to, const void*from, unsigned long n);

externunsigned long __must_check __clear_user(void __user *addr, unsigned long n);

externunsigned long __must_check __clear_user_std(void __user *addr, unsigned longn);

#else

#define__copy_from_user(to,from,n)

(memcpy(to, (void __force *)from, n),0)

#define__copy_to_user(to,from,n)

(memcpy((void __force *)to, from, n),0)

#define__clear_user(addr,n)

 

(memset((void __force *)addr, 0, n), 0)

#endif

 

externunsigned long __must_check __strncpy_from_user(char *to, const char __user*from, unsigned long count);

externunsigned long __must_check __strnlen_user(const char __user *s, long n);

 

staticinline unsigned long __must_check copy_from_user(void *to, const void __user*from, unsigned long n)

{

if (access_ok(VERIFY_READ, from, n))

n = __copy_from_user(to, from, n);

else /* security hole - plug it */

memset(to, 0, n);

return n;

}

 

staticinline unsigned long __must_check copy_to_user(void __user *to, const void*from, unsigned long n)

{

if (access_ok(VERIFY_WRITE, to, n))

n = __copy_to_user(to, from, n);

return n;

}

 

在新的内核中,改动了这部分代码。部分网上可以查到的资料还一直以非常老的内核版本号在说明。实在受不了有些对新内核解说的文章不负责任的加入链接。

./arch/arm/lib/uaccess.S:288:/*Prototype: unsigned long __copy_from_user(void *to,const void *from,unsignedlong n);

./arch/arm/lib/uaccess.S:307:ENTRY(__copy_from_user)

./arch/arm/lib/uaccess.S:547:ENDPROC(__copy_from_user)

copy_to_user与mmap的工作原理

copy_to_user在每次拷贝时须要检測指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,并且每次都会拷贝一次数据,频繁訪问内存,因为虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度减少  

  mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检測其地址的合法性(合法性交由CPU页保护异常来做),还有一方面是内核下直接操作mmap地址,能够不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap通常是将一段连续的物理地址映射成一段虚拟地址,当然,也能够将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,不管怎样,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间。

转载地址:http://lbisl.baihongyu.com/

你可能感兴趣的文章
菜鸟编译Linux内核
查看>>
敏友的【敏捷个人】有感(16): 成为一个敏捷的人
查看>>
金山快盘+TortoiseSVN构建版本控制仓库
查看>>
Oracle ORA-03137: TTC protocol internal error : [12333] 故障分析
查看>>
IE浏览器下web调试工具之--IE WebDeveloper介绍
查看>>
交换两个变量值的方法汇总
查看>>
Apache、php、mysql默认安装路径
查看>>
linux下访问ftp服务器和文件传输
查看>>
CentOS下部署java quartz job
查看>>
唐僧、悟空、白骨精的信 悟空你一定Hold住啊
查看>>
jQuery.ptTimeSelect 时间控件
查看>>
Redis 在Centos Linux 上的启动脚本
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记目录
查看>>
《JavaScript高级程序设计》读书笔记(九):本地对象Array
查看>>
php 中文字符串截取子串
查看>>
从4.8.5版本升级到FastReport 4.10.1后,中文菜单有乱码,有的没有显示
查看>>
Jvascript 弹出层
查看>>
Sharepoint学习笔记—ECMAScript对象模型系列-- 3、如何查看SP object的所有方法(method)...
查看>>
信息安全大赛出的题目
查看>>
PHP&Javascript&CSS&jQuery常用知识大全(整理+原创)
查看>>