copy_to_user(),其在内核的原型是:
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
{
if (access_ok(VERIFY_WRITE, to, n))
n = __copy_to_user(to, from, n);
return n;
}
其
功能是将内核空间的内容复制到用户空间,所复制的内容是从from来,到to去,复制n个位。其中又牵扯到两个函数:access_ok()和__copy_to_user(),其中access_ok()原型是:
#ifdef CONFIG_MMU
#define access_ok(type,addr,size) (likely(__range_ok(addr,size) == 0))
#else
static inline int access_ok(int type, const void *addr, unsigned long size)
{
extern unsigned long memory_start, memory_end;
unsigned long val = (unsigned long)addr;
return ((val >= memory_start) && ((val + size) < memory_end));
}其功能是检查用户空间是否合法,它的第一个参数:type,有两种类型:VERIFY_READ 和VERIFY_WRITE,前者为可读,后者可写,注意:如果标志为可写(VERIFY_WRITE)时,必然可读!因为可写是可读的超集。检查过程如下:addr为起始地址,size为所要复制的大小,那么从addr到addr+size则是所要检查的空间,如果它的范围在memory_start和memory_end之间的话,则返回真。
__copy_user(),这个函数才真正在做底层的复制工作。类似还有copy_from_user()。实现了内核空间与用户空间的相互复制。
本文详细解析了Linux内核中的copy_to_user函数,该函数用于将内核空间的数据复制到用户空间。文章介绍了其工作原理及其实现过程,并解释了access_ok()和__copy_to_user()这两个关键辅助函数的作用。
6837

被折叠的 条评论
为什么被折叠?



