About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / zh_CN / arm / kernel_user_helpers.txt




Custom Search

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 开始)。
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.