copy_from_user/copy_to_user函数中的buf參数释疑

从開始了解内核開始就一直在疑惑

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

这里面的from指针是什么?从用户空间的read到内核空间fops中的read函数过来后,这个值是否经过了转换?是物理地址还是直接是用户进程地址空间中的虚拟地址?

今天特地做了个实验,最后得出答案是后者,from的值就是用户进程地址空间中的虚拟地址。

kernel要想得到详细的物理地址还须要进行一系列的权限检查,最后经过页表转换才行

这是在用户空间进行的測试。

代码是

printf("the address in userspace: %x\n", yourmsg);

在用户空间输出地址结果例如以下:

而在内核模块中的代码是:

printk(KERN_ALERT "in kernel space: %x\n", buf);

结果输出例如以下:

能够看到无论在内核空间还是进程空间,值都是bfad8554。得证。

时间: 2024-10-22 02:19:47

copy_from_user/copy_to_user函数中的buf參数释疑的相关文章

copy_from_user/copy_to_user函数中的buf参数释疑

从开始了解内核开始就一直在疑惑 unsigned long copy_to_user(void __user *to, const void *from, unsigned long n); 这里面的from指针是什么?从用户空间的read到内核空间fops中的read函数过来后,这个值是否经过了转换?是物理地址还是直接是用户进程地址空间中的虚拟地址? 今天特地做了个实验,最后得出答案是后者,from的值就是用户进程地址空间中的虚拟地址. kernel要想得到具体的物理地址还需要进行一系列的权限

OpenCV中的SVM參数优化

SVM(支持向量机)是机器学习算法里用得最多的一种算法.SVM最经常使用的是用于分类,只是SVM也能够用于回归,我的实验中就是用SVM来实现SVR(支持向量回归). 对于功能这么强的算法,opencv中自然也是有集成好了,我们能够直接调用.OpenCV中的SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(Lin Chih-Jen)等开发设计的一个简单.易于使用和高速有效的SVM模式识别与回归的软件包. 网上讲opencv中SVM使用的文章有非常多,但讲SVM參数优化的文章却

iOS 处理方法中的可变參数

## iOS 处理方法中的可变參数 近期写了一个自己定义的对话框的demo,想模仿系统的UIAlertView的实现方式.对处理可变參数的时候,遇到了小问题,于是谷歌了一下.写下了处理问题的方法.记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBu

Extjs4.2 ajax请求url中传中文參数乱码问题

今天有个需求须要在url中传入中文參数.结果在后台取得时出现乱码,怀疑可能是编码问题.上网查询了资料,试了几种办法.发现有一种可行,记录在此,以便查阅. url中用encodeURI 进行2次编码: Ext.Ajax.request({ url:"updateadminuser.do?"+userid+"&uname="+encodeURI(encodeURI(uname)), success:function (response) { store.load

标C编程笔记day06 动态分配内存、函数指针、可变长度參数

动态分配内存:头文件 stdlib.h malloc:分配内存 calloc:分配内存,并清零 realloc:调整已分配的内存块大小 演示样例: int *p=(int *) malloc(3*sizeof(int));//分配内存,成功返回首地址,失败返回NULL free(p);p=NULL;//释放分配的内存,并改动指针的值,避免出现野指针(指向一个地址,但地址已被回收) const 与指针: const int *p; //指针可变,指针相应的数据不可改动 int * const p;

c 语言函数可变參数的处理

/************************************************************************* > File Name: va_list.c > Author: zshh0604 > Mail: [email protected] > Created Time: 2014年10月14日 星期二 15时16分09秒 **********************************************************

管理线程之向线程函数传递參数

向线程函数传递參数在构造线程对象时就可以完毕.可是要记住,默认情况下是把參数复制到线程内部,即使在函数中使用的是引用.比如 void f(int i,std::string const &s); std::thread t(f,3,"hello"); 上面代码中,函数f的第二个參数是std::string,传递的是char const *会转换为string. 当使用指针指向自己主动变量时.要特别注意: void f(int i, std::string const&

命令行參数选项处理:getopt()及getopt_long()函数使用

在执行某个程序的时候,我们通常使用命令行參数来进行配置其行为.命令行选项和參数控制 UNIX 程序,告知它们怎样动作. 当 gcc的程序启动代码调用我们的入口函数 main(int argc,char *argv[]) 时,已经对命令行进行了处理.argc 參数包括程序參数的个数,而 argv 包括指向这些參数的指针数组. 程序的參数能够分为三种:选项.选项的关联值,非选项參数. 比如: $gcc getopt_test.c -o testopt getopt_test.c是非选项參数.-o是选

Python学习笔记7:函数对象及函数对象作參数

一.lambda函数 比如: fun1 = lambda x,y: x + y print fun1(3,4) 输出:7 lambda生成一个函数对象.该函数參数为x,y,返回值为x+y.函数对象赋给func. func的调用与正常函数无异. 上面的代码等价于: def fun2(x, y): return x + y 二.函数作为參数 函数能够作为一个对象.进行參数传递. 比如: fun = lambda x ,y : x+y def runFun(fun, a, b): print fun(