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()。实现了内核空间与用户空间的相互复制。