微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux内核中的get_user和put_user

linux内核中的get_user和put_user

时间:11-22 来源:互联网 点击:

返回0,否则返回-EFAULT。下面给出它们的定义(linux/include/asm-arm/uaccess.h)。

[plain]view plaincopyprint?

  1. externint__put_user_1(void*,unsignedint);
  2. externint__put_user_2(void*,unsignedint);
  3. externint__put_user_4(void*,unsignedint);
  4. externint__put_user_8(void*,unsignedlonglong);
  5. externint__put_user_bad(void);
  6. #define__put_user_x(__r2,__p,__e,__s)\
  7. __asm____volatile__(\
  8. __asmeq("%0","r0")__asmeq("%2","r2")\
  9. "bl__put_user_"#__s\
  10. :"=&r"(__e)\
  11. :"0"(__p),"r"(__r2)\
  12. :"ip","lr","cc")
  13. #defineput_user(x,p)\
  14. ({\
  15. constregistertypeof(*(p))__r2asm("r2")=(x);\
  16. constregistertypeof(*(p))__user*__pasm("r0")=(p);\
  17. registerint__easm("r0");\
  18. switch(sizeof(*(__p))){\
  19. case1:\
  20. __put_user_x(__r2,__p,__e,1);\
  21. break;\
  22. case2:\
  23. __put_user_x(__r2,__p,__e,2);\
  24. break;\
  25. case4:\
  26. __put_user_x(__r2,__p,__e,4);\
  27. break;\
  28. case8:\
  29. __put_user_x(__r2,__p,__e,8);\
  30. break;\
  31. default:__e=__put_user_bad();break;\
  32. }\
  33. __e;\
  34. })

__put_user_1等函数的的定义如下(linux/arch/arm/lib/putuser.S)。

[plain]view plaincopyprint?

  1. .global__put_user_1
  2. __put_user_1:
  3. 1:strbtr2,[r0]
  4. movr0,#0
  5. movpc,lr
  6. .global__put_user_2
  7. __put_user_2:
  8. movip,r2,lsr#8
  9. #ifndef__ARMEB__
  10. 2:strbtr2,[r0],#1
  11. 3:strbtip,[r0]
  12. #else
  13. 2:strbtip,[r0],#1
  14. 3:strbtr2,[r0]
  15. #endif
  16. movr0,#0
  17. movpc,lr
  18. .global__put_user_4
  19. __put_user_4:
  20. 4:strtr2,[r0]
  21. movr0,#0
  22. movpc,lr
  23. .global__put_user_8
  24. __put_user_8:
  25. 5:strtr2,[r0],#4
  26. 6:strtr3,[r0]
  27. movr0,#0
  28. movpc,lr
  29. __put_user_bad:
  30. movr0,#-EFAULT
  31. movpc,lr
  32. .section__ex_table,"a"
  33. .long1b,__put_user_bad
  34. .long2b,__put_user_bad
  35. .long3b,__put_user_bad
  36. .long4b,__put_user_bad
  37. .long5b,__put_user_bad
  38. .long6b,__put_user_bad
  39. .previous

put_user函数就不具体分析了。get_user和put_user仅能完成一些简单类型变量的拷贝任务,后面我们将分析copy_to_user和copy_from_user。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top