linux内核中的get_user和put_user
时间:11-22
来源:互联网
点击:
返回0,否则返回-EFAULT。下面给出它们的定义(linux/include/asm-arm/uaccess.h)。
[plain]view plaincopyprint?
- externint__put_user_1(void*,unsignedint);
- externint__put_user_2(void*,unsignedint);
- externint__put_user_4(void*,unsignedint);
- externint__put_user_8(void*,unsignedlonglong);
- externint__put_user_bad(void);
- #define__put_user_x(__r2,__p,__e,__s)\
- __asm____volatile__(\
- __asmeq("%0","r0")__asmeq("%2","r2")\
- "bl__put_user_"#__s\
- :"=&r"(__e)\
- :"0"(__p),"r"(__r2)\
- :"ip","lr","cc")
- #defineput_user(x,p)\
- ({\
- constregistertypeof(*(p))__r2asm("r2")=(x);\
- constregistertypeof(*(p))__user*__pasm("r0")=(p);\
- registerint__easm("r0");\
- switch(sizeof(*(__p))){\
- case1:\
- __put_user_x(__r2,__p,__e,1);\
- break;\
- case2:\
- __put_user_x(__r2,__p,__e,2);\
- break;\
- case4:\
- __put_user_x(__r2,__p,__e,4);\
- break;\
- case8:\
- __put_user_x(__r2,__p,__e,8);\
- break;\
- default:__e=__put_user_bad();break;\
- }\
- __e;\
- })
[plain]view plaincopyprint?
- .global__put_user_1
- __put_user_1:
- 1:strbtr2,[r0]
- movr0,#0
- movpc,lr
- .global__put_user_2
- __put_user_2:
- movip,r2,lsr#8
- #ifndef__ARMEB__
- 2:strbtr2,[r0],#1
- 3:strbtip,[r0]
- #else
- 2:strbtip,[r0],#1
- 3:strbtr2,[r0]
- #endif
- movr0,#0
- movpc,lr
- .global__put_user_4
- __put_user_4:
- 4:strtr2,[r0]
- movr0,#0
- movpc,lr
- .global__put_user_8
- __put_user_8:
- 5:strtr2,[r0],#4
- 6:strtr3,[r0]
- movr0,#0
- movpc,lr
- __put_user_bad:
- movr0,#-EFAULT
- movpc,lr
- .section__ex_table,"a"
- .long1b,__put_user_bad
- .long2b,__put_user_bad
- .long3b,__put_user_bad
- .long4b,__put_user_bad
- .long5b,__put_user_bad
- .long6b,__put_user_bad
- .previous
linux内核get_userput_use 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)