copy_to_user与mmap的工作原理

来源:互联网 发布:bt软件 编辑:程序博客网 时间:2024/06/08 03:20

copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低
mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做),另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间。

 

access_ok(VERIFY_WRITE, to, n)

它是用来检查参数中一个指向用户空间数据块的指针是否有效,如果有效返回非零,否则返回零。

 

 

参数to的时候有个__user限定,这个在~/include/linux/compiler.h中有如下定义:

# define __user __attribute__((noderef, address_space(1)))

表示这是一个用户空间的地址,即其指向的为用户空间的内存

 

__attribute__是gnu c编译器的一个功能,它用来让开发者使用此功能给所声明的函数或者变量附加一个属性,以方便编译器进行错误检查,其实就是一个内核检查器。

 

原创粉丝点击