内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)相关的知识,希望对你有一定的参考价值。

1、copy_to_user & copy_from_user

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

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

(1)copy_to_user:从设备拷贝数据到用户空间;
(2)copy_from_user:从用户空间拷贝数据到设备上;
补充:用__user修饰的指针说明指向用户空间的内存;函数成功则返回0,否则返回没有拷贝成功的数据字节数;

2、为什么不能用memcpy( )直接拷贝?

(1)内核和用户程序之间是独立的地址空间,用户程序都是用的虚拟地址,同样的内存地址在用户空间和内核空间代表不同的意义;
(2)在内核和用户空间之间拷贝数据,是要考虑安全性的,比如要检查用户空间传入地址的有效性,不能因为用户空间传递的无效地址导致内核死机;
(3)内核对用户空间的访问时候限制的,不能让用户程序随意访问内核空间;

以上是关于内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)的主要内容,如果未能解决你的问题,请参考以下文章

[转] copy_to_user和copy_from_user两个函数的分析

copy_from_user的疑问

Linux中的零拷贝技术

Linux用户与内核空间交互—ioctl

Linux用户与内核空间交互—ioctl

put_user()函数和get_usr()函数介绍