Based on kernel version 3.9. Page generated on 2013-05-02 23:17 EST.
1 Chinese translated version of Documentation/arm/kernel_user_helpers.txt 2 3 If you have any comment or update to the content, please contact the 4 original document maintainer directly. However, if you have a problem 5 communicating in English you can also ask the Chinese maintainer for 6 help. Contact the Chinese maintainer if this translation is outdated 7 or if there is a problem with the translation. 8 9 Maintainer: Nicolas Pitre <nicolas.pitre@linaro.org> 10 Dave Martin <dave.martin@linaro.org> 11 Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> 12 --------------------------------------------------------------------- 13 Documentation/arm/kernel_user_helpers.txt çš„ä¸æ–‡ç¿»è¯‘ 14 15 如果想评论或更新本文的内容,请直接è”ç³»åŽŸæ–‡æ¡£çš„ç»´æŠ¤è€…ã€‚å¦‚æžœä½ ä½¿ç”¨è‹±æ–‡ 16 äº¤æµæœ‰å›°éš¾çš„è¯ï¼Œä¹Ÿå¯ä»¥å‘䏿–‡ç‰ˆç»´æŠ¤è€…求助。如果本翻译更新ä¸åŠæ—¶æˆ–者翻 17 译å˜åœ¨é—®é¢˜ï¼Œè¯·è”ç³»ä¸æ–‡ç‰ˆç»´æŠ¤è€…。 18 英文版维护者: Nicolas Pitre <nicolas.pitre@linaro.org> 19 Dave Martin <dave.martin@linaro.org> 20 䏿–‡ç‰ˆç»´æŠ¤è€…: 傅炜 Fu Wei <tekkamanninja@gmail.com> 21 䏿–‡ç‰ˆç¿»è¯‘者: 傅炜 Fu Wei <tekkamanninja@gmail.com> 22 䏿–‡ç‰ˆæ ¡è¯‘者: 宋冬生 Dongsheng Song <dongshneg.song@gmail.com> 23 傅炜 Fu Wei <tekkamanninja@gmail.com> 24 25 26 ä»¥ä¸‹ä¸ºæ£æ–‡ 27 --------------------------------------------------------------------- 28 å†…æ ¸æä¾›çš„用户空间辅助代ç 29 ========================= 30 31 åœ¨å†…æ ¸å†…å˜ç©ºé—´çš„固定地å€å¤„ï¼Œæœ‰ä¸€ä¸ªç”±å†…æ ¸æä¾›å¹¶å¯ä»Žç”¨æˆ·ç©ºé—´è®¿é—®çš„代ç 32 段。它用于å‘用户空间æä¾›å› 在许多 ARM CPU 䏿œªå®žçŽ°çš„ç‰¹æ€§å’Œ/或指令而需 33 å†…æ ¸æä¾›å¸®åŠ©çš„æŸäº›æ“作。这些代ç 直接在用户模å¼ä¸‹æ‰§è¡Œçš„æƒ³æ³•是为了获得 34 æœ€ä½³æ•ˆçŽ‡ï¼Œä½†é‚£äº›ä¸Žå†…æ ¸è®¡æ•°å™¨è”系过于紧密的部分,则被留给了用户库实现。 35 事实上,æ¤ä»£ç 甚至å¯èƒ½å› ä¸åŒçš„ CPU 而异,这å–决于其å¯ç”¨çš„æŒ‡ä»¤é›†æˆ–它 36 是å¦ä¸º SMP 系统。æ¢å¥è¯è¯´ï¼Œå†…æ ¸ä¿ç•™åœ¨ä¸ä½œå‡ºè¦å‘Šçš„æƒ…å†µä¸‹æ ¹æ®éœ€è¦æ›´æ”¹ 37 这些代ç çš„æƒåˆ©ã€‚åªæœ‰æœ¬æ–‡æ¡£æè¿°çš„å…¥å£åŠå…¶ç»“果是ä¿è¯ç¨³å®šçš„。 38 39 这与完全æˆç†Ÿçš„ VDSO 实现ä¸åŒï¼ˆä½†ä¸¤è€…å¹¶ä¸å†²çªï¼‰ï¼Œå°½ç®¡å¦‚æ¤ï¼ŒVDSO å¯é˜»æ¢ 40 æŸäº›é€šè¿‡å¸¸é‡é«˜æ•ˆè·³è½¬åˆ°é‚£äº›ä»£ç æ®µçš„æ±‡ç¼–æŠ€å·§ã€‚ä¸”ç”±äºŽé‚£äº›ä»£ç æ®µåœ¨è¿”回用户 41 代ç å‰ä»…使用少é‡çš„代ç 周期,则一个 VDSO 间接远程调用将会在这些简å•çš„ 42 æ“ä½œä¸Šå¢žåŠ ä¸€ä¸ªå¯æµ‹é‡çš„开销。 43 44 在对那些拥有原生支æŒçš„æ–°åž‹å¤„ç†å™¨è¿›è¡Œä»£ç 优化时,仅在已为其他æ“作使用 45 了类似的新增指令,而导致二进制结果已与早期 ARM 处ç†å™¨ä¸å…¼å®¹çš„æƒ…况下, 46 用户空间æ‰åº”绕过这些辅助代ç ,并在内è”函数ä¸å®žçŽ°è¿™äº›æ“ä½œï¼ˆæ— è®ºæ˜¯é€šè¿‡ 47 编译器在代ç ä¸ç›´æŽ¥æ”¾ç½®ï¼Œè¿˜æ˜¯ä½œä¸ºåº“函数调用实现的一部分)。也就是说, 48 å¦‚æžœä½ ç¼–è¯‘çš„ä»£ç ä¸ä¼šä¸ºäº†å…¶ä»–目的使用新指令,则ä¸è¦ä»…为了é¿å…使用这些 49 å†…æ ¸è¾…åŠ©ä»£ç ï¼Œå¯¼è‡´äºŒè¿›åˆ¶ç¨‹åºæ— 法在早期处ç†å™¨ä¸Šè¿è¡Œã€‚ 50 51 新的辅助代ç å¯èƒ½éšç€æ—¶é—´çš„æŽ¨ç§»è€Œå¢žåŠ ï¼Œæ‰€ä»¥æ–°å†…æ ¸ä¸çš„æŸäº›è¾…åŠ©ä»£ç 在旧 52 å†…æ ¸ä¸å¯èƒ½ä¸å˜åœ¨ã€‚å› æ¤ï¼Œç¨‹åºå¿…须在对任何辅助代ç 调用å‡è®¾æ˜¯å®‰å…¨ä¹‹å‰ï¼Œ 53 检测 __kuser_helper_version 的值(è§ä¸‹æ–‡ï¼‰ã€‚ç†æƒ³æƒ…å†µä¸‹ï¼Œè¿™ç§æ£€æµ‹åº”该 54 åªåœ¨è¿›ç¨‹å¯åŠ¨æ—¶æ‰§è¡Œä¸€æ¬¡ï¼›å¦‚æžœå†…æ ¸ç‰ˆæœ¬ä¸æ”¯æŒæ‰€éœ€è¾…助代ç ,则该进程å¯å°½æ—© 55 䏿¢æ‰§è¡Œã€‚ 56 57 kuser_helper_version 58 -------------------- 59 60 ä½ç½®: 0xffff0ffc 61 62 å‚考声明: 63 64 extern int32_t __kuser_helper_version; 65 66 定义: 67 68 这个区域包å«äº†å½“å‰è¿è¡Œå†…æ ¸å®žçŽ°çš„è¾…åŠ©ä»£ç 版本å·ã€‚用户空间å¯ä»¥é€šè¿‡è¯» 69 å–æ¤ç‰ˆæœ¬å·ä»¥ç¡®å®šç‰¹å®šçš„è¾…åŠ©ä»£ç æ˜¯å¦å˜åœ¨ã€‚ 70 71 使用范例: 72 73 #define __kuser_helper_version (*(int32_t *)0xffff0ffc) 74 75 void check_kuser_version(void) 76 { 77 if (__kuser_helper_version < 2) { 78 fprintf(stderr, "can't do atomic operations, kernel too old\n"); 79 abort(); 80 } 81 } 82 83 注æ„: 84 85 用户空间å¯ä»¥å‡è®¾è¿™ä¸ªåŸŸçš„值ä¸ä¼šåœ¨ä»»ä½•å•ä¸ªè¿›ç¨‹çš„ç”Ÿå˜æœŸå†…改å˜ã€‚也就 86 是说,这个域å¯ä»¥ä»…在库的åˆå§‹åŒ–阶段或进程å¯åŠ¨é˜¶æ®µè¯»å–一次。 87 88 kuser_get_tls 89 ------------- 90 91 ä½ç½®: 0xffff0fe0 92 93 å‚考原型: 94 95 void * __kuser_get_tls(void); 96 97 输入: 98 99 lr = è¿”å›žåœ°å€ 100 101 输出: 102 103 r0 = TLS 值 104 105 被篡改的寄å˜å™¨: 106 107 æ— 108 109 定义: 110 111 获å–之å‰é€šè¿‡ __ARM_NR_set_tls 系统调用设置的 TLS 值。 112 113 使用范例: 114 115 typedef void * (__kuser_get_tls_t)(void); 116 #define __kuser_get_tls (*(__kuser_get_tls_t *)0xffff0fe0) 117 118 void foo() 119 { 120 void *tls = __kuser_get_tls(); 121 printf("TLS = %p\n", tls); 122 } 123 124 注æ„: 125 126 - 仅在 __kuser_helper_version >= 1 时,æ¤è¾…助代ç å˜åœ¨ 127 ï¼ˆä»Žå†…æ ¸ç‰ˆæœ¬ 2.6.12 开始)。 128 129 kuser_cmpxchg 130 ------------- 131 132 ä½ç½®: 0xffff0fc0 133 134 å‚考原型: 135 136 int __kuser_cmpxchg(int32_t oldval, int32_t newval, volatile int32_t *ptr); 137 138 输入: 139 140 r0 = oldval 141 r1 = newval 142 r2 = ptr 143 lr = è¿”å›žåœ°å€ 144 145 输出: 146 147 r0 = æˆåŠŸä»£ç (零或éžé›¶) 148 C flag = 如果 r0 == 0 则置 1,如果 r0 != 0 则清零。 149 150 被篡改的寄å˜å™¨: 151 152 r3, ip, flags 153 154 定义: 155 156 仅在 *ptr 为 oldval 时原åä¿å˜ newval 于 *ptr ä¸ã€‚ 157 如果 *ptr 被改å˜ï¼Œåˆ™è¿”回值为零,å¦åˆ™ä¸ºéžé›¶å€¼ã€‚ 158 如果 *ptr 被改å˜ï¼Œåˆ™ C flag 也会被置 1,以实现调用代ç ä¸çš„æ±‡ç¼– 159 优化。 160 161 使用范例: 162 163 typedef int (__kuser_cmpxchg_t)(int oldval, int newval, volatile int *ptr); 164 #define __kuser_cmpxchg (*(__kuser_cmpxchg_t *)0xffff0fc0) 165 166 int atomic_add(volatile int *ptr, int val) 167 { 168 int old, new; 169 170 do { 171 old = *ptr; 172 new = old + val; 173 } while(__kuser_cmpxchg(old, new, ptr)); 174 175 return new; 176 } 177 178 注æ„: 179 180 - è¿™ä¸ªä¾‹ç¨‹å·²æ ¹æ®éœ€è¦åŒ…å«äº†å†…å˜å±éšœã€‚ 181 182 - 仅在 __kuser_helper_version >= 2 时,æ¤è¾…助代ç å˜åœ¨ 183 ï¼ˆä»Žå†…æ ¸ç‰ˆæœ¬ 2.6.12 开始)。 184 185 kuser_memory_barrier 186 -------------------- 187 188 ä½ç½®: 0xffff0fa0 189 190 å‚考原型: 191 192 void __kuser_memory_barrier(void); 193 194 输入: 195 196 lr = è¿”å›žåœ°å€ 197 198 输出: 199 200 æ— 201 202 被篡改的寄å˜å™¨: 203 204 æ— 205 206 定义: 207 208 应用于任何需è¦å†…å˜å±éšœä»¥é˜²æ¢æ‰‹åŠ¨æ•°æ®ä¿®æ”¹å¸¦æ¥çš„ä¸€è‡´æ€§é—®é¢˜ï¼Œä»¥åŠ 209 __kuser_cmpxchg ä¸ã€‚ 210 211 使用范例: 212 213 typedef void (__kuser_dmb_t)(void); 214 #define __kuser_dmb (*(__kuser_dmb_t *)0xffff0fa0) 215 216 注æ„: 217 218 - 仅在 __kuser_helper_version >= 3 时,æ¤è¾…助代ç å˜åœ¨ 219 ï¼ˆä»Žå†…æ ¸ç‰ˆæœ¬ 2.6.15 开始)。 220 221 kuser_cmpxchg64 222 --------------- 223 224 ä½ç½®: 0xffff0f60 225 226 å‚考原型: 227 228 int __kuser_cmpxchg64(const int64_t *oldval, 229 const int64_t *newval, 230 volatile int64_t *ptr); 231 232 输入: 233 234 r0 = æŒ‡å‘ oldval 235 r1 = æŒ‡å‘ newval 236 r2 = 指å‘ç›®æ ‡å€¼ 237 lr = è¿”å›žåœ°å€ 238 239 输出: 240 241 r0 = æˆåŠŸä»£ç (零或éžé›¶) 242 C flag = 如果 r0 == 0 则置 1,如果 r0 != 0 则清零。 243 244 被篡改的寄å˜å™¨: 245 246 r3, lr, flags 247 248 定义: 249 250 仅在 *ptr ç‰äºŽ *oldval 指å‘çš„ 64 ä½å€¼æ—¶ï¼ŒåŽŸåä¿å˜ *newval 251 指å‘çš„ 64 ä½å€¼äºŽ *ptr ä¸ã€‚如果 *ptr 被改å˜ï¼Œåˆ™è¿”回值为零, 252 å¦åˆ™ä¸ºéžé›¶å€¼ã€‚ 253 254 如果 *ptr 被改å˜ï¼Œåˆ™ C flag 也会被置 1,以实现调用代ç ä¸çš„æ±‡ç¼– 255 优化。 256 257 使用范例: 258 259 typedef int (__kuser_cmpxchg64_t)(const int64_t *oldval, 260 const int64_t *newval, 261 volatile int64_t *ptr); 262 #define __kuser_cmpxchg64 (*(__kuser_cmpxchg64_t *)0xffff0f60) 263 264 int64_t atomic_add64(volatile int64_t *ptr, int64_t val) 265 { 266 int64_t old, new; 267 268 do { 269 old = *ptr; 270 new = old + val; 271 } while(__kuser_cmpxchg64(&old, &new, ptr)); 272 273 return new; 274 } 275 276 注æ„: 277 278 - è¿™ä¸ªä¾‹ç¨‹å·²æ ¹æ®éœ€è¦åŒ…å«äº†å†…å˜å±éšœã€‚ 279 280 - 由于这个过程的代ç 长度(æ¤è¾…助代ç 跨越 2 个常规的 kuser “槽â€ï¼‰ï¼Œ 281 å› æ¤ 0xffff0f80 ä¸è¢«ä½œä¸ºæœ‰æ•ˆçš„å…¥å£ç‚¹ã€‚ 282 283 - 仅在 __kuser_helper_version >= 5 时,æ¤è¾…助代ç å˜åœ¨ 284 ï¼ˆä»Žå†…æ ¸ç‰ˆæœ¬ 3.1 开始)。