]>
Commit | Line | Data |
---|---|---|
2800db82 MF |
1 | .\" Written by Mike Frysinger <vapier@gentoo.org> |
2 | .\" | |
3 | .\" %%%LICENSE_START(PUBLIC_DOMAIN) | |
4 | .\" This page is in the public domain. | |
5 | .\" %%%LICENSE_END | |
6 | .\" | |
fb634bd8 | 7 | .\" Useful background: |
8635ed1b MK |
8 | .\" http://articles.manugarg.com/systemcallinlinux2_6.html |
9 | .\" https://lwn.net/Articles/446528/ | |
10 | .\" http://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken | |
11 | .\" http://www.trilithium.com/johan/2005/08/linux-gate/ | |
fb634bd8 | 12 | .\" |
29b41e74 | 13 | .TH VDSO 7 2015-12-28 "Linux" "Linux Programmer's Manual" |
2800db82 | 14 | .SH NAME |
3e179634 | 15 | vdso \- overview of the virtual ELF dynamic shared object |
2800db82 MF |
16 | .SH SYNOPSIS |
17 | .B #include <sys/auxv.h> | |
18 | ||
19 | .B void *vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR); | |
20 | .SH DESCRIPTION | |
e1549829 | 21 | The "vDSO" (virtual dynamic shared object) is a small shared library that |
8635ed1b | 22 | the kernel automatically maps into the |
2800db82 | 23 | address space of all user-space applications. |
fb634bd8 | 24 | Applications usually do not need to concern themselves with these details |
2800db82 | 25 | as the vDSO is most commonly called by the C library. |
f6816de9 | 26 | This way you can code in the normal way using standard functions |
fb634bd8 MK |
27 | and the C library will take care |
28 | of using any functionality that is available via the vDSO. | |
2800db82 MF |
29 | |
30 | Why does the vDSO exist at all? | |
8635ed1b | 31 | There are some system calls the kernel provides that |
dd6b62ec | 32 | user-space code ends up using frequently, |
8635ed1b | 33 | to the point that such calls can dominate overall performance. |
fb634bd8 | 34 | This is due both to the frequency of the call as well as the |
35432a03 | 35 | context-switch overhead that results |
2800db82 MF |
36 | from exiting user space and entering the kernel. |
37 | ||
8635ed1b MK |
38 | The rest of this documentation is geared toward the curious and/or |
39 | C library writers rather than general developers. | |
2800db82 MF |
40 | If you're trying to call the vDSO in your own application rather than using |
41 | the C library, you're most likely doing it wrong. | |
42 | .SS Example background | |
43 | Making system calls can be slow. | |
fb634bd8 MK |
44 | In x86 32-bit systems, you can trigger a software interrupt |
45 | .RI ( "int $0x80" ) | |
46 | to tell the kernel you wish to make a system call. | |
47 | However, this instruction is expensive: it goes through | |
48 | the full interrupt-handling paths | |
49 | in the processor's microcode as well as in the kernel. | |
50 | Newer processors have faster (but backward incompatible) instructions to | |
2800db82 MF |
51 | initiate system calls. |
52 | Rather than require the C library to figure out if this functionality is | |
8635ed1b | 53 | available at run time, |
fb634bd8 | 54 | the C library can use functions provided by the kernel in |
2800db82 MF |
55 | the vDSO. |
56 | ||
57 | Note that the terminology can be confusing. | |
fb634bd8 MK |
58 | On x86 systems, the vDSO function |
59 | used to determine the preferred method of making a system call is | |
60 | named "__kernel_vsyscall", but on x86_64, | |
8635ed1b MK |
61 | the term "vsyscall" also refers to an obsolete way to ask the kernel |
62 | what time it is or what CPU the caller is on. | |
2800db82 | 63 | |
fb634bd8 MK |
64 | One frequently used system call is |
65 | .BR gettimeofday (2). | |
66 | This system call is called both directly by user-space applications | |
67 | as well as indirectly by | |
2800db82 | 68 | the C library. |
8635ed1b MK |
69 | Think timestamps or timing loops or polling\(emall of these |
70 | frequently need to know what time it is right now. | |
71 | This information is also not secret\(emany application in any | |
72 | privilege mode (root or any unprivileged user) will get the same answer. | |
73 | Thus the kernel arranges for the information required to answer | |
74 | this question to be placed in memory the process can access. | |
fb634bd8 MK |
75 | Now a call to |
76 | .BR gettimeofday (2) | |
77 | changes from a system call to a normal function | |
2800db82 MF |
78 | call and a few memory accesses. |
79 | .SS Finding the vDSO | |
8635ed1b MK |
80 | The base address of the vDSO (if one exists) is passed by the kernel to |
81 | each program in the initial auxiliary vector (see | |
d3532647 | 82 | .BR getauxval (3)), |
fb634bd8 | 83 | via the |
2800db82 MF |
84 | .B AT_SYSINFO_EHDR |
85 | tag. | |
86 | ||
87 | You must not assume the vDSO is mapped at any particular location in the | |
88 | user's memory map. | |
8635ed1b | 89 | The base address will usually be randomized at run time every time a new |
2800db82 MF |
90 | process image is created (at |
91 | .BR execve (2) | |
92 | time). | |
fb634bd8 MK |
93 | This is done for security reasons, |
94 | to prevent "return-to-libc" attacks. | |
2800db82 | 95 | |
fb634bd8 | 96 | For some architectures, there is also an |
2800db82 MF |
97 | .B AT_SYSINFO |
98 | tag. | |
99 | This is used only for locating the vsyscall entry point and is frequently | |
100 | omitted or set to 0 (meaning it's not available). | |
fb634bd8 MK |
101 | This tag is a throwback to the initial vDSO work (see |
102 | .IR History | |
103 | below) and its use should be avoided. | |
2800db82 MF |
104 | .SS File format |
105 | Since the vDSO is a fully formed ELF image, you can do symbol lookups on it. | |
8635ed1b MK |
106 | This allows new symbols to be added with newer kernel releases, |
107 | and allows the C library to detect available functionality at | |
108 | run time when running under different kernel versions. | |
fb634bd8 | 109 | Oftentimes the C library will do detection with the first call and then |
2800db82 MF |
110 | cache the result for subsequent calls. |
111 | ||
112 | All symbols are also versioned (using the GNU version format). | |
113 | This allows the kernel to update the function signature without breaking | |
fb634bd8 | 114 | backward compatibility. |
2800db82 MF |
115 | This means changing the arguments that the function accepts as well as the |
116 | return value. | |
fb634bd8 MK |
117 | Thus, when looking up a symbol in the vDSO, |
118 | you must always include the version | |
2800db82 MF |
119 | to match the ABI you expect. |
120 | ||
fb634bd8 MK |
121 | Typically the vDSO follows the naming convention of prefixing |
122 | all symbols with "__vdso_" or "__kernel_" | |
123 | so as to distinguish them from other standard symbols. | |
124 | For example, the "gettimeofday" function is named "__vdso_gettimeofday". | |
2800db82 | 125 | |
fb634bd8 MK |
126 | You use the standard C calling conventions when calling |
127 | any of these functions. | |
2800db82 MF |
128 | No need to worry about weird register or stack behavior. |
129 | .SH NOTES | |
130 | .SS Source | |
8635ed1b MK |
131 | When you compile the kernel, |
132 | it will automatically compile and link the vDSO code for you. | |
fb634bd8 | 133 | You will frequently find it under the architecture-specific directory: |
2800db82 MF |
134 | |
135 | find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*' | |
787dd4ad | 136 | .\" |
2800db82 | 137 | .SS vDSO names |
21ffc8d1 | 138 | The name of the vDSO varies across architectures. |
d3532647 | 139 | It will often show up in things like glibc's |
fb634bd8 MK |
140 | .BR ldd (1) |
141 | output. | |
2800db82 MF |
142 | The exact name should not matter to any code, so do not hardcode it. |
143 | .if t \{\ | |
144 | .ft CW | |
145 | \} | |
146 | .TS | |
147 | l l. | |
148 | user ABI vDSO name | |
149 | _ | |
150 | aarch64 linux-vdso.so.1 | |
ebfc3611 | 151 | arm linux-vdso.so.1 |
2800db82 MF |
152 | ia64 linux-gate.so.1 |
153 | ppc/32 linux-vdso32.so.1 | |
154 | ppc/64 linux-vdso64.so.1 | |
155 | s390 linux-vdso32.so.1 | |
156 | s390x linux-vdso64.so.1 | |
157 | sh linux-gate.so.1 | |
158 | i386 linux-gate.so.1 | |
159 | x86_64 linux-vdso.so.1 | |
160 | x86/x32 linux-vdso.so.1 | |
161 | .TE | |
162 | .if t \{\ | |
163 | .in | |
164 | .ft P | |
165 | \} | |
afc40b07 MK |
166 | .SS strace(1) and the vDSO |
167 | When tracing systems calls with | |
168 | .BR strace (1), | |
169 | symbols (system calls) that are exported by the vDSO will | |
170 | .I not | |
171 | appear in the trace output. | |
dd6b62ec | 172 | .SH ARCHITECTURE-SPECIFIC NOTES |
f6816de9 MK |
173 | The subsections below provide architecture-specific notes |
174 | on the vDSO. | |
175 | ||
176 | Note that the vDSO that is used is based on the ABI of your user-space code | |
177 | and not the ABI of the kernel. | |
178 | Thus, for example, | |
179 | when you run an i386 32-bit ELF binary, | |
180 | you'll get the same vDSO regardless of whether you run it under | |
181 | an i386 32-bit kernel or under an x86_64 64-bit kernel. | |
dd6b62ec | 182 | Therefore, the name of the user-space ABI should be used to determine |
f6816de9 | 183 | which of the sections below is relevant. |
fb634bd8 | 184 | .SS ARM functions |
ebfc3611 NL |
185 | .\" See linux/arch/arm/vdso/vdso.lds.S |
186 | .\" Commit: 8512287a8165592466cb9cb347ba94892e9c56a5 | |
187 | The table below lists the symbols exported by the vDSO. | |
188 | .if t \{\ | |
189 | .ft CW | |
190 | \} | |
191 | .TS | |
192 | l l. | |
193 | symbol version | |
194 | _ | |
195 | __vdso_gettimeofday LINUX_2.6 (exported since Linux 4.1) | |
196 | __vdso_clock_gettime LINUX_2.6 (exported since Linux 4.1) | |
197 | .TE | |
198 | .if t \{\ | |
199 | .in | |
200 | .ft P | |
201 | \} | |
202 | ||
2800db82 MF |
203 | .\" See linux/arch/arm/kernel/entry-armv.S |
204 | .\" See linux/Documentation/arm/kernel_user_helpers.txt | |
ebfc3611 | 205 | Additionally, the ARM port has a code page full of utility functions. |
2800db82 MF |
206 | Since it's just a raw page of code, there is no ELF information for doing |
207 | symbol lookups or versioning. | |
208 | It does provide support for different versions though. | |
209 | ||
fb634bd8 MK |
210 | For information on this code page, |
211 | it's best to refer to the kernel documentation | |
2800db82 | 212 | as it's extremely detailed and covers everything you need to know: |
fb634bd8 | 213 | .IR Documentation/arm/kernel_user_helpers.txt . |
2800db82 MF |
214 | .SS aarch64 functions |
215 | .\" See linux/arch/arm64/kernel/vdso/vdso.lds.S | |
f6816de9 | 216 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
217 | .if t \{\ |
218 | .ft CW | |
219 | \} | |
220 | .TS | |
221 | l l. | |
222 | symbol version | |
223 | _ | |
224 | __kernel_rt_sigreturn LINUX_2.6.39 | |
225 | __kernel_gettimeofday LINUX_2.6.39 | |
226 | __kernel_clock_gettime LINUX_2.6.39 | |
227 | __kernel_clock_getres LINUX_2.6.39 | |
228 | .TE | |
229 | .if t \{\ | |
230 | .in | |
231 | .ft P | |
232 | \} | |
233 | .SS bfin (Blackfin) functions | |
234 | .\" See linux/arch/blackfin/kernel/fixed_code.S | |
235 | .\" See http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code | |
8635ed1b MK |
236 | As this CPU lacks a memory management unit (MMU), |
237 | it doesn't set up a vDSO in the normal sense. | |
238 | Instead, it maps at boot time a few raw functions into | |
239 | a fixed location in memory. | |
2800db82 | 240 | User-space applications then call directly into that region. |
8635ed1b MK |
241 | There is no provision for backward compatibility |
242 | beyond sniffing raw opcodes, | |
fb634bd8 | 243 | but as this is an embedded CPU, it can get away with things\(emsome of the |
2800db82 MF |
244 | object formats it runs aren't even ELF based (they're bFLT/FLAT). |
245 | ||
f6816de9 MK |
246 | For information on this code page, |
247 | it's best to refer to the public documentation: | |
2800db82 MF |
248 | .br |
249 | http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code | |
250 | .SS ia64 (Itanium) functions | |
251 | .\" See linux/arch/ia64/kernel/gate.lds.S | |
252 | .\" Also linux/arch/ia64/kernel/fsys.S and linux/Documentation/ia64/fsys.txt | |
f6816de9 | 253 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
254 | .if t \{\ |
255 | .ft CW | |
256 | \} | |
257 | .TS | |
258 | l l. | |
259 | symbol version | |
260 | _ | |
261 | __kernel_sigtramp LINUX_2.5 | |
262 | __kernel_syscall_via_break LINUX_2.5 | |
263 | __kernel_syscall_via_epc LINUX_2.5 | |
264 | .TE | |
265 | .if t \{\ | |
266 | .in | |
267 | .ft P | |
268 | \} | |
269 | ||
fb634bd8 | 270 | The Itanium port is somewhat tricky. |
8635ed1b MK |
271 | In addition to the vDSO above, it also has "light-weight system calls" |
272 | (also known as "fast syscalls" or "fsys"). | |
fb634bd8 MK |
273 | You can invoke these via the |
274 | .I __kernel_syscall_via_epc | |
275 | vDSO helper. | |
2800db82 MF |
276 | The system calls listed here have the same semantics as if you called them |
277 | directly via | |
fb634bd8 | 278 | .BR syscall (2), |
2800db82 MF |
279 | so refer to the relevant |
280 | documentation for each. | |
281 | The table below lists the functions available via this mechanism. | |
282 | .if t \{\ | |
283 | .ft CW | |
284 | \} | |
285 | .TS | |
286 | l. | |
287 | function | |
288 | _ | |
289 | clock_gettime | |
290 | getcpu | |
291 | getpid | |
292 | getppid | |
293 | gettimeofday | |
294 | set_tid_address | |
295 | .TE | |
296 | .if t \{\ | |
297 | .in | |
298 | .ft P | |
299 | \} | |
300 | .SS parisc (hppa) functions | |
301 | .\" See linux/arch/parisc/kernel/syscall.S | |
302 | .\" See linux/Documentation/parisc/registers | |
8635ed1b MK |
303 | The parisc port has a code page full of utility functions |
304 | called a gateway page. | |
fb634bd8 MK |
305 | Rather than use the normal ELF auxiliary vector approach, |
306 | it passes the address of | |
2800db82 MF |
307 | the page to the process via the SR2 register. |
308 | The permissions on the page are such that merely executing those addresses | |
dd6b62ec | 309 | automatically executes with kernel privileges and not in user space. |
2800db82 MF |
310 | This is done to match the way HP-UX works. |
311 | ||
312 | Since it's just a raw page of code, there is no ELF information for doing | |
313 | symbol lookups or versioning. | |
fb634bd8 MK |
314 | Simply call into the appropriate offset via the branch instruction, |
315 | for example: | |
316 | ||
317 | ble <offset>(%sr2, %r0) | |
2800db82 MF |
318 | .if t \{\ |
319 | .ft CW | |
320 | \} | |
321 | .TS | |
322 | l l. | |
323 | offset function | |
324 | _ | |
325 | 00b0 lws_entry | |
326 | 00e0 set_thread_pointer | |
327 | 0100 linux_gateway_entry (syscall) | |
328 | 0268 syscall_nosys | |
329 | 0274 tracesys | |
330 | 0324 tracesys_next | |
331 | 0368 tracesys_exit | |
332 | 03a0 tracesys_sigexit | |
333 | 03b8 lws_start | |
334 | 03dc lws_exit_nosys | |
335 | 03e0 lws_exit | |
336 | 03e4 lws_compare_and_swap64 | |
337 | 03e8 lws_compare_and_swap | |
338 | 0404 cas_wouldblock | |
339 | 0410 cas_action | |
340 | .TE | |
341 | .if t \{\ | |
342 | .in | |
343 | .ft P | |
344 | \} | |
345 | .SS ppc/32 functions | |
346 | .\" See linux/arch/powerpc/kernel/vdso32/vdso32.lds.S | |
f6816de9 | 347 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
348 | The functions marked with a |
349 | .I * | |
f6816de9 MK |
350 | are available only when the kernel is |
351 | a PowerPC64 (64-bit) kernel. | |
2800db82 MF |
352 | .if t \{\ |
353 | .ft CW | |
354 | \} | |
355 | .TS | |
356 | l l. | |
357 | symbol version | |
358 | _ | |
359 | __kernel_clock_getres LINUX_2.6.15 | |
360 | __kernel_clock_gettime LINUX_2.6.15 | |
361 | __kernel_datapage_offset LINUX_2.6.15 | |
362 | __kernel_get_syscall_map LINUX_2.6.15 | |
363 | __kernel_get_tbfreq LINUX_2.6.15 | |
364 | __kernel_getcpu \fI*\fR LINUX_2.6.15 | |
365 | __kernel_gettimeofday LINUX_2.6.15 | |
366 | __kernel_sigtramp_rt32 LINUX_2.6.15 | |
367 | __kernel_sigtramp32 LINUX_2.6.15 | |
368 | __kernel_sync_dicache LINUX_2.6.15 | |
369 | __kernel_sync_dicache_p5 LINUX_2.6.15 | |
370 | .TE | |
371 | .if t \{\ | |
372 | .in | |
373 | .ft P | |
374 | \} | |
375 | .SS ppc/64 functions | |
376 | .\" See linux/arch/powerpc/kernel/vdso64/vdso64.lds.S | |
f6816de9 | 377 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
378 | .if t \{\ |
379 | .ft CW | |
380 | \} | |
381 | .TS | |
382 | l l. | |
383 | symbol version | |
384 | _ | |
385 | __kernel_clock_getres LINUX_2.6.15 | |
386 | __kernel_clock_gettime LINUX_2.6.15 | |
387 | __kernel_datapage_offset LINUX_2.6.15 | |
388 | __kernel_get_syscall_map LINUX_2.6.15 | |
389 | __kernel_get_tbfreq LINUX_2.6.15 | |
390 | __kernel_getcpu LINUX_2.6.15 | |
391 | __kernel_gettimeofday LINUX_2.6.15 | |
392 | __kernel_sigtramp_rt64 LINUX_2.6.15 | |
393 | __kernel_sync_dicache LINUX_2.6.15 | |
394 | __kernel_sync_dicache_p5 LINUX_2.6.15 | |
395 | .TE | |
396 | .if t \{\ | |
397 | .in | |
398 | .ft P | |
399 | \} | |
400 | .SS s390 functions | |
401 | .\" See linux/arch/s390/kernel/vdso32/vdso32.lds.S | |
f6816de9 | 402 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
403 | .if t \{\ |
404 | .ft CW | |
405 | \} | |
406 | .TS | |
407 | l l. | |
408 | symbol version | |
409 | _ | |
410 | __kernel_clock_getres LINUX_2.6.29 | |
411 | __kernel_clock_gettime LINUX_2.6.29 | |
412 | __kernel_gettimeofday LINUX_2.6.29 | |
413 | .TE | |
414 | .if t \{\ | |
415 | .in | |
416 | .ft P | |
417 | \} | |
418 | .SS s390x functions | |
419 | .\" See linux/arch/s390/kernel/vdso64/vdso64.lds.S | |
f6816de9 | 420 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
421 | .if t \{\ |
422 | .ft CW | |
423 | \} | |
424 | .TS | |
425 | l l. | |
426 | symbol version | |
427 | _ | |
428 | __kernel_clock_getres LINUX_2.6.29 | |
429 | __kernel_clock_gettime LINUX_2.6.29 | |
430 | __kernel_gettimeofday LINUX_2.6.29 | |
431 | .TE | |
432 | .if t \{\ | |
433 | .in | |
434 | .ft P | |
435 | \} | |
436 | .SS sh (SuperH) functions | |
437 | .\" See linux/arch/sh/kernel/vsyscall/vsyscall.lds.S | |
f6816de9 | 438 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
439 | .if t \{\ |
440 | .ft CW | |
441 | \} | |
442 | .TS | |
443 | l l. | |
444 | symbol version | |
445 | _ | |
446 | __kernel_rt_sigreturn LINUX_2.6 | |
447 | __kernel_sigreturn LINUX_2.6 | |
448 | __kernel_vsyscall LINUX_2.6 | |
449 | .TE | |
450 | .if t \{\ | |
451 | .in | |
452 | .ft P | |
453 | \} | |
454 | .SS i386 functions | |
455 | .\" See linux/arch/x86/vdso/vdso32/vdso32.lds.S | |
f6816de9 | 456 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
457 | .if t \{\ |
458 | .ft CW | |
459 | \} | |
460 | .TS | |
461 | l l. | |
462 | symbol version | |
463 | _ | |
464 | __kernel_sigreturn LINUX_2.5 | |
465 | __kernel_rt_sigreturn LINUX_2.5 | |
466 | __kernel_vsyscall LINUX_2.5 | |
1b294717 MF |
467 | .\" Added in 7a59ed415f5b57469e22e41fc4188d5399e0b194 and updated |
468 | .\" in 37c975545ec63320789962bf307f000f08fabd48. | |
54a82012 MK |
469 | __vdso_clock_gettime LINUX_2.6 (exported since Linux 3.15) |
470 | __vdso_gettimeofday LINUX_2.6 (exported since Linux 3.15) | |
471 | __vdso_time LINUX_2.6 (exported since Linux 3.15) | |
2800db82 MF |
472 | .TE |
473 | .if t \{\ | |
474 | .in | |
475 | .ft P | |
476 | \} | |
477 | .SS x86_64 functions | |
478 | .\" See linux/arch/x86/vdso/vdso.lds.S | |
f6816de9 | 479 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
480 | All of these symbols are also available without the "__vdso_" prefix, but |
481 | you should ignore those and stick to the names below. | |
482 | .if t \{\ | |
483 | .ft CW | |
484 | \} | |
485 | .TS | |
486 | l l. | |
487 | symbol version | |
488 | _ | |
489 | __vdso_clock_gettime LINUX_2.6 | |
490 | __vdso_getcpu LINUX_2.6 | |
491 | __vdso_gettimeofday LINUX_2.6 | |
492 | __vdso_time LINUX_2.6 | |
493 | .TE | |
494 | .if t \{\ | |
495 | .in | |
496 | .ft P | |
497 | \} | |
498 | .SS x86/x32 functions | |
499 | .\" See linux/arch/x86/vdso/vdso32.lds.S | |
f6816de9 | 500 | The table below lists the symbols exported by the vDSO. |
2800db82 MF |
501 | .if t \{\ |
502 | .ft CW | |
503 | \} | |
504 | .TS | |
505 | l l. | |
506 | symbol version | |
507 | _ | |
508 | __vdso_clock_gettime LINUX_2.6 | |
509 | __vdso_getcpu LINUX_2.6 | |
510 | __vdso_gettimeofday LINUX_2.6 | |
511 | __vdso_time LINUX_2.6 | |
512 | .TE | |
513 | .if t \{\ | |
514 | .in | |
515 | .ft P | |
516 | \} | |
517 | .SS History | |
fb634bd8 MK |
518 | The vDSO was originally just a single function\(emthe vsyscall. |
519 | In older kernels, you might see that name | |
520 | in a process's memory map rather than "vdso". | |
d3532647 | 521 | Over time, people realized that this mechanism |
fb634bd8 | 522 | was a great way to pass more functionality |
2800db82 MF |
523 | to user space, so it was reconceived as a vDSO in the current format. |
524 | .SH SEE ALSO | |
525 | .BR syscalls (2), | |
526 | .BR getauxval (3), | |
527 | .BR proc (5) | |
528 | ||
fb634bd8 MK |
529 | The documents, examples, and source code in the Linux source code tree: |
530 | .in +4n | |
2800db82 | 531 | .nf |
fb634bd8 | 532 | |
2800db82 | 533 | Documentation/ABI/stable/vdso |
fb634bd8 | 534 | Documentation/ia64/fsys.txt |
2800db82 | 535 | Documentation/vDSO/* (includes examples of using the vDSO) |
fb634bd8 | 536 | |
2800db82 MF |
537 | find arch/ -iname '*vdso*' -o -iname '*gate*' |
538 | .fi | |
fb634bd8 | 539 | .in |