内核空间和用户空间数据交换

内核空间和用户空间数据交换

Linux系统中使用了虚拟地址,内核和应用使用不同的地址空间,因此需要专门的机制来实现数据的交换

1.Linux数据交换的方式

内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs 和 relayfs。

2.系统调用

2.1 access_ok()

access_ok(type,addr,size)

用于检查指定地址是否可以访问。

参数type为访问方式,可以为

  • VERIFY_READ(可读)

  • VERIFY_WRITE(可写)

addr为要操作的地址,size为要操作的空间大小(以字节计算),函数返回1,表示可以访问,0表示不可以访问

2.2 copy_to_user()和copy_from_user()

//用于把数据从用户空间拷贝至内核空间
unsigned long copy_from_user(void *to, const void user *from, unsigned long n)
//用于把数据从内核空间拷贝至用户空间
unsigned long copy_to_user(void user *to, const void *from, unsigned long n)

这两个函数在内部调用access_ok()进行地址检查,返回值为未能拷贝的字节数

2.3 get_user()和put_user()

这是两个宏,用于一个基本数据(1,2,4字节)的拷贝

//用于把数据从用户空间拷贝至内核空间
get_user(x,p)
//用于把数据从内核空间拷贝至用户空间
put_user(x,p)

x为内核空间的数据,p为用户空间的指针,这两个宏会调用access_ok()进行地址检查。拷贝成功,返回0,否则返回-EFAULT

2.4 不进行地址检查

__copy_to_user()和__copy_from_user()功能与copy_to_user()和copy_from_user()相同,不进行地址检查,两个宏__get_user()和__put_user()功能与get_user()和put_user()相同,不进行地址检查。

猜你喜欢

转载自blog.csdn.net/wyy626562203/article/details/81300242
今日推荐