copy_to_user和copy_from_user函数

 move_addr_to_kernel:拷贝sockaddr到内核空间。

int move_addr_to_kernel(void __user *uaddr, int ulen, struct sockaddr *kaddr) { if (ulen < 0 || ulen > sizeof(struct sockaddr_storage)) return -EINVAL; if (ulen == 0) return 0; if (copy_from_user(kaddr, uaddr, ulen)) return -EFAULT; return audit_sockaddr(ulen, kaddr); }

 

copy_from_user:从用户空间拷贝n字节到内核空间。

unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) { if (likely(access_ok(VERIFY_READ, from, n))) //检查from起开始的n字节能否访问 n = __copy_from_user(to, from, n); else memset(to, 0, n); return n; }

其中access_ok(VERIFY_READ, from, n)检查当前需要访问的地址空间,有没有被其他空间访问,如果当前进程被允许访问地址addr处的内存,函数返回真(1),否则为假(0)。

copy_to_user:完成内核空间到用户空间的复制。

unsigned long copy_to_user(void __user *to, const void *from, unsigned long n) { if (likely(access_ok(VERIFY_WRITE, to, n))) n = __copy_to_user(to, from, n); return n; }

你可能感兴趣的:(copy_to_user和copy_from_user函数)