用户空间执行的代码是不能访问内核空间的,如当用户空间调用 read(fd,buf,len)时,到内核中会调用 sys_read,然后sysread找到应该具体调用的read函数,该系统调用和内核、为内核增加一个系统调用文章中有具体描述,最后由内核调用磁盘驱动获取数据 将数据写入buf。write(fd,buf,len)同理,最后由内核调用磁盘驱动将buf中的数据写入磁盘。
内核空间执行的代码也不直接操作用户空间,内核在读写用户空间内存时 先做权限检查,内核中提供了两个函数完成权限检查 并操作用户空间内存
long copy_to_user(void __user *to,
const void *from, unsigned long n)
to, 目标地址
取值范围 0~3G
from, 源数据地址
取值范围 3G~4G
n, 连续操作的字节数
返回值,拷贝失败的字节数
内核源码
static inline long copy_to_user(void __user *to, const void *from, unsigned long n)
{
might_sleep();
if (access_ok(VERIFY_WRITE, to, n))
return __copy_to_user(to, from, n);
else
return n;
}
long copy_from_user(void *to,
const void __user * from, unsigned long n)
to, 目标地址
取值范围 3G~4G
from, 源数据地址
取值范围 0~3G
n, 连续操作的字节数
返回值, 拷贝失败的字节数
static inline 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;
}