zhandoushi的专栏

copy_to_user(),其在内核的原型是:

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

函数原型:

人生就像一杯没有加糖的咖啡,喝起来是苦涩的,

zhandoushi的专栏

相关文章:

你感兴趣的文章:

标签云: