前面的一篇文章中简单的描写叙述了一下内存映射的内容,http://blog.csdn.net/codectq/article/details/25658813,这篇文章作为用户把内存规划好之后,在用户空间使用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频繁失效,从而大大节约时间。

linux内存操作----kernel 3.5.X copy_from_user()和copy_to_user()的更多相关文章

  1. linux内存操作--ioremap和mmap学习笔记

    最近做一些相关的视频输出,对于保留framebuffer内存使用情况不是很清楚,现在找了一些资料整理出,准备使用.if (希望看到使用)  goto   用法: 对于一个系统来讲,会有非常多的外设,那 ...

  2. linux内存操作--ioremap和mmap

    最近在做视频输出相关的东西,对于预留给framebuffer的内存使用不是很清楚,现在找到一些资料整理一下,以备使用.if (想看使用方法)  goto   使用方法: 对于一个系统来讲,会有很多的外 ...

  3. linux 内存操作相关命令

    清理内存 echo 1 > /proc/sys/vm/drop_caches 查看内存使用情况 free –m 查看内存条数命令: dmidecode |grep -A16 "Memo ...

  4. Linux内存运维操作及常用命令

    Linux内存运维操作及常用命令 1.问题诊断 1.1 什么是 Linux 服务器 Load Average? 1.2如何查看 Linux 服务器负载? 1.3服务器负载高怎么办? 1.4如何查看服务 ...

  5. Linux内存管理 (7)VMA操作

    专题:Linux内存管理专题 关键词:VMA.vm_area_struct.查找/插入/合并VMA.红黑树. 用户进程可以拥有3GB大小的空间,远大于物理内存,那么这些用户进程的虚拟地址空间是如何管理 ...

  6. Linux内存技术分析(下)

    Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...

  7. MySQL 调优基础(二) Linux内存管理

    进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...

  8. Linux内存模型

    http://blog.csdn.net/sunyubo458/article/details/6090946 了解linux的内存模型,或许不能让你大幅度提高编程能力,但是作为一个基本知识点应该熟悉 ...

  9. linux内存——/proc/sys/vm/drop_caches

      原贴:http://www.linuxfly.org/post/320/ http://blog.csdn.net/chinalinuxzend/article/category/265273/2 ...

随机推荐

  1. mmc加工配套问题

    题目如下,本题还有其它解.

  2. Java中随机数生成的两种方法,以及math的floor

    1.Math的random方法,调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选 ...

  3. [HeadFirst-HTMLCSS入门][第九章盒模式]

    新属性 line-height 行间距 line-height: 1.6em; border 边框 属性值 solid 实线 double 双实线 groove 一个槽 outset 外凸 inset ...

  4. 《JavaScript 闯关记》之基本包装类型

    为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean.Number 和 String.实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象 ...

  5. <modules runAllManagedModulesForAllRequests="true" />(转1)

    最近在使用 MVC 开发的时候,遇到一个对我来说“奇怪的问题”,就是使用 BundleTable 进行 CSS.JS 文件绑定,然后使用 Styles.Render.Scripts.Render 进行 ...

  6. 真机调试以及“Could not find Developer Disk Image”问题解决方案

    真机测试步骤 1.运行Xcode,Xcode打开后,点左上角菜单'Xcode',点'Preferences'. 2.在打开的窗口中,点'Accounts',切换到账号页,然后点下面的'+'号,在弹出菜 ...

  7. 循环小数 UVa202

    输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度. 例如,a=5,b=43,小数表示为0.(1162790697674418 ...

  8. 安卓tabhost和子Activity通信方法

    发现很多同学在问这个问题 1个tabhost对应的类假设是T,假设包含2个子tab,每个是1个activity,假设叫a,b,对应的类假设是A和B 那么有这几个问题 1.a如何调用b的方法,或者说发送 ...

  9. [转载]Silverlight实用窍门系列:71.Silverlight的Style

    本文版权归作者和博客园共有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 原文链接:http://www.cnblogs.com/chengx ...

  10. 为什么在CSS中不要再使用@import

    http://www.stevesouders.com/blog/2009/04/09/dont-use-import/为什么在CSS中不要再使用@import