copy_to_user()函数

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值