copy_to_user,copy_from_user,get_user和put_user函数实现

1、static inline unsigned long __must_check 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;
}

2、static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
{
 if (access_ok(VERIFY_READ, from, n))
  n = __copy_from_user(to, from, n);
 else /* security hole - plug it */
  memset(to, 0, n);
 return n;
}
其中access_ok(VERIFY_READ, from, n)检查当前需要访问的地址空间,有没有被其他空间访问,如果当前进程被允许访问地址addr处的内存,函数返回真(1),否则为假(0)。

3、ifdef CONFIG_MMU,则


#define get_user(x,p)       \
 ({        \
  register const typeof(*(p)) __user *__p asm("r0") = (p);\
  register unsigned long __r2 asm("r2");   \
  register int __e asm("r0");    \
  switch (sizeof(*(__p))) {    \
  case 1:       \
   __get_user_x(__r2, __p, __e, 1, "lr");  \
          break;      \
  case 2:       \
   __get_user_x(__r2, __p, __e, 2, "r3", "lr"); \
   break;      \
  case 4:       \
          __get_user_x(__r2, __p, __e, 4, "lr");  \
   break;      \
  default: __e = __get_user_bad(); break;   \
  }       \
  x = (typeof(*(p))) __r2;    \
  __e;       \
 })

#define put_user(x,p)       \
 ({        \
  register const typeof(*(p)) __r2 asm("r2") = (x); \
  register const typeof(*(p)) __user *__p asm("r0") = (p);\
  register int __e asm("r0");    \
  switch (sizeof(*(__p))) {    \
  case 1:       \
   __put_user_x(__r2, __p, __e, 1);  \
   break;      \
  case 2:       \
   __put_user_x(__r2, __p, __e, 2);  \
   break;      \
  case 4:       \
   __put_user_x(__r2, __p, __e, 4);  \
   break;      \
  case 8:       \
   __put_user_x(__r2, __p, __e, 8);  \
   break;      \
  default: __e = __put_user_bad(); break;   \
  }       \
  __e;       \
 })
否则:

#define get_user(x,p) __get_user(x,p)
#define put_user(x,p) __put_user(x,p)

 

4、#define __get_user(x,ptr)      \
({         \
 long __gu_err = 0;      \
 __get_user_err((x),(ptr),__gu_err);    \
 __gu_err;       \
})


#define __put_user(x,ptr)      \
({         \
 long __pu_err = 0;      \
 __put_user_err((x),(ptr),__pu_err);    \
 __pu_err;       \
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值