2014-01-01 08:25:39 +00:00
|
|
|
.\" Written by Mike Frysinger <vapier@gentoo.org>
|
|
|
|
.\"
|
|
|
|
.\" %%%LICENSE_START(PUBLIC_DOMAIN)
|
|
|
|
.\" This page is in the public domain.
|
|
|
|
.\" %%%LICENSE_END
|
|
|
|
.\"
|
2014-01-01 10:14:33 +00:00
|
|
|
.\" Useful background:
|
2014-01-01 19:54:51 +00:00
|
|
|
.\" http://articles.manugarg.com/systemcallinlinux2_6.html
|
|
|
|
.\" https://lwn.net/Articles/446528/
|
|
|
|
.\" http://www.linuxjournal.com/content/creating-vdso-colonels-other-chicken
|
|
|
|
.\" http://www.trilithium.com/johan/2005/08/linux-gate/
|
2014-01-01 10:14:33 +00:00
|
|
|
.\"
|
access.2, bdflush.2, bind.2, brk.2, chmod.2, chown.2, clone.2, epoll_wait.2, execve.2, fsync.2, getgroups.2, gethostname.2, getpagesize.2, getpriority.2, getrlimit.2, ioperm.2, kexec_load.2, link.2, mkdir.2, mmap.2, msgop.2, perf_event_open.2, process_vm_readv.2, ptrace.2, readlink.2, readv.2, recv.2, rename.2, sched_setaffinity.2, select.2, send.2, seteuid.2, signal.2, sigwaitinfo.2, stat.2, symlink.2, sync.2, sync_file_range.2, sysinfo.2, timer_create.2, uname.2, unlink.2, utime.2, wait.2, abs.3, atoi.3, catopen.3, cerf.3, cexp2.3, clearenv.3, clog2.3, ctime.3, des_crypt.3, ecvt.3, fgetgrent.3, flockfile.3, fseeko.3, ftime.3, ftok.3, ftw.3, getauxval.3, getcwd.3, getdtablesize.3, getgrent.3, getgrent_r.3, getgrnam.3, getgrouplist.3, getline.3, getpass.3, getutent.3, glob.3, insque.3, lseek64.3, memmem.3, mkstemp.3, mktemp.3, on_exit.3, openpty.3, putenv.3, qecvt.3, realpath.3, remove.3, setbuf.3, sigpause.3, strftime.3, strptime.3, strstr.3, strtod.3, tzset.3, updwtmp.3, xcrypt.3, core.5, utmp.5, capabilities.7, charsets.7, environ.7, ipv6.7, man-pages.7, packet.7, vdso.7: tstamp
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
2014-08-19 16:55:41 +00:00
|
|
|
.TH VDSO 7 2014-08-19 "Linux" "Linux Programmer's Manual"
|
2014-01-01 08:25:39 +00:00
|
|
|
.SH NAME
|
|
|
|
vDSO \- overview of the virtual ELF dynamic shared object
|
|
|
|
.SH SYNOPSIS
|
|
|
|
.B #include <sys/auxv.h>
|
|
|
|
|
|
|
|
.B void *vdso = (uintptr_t) getauxval(AT_SYSINFO_EHDR);
|
|
|
|
.SH DESCRIPTION
|
2014-02-01 06:55:22 +00:00
|
|
|
The "vDSO" (virtual dynamic shared object) is a small shared library that
|
2014-01-01 19:54:51 +00:00
|
|
|
the kernel automatically maps into the
|
2014-01-01 08:25:39 +00:00
|
|
|
address space of all user-space applications.
|
2014-01-01 10:14:33 +00:00
|
|
|
Applications usually do not need to concern themselves with these details
|
2014-01-01 08:25:39 +00:00
|
|
|
as the vDSO is most commonly called by the C library.
|
2014-01-01 19:41:50 +00:00
|
|
|
This way you can code in the normal way using standard functions
|
2014-01-01 10:14:33 +00:00
|
|
|
and the C library will take care
|
|
|
|
of using any functionality that is available via the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
|
|
|
|
Why does the vDSO exist at all?
|
2014-01-01 19:54:51 +00:00
|
|
|
There are some system calls the kernel provides that
|
2014-01-02 19:12:10 +00:00
|
|
|
user-space code ends up using frequently,
|
2014-01-01 19:54:51 +00:00
|
|
|
to the point that such calls can dominate overall performance.
|
2014-01-01 10:14:33 +00:00
|
|
|
This is due both to the frequency of the call as well as the
|
2014-02-01 02:50:51 +00:00
|
|
|
context-switch overhead that results
|
2014-01-01 08:25:39 +00:00
|
|
|
from exiting user space and entering the kernel.
|
|
|
|
|
2014-01-01 19:54:51 +00:00
|
|
|
The rest of this documentation is geared toward the curious and/or
|
|
|
|
C library writers rather than general developers.
|
2014-01-01 08:25:39 +00:00
|
|
|
If you're trying to call the vDSO in your own application rather than using
|
|
|
|
the C library, you're most likely doing it wrong.
|
|
|
|
.SS Example background
|
|
|
|
Making system calls can be slow.
|
2014-01-01 10:14:33 +00:00
|
|
|
In x86 32-bit systems, you can trigger a software interrupt
|
|
|
|
.RI ( "int $0x80" )
|
|
|
|
to tell the kernel you wish to make a system call.
|
|
|
|
However, this instruction is expensive: it goes through
|
|
|
|
the full interrupt-handling paths
|
|
|
|
in the processor's microcode as well as in the kernel.
|
|
|
|
Newer processors have faster (but backward incompatible) instructions to
|
2014-01-01 08:25:39 +00:00
|
|
|
initiate system calls.
|
|
|
|
Rather than require the C library to figure out if this functionality is
|
2014-01-01 19:54:51 +00:00
|
|
|
available at run time,
|
2014-01-01 10:14:33 +00:00
|
|
|
the C library can use functions provided by the kernel in
|
2014-01-01 08:25:39 +00:00
|
|
|
the vDSO.
|
|
|
|
|
|
|
|
Note that the terminology can be confusing.
|
2014-01-01 10:14:33 +00:00
|
|
|
On x86 systems, the vDSO function
|
|
|
|
used to determine the preferred method of making a system call is
|
|
|
|
named "__kernel_vsyscall", but on x86_64,
|
2014-01-01 19:54:51 +00:00
|
|
|
the term "vsyscall" also refers to an obsolete way to ask the kernel
|
|
|
|
what time it is or what CPU the caller is on.
|
2014-01-01 08:25:39 +00:00
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
One frequently used system call is
|
|
|
|
.BR gettimeofday (2).
|
|
|
|
This system call is called both directly by user-space applications
|
|
|
|
as well as indirectly by
|
2014-01-01 08:25:39 +00:00
|
|
|
the C library.
|
2014-01-01 19:54:51 +00:00
|
|
|
Think timestamps or timing loops or polling\(emall of these
|
|
|
|
frequently need to know what time it is right now.
|
|
|
|
This information is also not secret\(emany application in any
|
|
|
|
privilege mode (root or any unprivileged user) will get the same answer.
|
|
|
|
Thus the kernel arranges for the information required to answer
|
|
|
|
this question to be placed in memory the process can access.
|
2014-01-01 10:14:33 +00:00
|
|
|
Now a call to
|
|
|
|
.BR gettimeofday (2)
|
|
|
|
changes from a system call to a normal function
|
2014-01-01 08:25:39 +00:00
|
|
|
call and a few memory accesses.
|
|
|
|
.SS Finding the vDSO
|
2014-01-01 19:54:51 +00:00
|
|
|
The base address of the vDSO (if one exists) is passed by the kernel to
|
|
|
|
each program in the initial auxiliary vector (see
|
2014-01-10 19:04:54 +00:00
|
|
|
.BR getauxval (3)),
|
2014-01-01 10:14:33 +00:00
|
|
|
via the
|
2014-01-01 08:25:39 +00:00
|
|
|
.B AT_SYSINFO_EHDR
|
|
|
|
tag.
|
|
|
|
|
|
|
|
You must not assume the vDSO is mapped at any particular location in the
|
|
|
|
user's memory map.
|
2014-01-01 19:54:51 +00:00
|
|
|
The base address will usually be randomized at run time every time a new
|
2014-01-01 08:25:39 +00:00
|
|
|
process image is created (at
|
|
|
|
.BR execve (2)
|
|
|
|
time).
|
2014-01-01 10:14:33 +00:00
|
|
|
This is done for security reasons,
|
|
|
|
to prevent "return-to-libc" attacks.
|
2014-01-01 08:25:39 +00:00
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
For some architectures, there is also an
|
2014-01-01 08:25:39 +00:00
|
|
|
.B AT_SYSINFO
|
|
|
|
tag.
|
|
|
|
This is used only for locating the vsyscall entry point and is frequently
|
|
|
|
omitted or set to 0 (meaning it's not available).
|
2014-01-01 10:14:33 +00:00
|
|
|
This tag is a throwback to the initial vDSO work (see
|
|
|
|
.IR History
|
|
|
|
below) and its use should be avoided.
|
2014-01-01 08:25:39 +00:00
|
|
|
.SS File format
|
|
|
|
Since the vDSO is a fully formed ELF image, you can do symbol lookups on it.
|
2014-01-01 19:54:51 +00:00
|
|
|
This allows new symbols to be added with newer kernel releases,
|
|
|
|
and allows the C library to detect available functionality at
|
|
|
|
run time when running under different kernel versions.
|
2014-01-01 10:14:33 +00:00
|
|
|
Oftentimes the C library will do detection with the first call and then
|
2014-01-01 08:25:39 +00:00
|
|
|
cache the result for subsequent calls.
|
|
|
|
|
|
|
|
All symbols are also versioned (using the GNU version format).
|
|
|
|
This allows the kernel to update the function signature without breaking
|
2014-01-01 10:14:33 +00:00
|
|
|
backward compatibility.
|
2014-01-01 08:25:39 +00:00
|
|
|
This means changing the arguments that the function accepts as well as the
|
|
|
|
return value.
|
2014-01-01 10:14:33 +00:00
|
|
|
Thus, when looking up a symbol in the vDSO,
|
|
|
|
you must always include the version
|
2014-01-01 08:25:39 +00:00
|
|
|
to match the ABI you expect.
|
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
Typically the vDSO follows the naming convention of prefixing
|
|
|
|
all symbols with "__vdso_" or "__kernel_"
|
|
|
|
so as to distinguish them from other standard symbols.
|
|
|
|
For example, the "gettimeofday" function is named "__vdso_gettimeofday".
|
2014-01-01 08:25:39 +00:00
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
You use the standard C calling conventions when calling
|
|
|
|
any of these functions.
|
2014-01-01 08:25:39 +00:00
|
|
|
No need to worry about weird register or stack behavior.
|
|
|
|
.SH NOTES
|
|
|
|
.SS Source
|
2014-01-01 19:54:51 +00:00
|
|
|
When you compile the kernel,
|
|
|
|
it will automatically compile and link the vDSO code for you.
|
2014-01-01 10:14:33 +00:00
|
|
|
You will frequently find it under the architecture-specific directory:
|
2014-01-01 08:25:39 +00:00
|
|
|
|
|
|
|
find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'
|
|
|
|
|
|
|
|
.SS vDSO names
|
2014-02-01 06:46:37 +00:00
|
|
|
The name of the vDSO varies across architectures.
|
2014-01-10 19:04:54 +00:00
|
|
|
It will often show up in things like glibc's
|
2014-01-01 10:14:33 +00:00
|
|
|
.BR ldd (1)
|
|
|
|
output.
|
2014-01-01 08:25:39 +00:00
|
|
|
The exact name should not matter to any code, so do not hardcode it.
|
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
user ABI vDSO name
|
|
|
|
_
|
|
|
|
aarch64 linux-vdso.so.1
|
|
|
|
ia64 linux-gate.so.1
|
|
|
|
ppc/32 linux-vdso32.so.1
|
|
|
|
ppc/64 linux-vdso64.so.1
|
|
|
|
s390 linux-vdso32.so.1
|
|
|
|
s390x linux-vdso64.so.1
|
|
|
|
sh linux-gate.so.1
|
|
|
|
i386 linux-gate.so.1
|
|
|
|
x86_64 linux-vdso.so.1
|
|
|
|
x86/x32 linux-vdso.so.1
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
2014-01-02 19:12:10 +00:00
|
|
|
.SH ARCHITECTURE-SPECIFIC NOTES
|
2014-01-01 19:41:50 +00:00
|
|
|
The subsections below provide architecture-specific notes
|
|
|
|
on the vDSO.
|
|
|
|
|
|
|
|
Note that the vDSO that is used is based on the ABI of your user-space code
|
|
|
|
and not the ABI of the kernel.
|
|
|
|
Thus, for example,
|
|
|
|
when you run an i386 32-bit ELF binary,
|
|
|
|
you'll get the same vDSO regardless of whether you run it under
|
|
|
|
an i386 32-bit kernel or under an x86_64 64-bit kernel.
|
2014-01-02 19:12:10 +00:00
|
|
|
Therefore, the name of the user-space ABI should be used to determine
|
2014-01-01 19:41:50 +00:00
|
|
|
which of the sections below is relevant.
|
2014-01-01 10:14:33 +00:00
|
|
|
.SS ARM functions
|
2014-01-01 08:25:39 +00:00
|
|
|
.\" See linux/arch/arm/kernel/entry-armv.S
|
|
|
|
.\" See linux/Documentation/arm/kernel_user_helpers.txt
|
2014-01-01 10:14:33 +00:00
|
|
|
The ARM port has a code page full of utility functions.
|
2014-01-01 08:25:39 +00:00
|
|
|
Since it's just a raw page of code, there is no ELF information for doing
|
|
|
|
symbol lookups or versioning.
|
|
|
|
It does provide support for different versions though.
|
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
For information on this code page,
|
|
|
|
it's best to refer to the kernel documentation
|
2014-01-01 08:25:39 +00:00
|
|
|
as it's extremely detailed and covers everything you need to know:
|
2014-01-01 10:14:33 +00:00
|
|
|
.IR Documentation/arm/kernel_user_helpers.txt .
|
2014-01-01 08:25:39 +00:00
|
|
|
.SS aarch64 functions
|
|
|
|
.\" See linux/arch/arm64/kernel/vdso/vdso.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_rt_sigreturn LINUX_2.6.39
|
|
|
|
__kernel_gettimeofday LINUX_2.6.39
|
|
|
|
__kernel_clock_gettime LINUX_2.6.39
|
|
|
|
__kernel_clock_getres LINUX_2.6.39
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS bfin (Blackfin) functions
|
|
|
|
.\" See linux/arch/blackfin/kernel/fixed_code.S
|
|
|
|
.\" See http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code
|
2014-01-01 19:54:51 +00:00
|
|
|
As this CPU lacks a memory management unit (MMU),
|
|
|
|
it doesn't set up a vDSO in the normal sense.
|
|
|
|
Instead, it maps at boot time a few raw functions into
|
|
|
|
a fixed location in memory.
|
2014-01-01 08:25:39 +00:00
|
|
|
User-space applications then call directly into that region.
|
2014-01-01 19:54:51 +00:00
|
|
|
There is no provision for backward compatibility
|
|
|
|
beyond sniffing raw opcodes,
|
2014-01-01 10:14:33 +00:00
|
|
|
but as this is an embedded CPU, it can get away with things\(emsome of the
|
2014-01-01 08:25:39 +00:00
|
|
|
object formats it runs aren't even ELF based (they're bFLT/FLAT).
|
|
|
|
|
2014-01-01 19:41:50 +00:00
|
|
|
For information on this code page,
|
|
|
|
it's best to refer to the public documentation:
|
2014-01-01 08:25:39 +00:00
|
|
|
.br
|
|
|
|
http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:fixed-code
|
|
|
|
.SS ia64 (Itanium) functions
|
|
|
|
.\" See linux/arch/ia64/kernel/gate.lds.S
|
|
|
|
.\" Also linux/arch/ia64/kernel/fsys.S and linux/Documentation/ia64/fsys.txt
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_sigtramp LINUX_2.5
|
|
|
|
__kernel_syscall_via_break LINUX_2.5
|
|
|
|
__kernel_syscall_via_epc LINUX_2.5
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
The Itanium port is somewhat tricky.
|
2014-01-01 19:54:51 +00:00
|
|
|
In addition to the vDSO above, it also has "light-weight system calls"
|
|
|
|
(also known as "fast syscalls" or "fsys").
|
2014-01-01 10:14:33 +00:00
|
|
|
You can invoke these via the
|
|
|
|
.I __kernel_syscall_via_epc
|
|
|
|
vDSO helper.
|
2014-01-01 08:25:39 +00:00
|
|
|
The system calls listed here have the same semantics as if you called them
|
|
|
|
directly via
|
2014-01-01 10:14:33 +00:00
|
|
|
.BR syscall (2),
|
2014-01-01 08:25:39 +00:00
|
|
|
so refer to the relevant
|
|
|
|
documentation for each.
|
|
|
|
The table below lists the functions available via this mechanism.
|
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l.
|
|
|
|
function
|
|
|
|
_
|
|
|
|
clock_gettime
|
|
|
|
getcpu
|
|
|
|
getpid
|
|
|
|
getppid
|
|
|
|
gettimeofday
|
|
|
|
set_tid_address
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS parisc (hppa) functions
|
|
|
|
.\" See linux/arch/parisc/kernel/syscall.S
|
|
|
|
.\" See linux/Documentation/parisc/registers
|
2014-01-01 19:54:51 +00:00
|
|
|
The parisc port has a code page full of utility functions
|
|
|
|
called a gateway page.
|
2014-01-01 10:14:33 +00:00
|
|
|
Rather than use the normal ELF auxiliary vector approach,
|
|
|
|
it passes the address of
|
2014-01-01 08:25:39 +00:00
|
|
|
the page to the process via the SR2 register.
|
|
|
|
The permissions on the page are such that merely executing those addresses
|
2014-01-02 19:12:10 +00:00
|
|
|
automatically executes with kernel privileges and not in user space.
|
2014-01-01 08:25:39 +00:00
|
|
|
This is done to match the way HP-UX works.
|
|
|
|
|
|
|
|
Since it's just a raw page of code, there is no ELF information for doing
|
|
|
|
symbol lookups or versioning.
|
2014-01-01 10:14:33 +00:00
|
|
|
Simply call into the appropriate offset via the branch instruction,
|
|
|
|
for example:
|
|
|
|
|
|
|
|
ble <offset>(%sr2, %r0)
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
offset function
|
|
|
|
_
|
|
|
|
00b0 lws_entry
|
|
|
|
00e0 set_thread_pointer
|
|
|
|
0100 linux_gateway_entry (syscall)
|
|
|
|
0268 syscall_nosys
|
|
|
|
0274 tracesys
|
|
|
|
0324 tracesys_next
|
|
|
|
0368 tracesys_exit
|
|
|
|
03a0 tracesys_sigexit
|
|
|
|
03b8 lws_start
|
|
|
|
03dc lws_exit_nosys
|
|
|
|
03e0 lws_exit
|
|
|
|
03e4 lws_compare_and_swap64
|
|
|
|
03e8 lws_compare_and_swap
|
|
|
|
0404 cas_wouldblock
|
|
|
|
0410 cas_action
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS ppc/32 functions
|
|
|
|
.\" See linux/arch/powerpc/kernel/vdso32/vdso32.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
The functions marked with a
|
|
|
|
.I *
|
2014-01-01 19:41:50 +00:00
|
|
|
are available only when the kernel is
|
|
|
|
a PowerPC64 (64-bit) kernel.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_clock_getres LINUX_2.6.15
|
|
|
|
__kernel_clock_gettime LINUX_2.6.15
|
|
|
|
__kernel_datapage_offset LINUX_2.6.15
|
|
|
|
__kernel_get_syscall_map LINUX_2.6.15
|
|
|
|
__kernel_get_tbfreq LINUX_2.6.15
|
|
|
|
__kernel_getcpu \fI*\fR LINUX_2.6.15
|
|
|
|
__kernel_gettimeofday LINUX_2.6.15
|
|
|
|
__kernel_sigtramp_rt32 LINUX_2.6.15
|
|
|
|
__kernel_sigtramp32 LINUX_2.6.15
|
|
|
|
__kernel_sync_dicache LINUX_2.6.15
|
|
|
|
__kernel_sync_dicache_p5 LINUX_2.6.15
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS ppc/64 functions
|
|
|
|
.\" See linux/arch/powerpc/kernel/vdso64/vdso64.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_clock_getres LINUX_2.6.15
|
|
|
|
__kernel_clock_gettime LINUX_2.6.15
|
|
|
|
__kernel_datapage_offset LINUX_2.6.15
|
|
|
|
__kernel_get_syscall_map LINUX_2.6.15
|
|
|
|
__kernel_get_tbfreq LINUX_2.6.15
|
|
|
|
__kernel_getcpu LINUX_2.6.15
|
|
|
|
__kernel_gettimeofday LINUX_2.6.15
|
|
|
|
__kernel_sigtramp_rt64 LINUX_2.6.15
|
|
|
|
__kernel_sync_dicache LINUX_2.6.15
|
|
|
|
__kernel_sync_dicache_p5 LINUX_2.6.15
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS s390 functions
|
|
|
|
.\" See linux/arch/s390/kernel/vdso32/vdso32.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_clock_getres LINUX_2.6.29
|
|
|
|
__kernel_clock_gettime LINUX_2.6.29
|
|
|
|
__kernel_gettimeofday LINUX_2.6.29
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS s390x functions
|
|
|
|
.\" See linux/arch/s390/kernel/vdso64/vdso64.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_clock_getres LINUX_2.6.29
|
|
|
|
__kernel_clock_gettime LINUX_2.6.29
|
|
|
|
__kernel_gettimeofday LINUX_2.6.29
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS sh (SuperH) functions
|
|
|
|
.\" See linux/arch/sh/kernel/vsyscall/vsyscall.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_rt_sigreturn LINUX_2.6
|
|
|
|
__kernel_sigreturn LINUX_2.6
|
|
|
|
__kernel_vsyscall LINUX_2.6
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS i386 functions
|
|
|
|
.\" See linux/arch/x86/vdso/vdso32/vdso32.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__kernel_sigreturn LINUX_2.5
|
|
|
|
__kernel_rt_sigreturn LINUX_2.5
|
|
|
|
__kernel_vsyscall LINUX_2.5
|
2014-08-02 16:46:23 +00:00
|
|
|
.\" Added in 7a59ed415f5b57469e22e41fc4188d5399e0b194 and updated
|
|
|
|
.\" in 37c975545ec63320789962bf307f000f08fabd48.
|
2014-08-17 15:36:39 +00:00
|
|
|
__vdso_clock_gettime LINUX_2.6 (exported since Linux 3.15)
|
|
|
|
__vdso_gettimeofday LINUX_2.6 (exported since Linux 3.15)
|
|
|
|
__vdso_time LINUX_2.6 (exported since Linux 3.15)
|
2014-01-01 08:25:39 +00:00
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS x86_64 functions
|
|
|
|
.\" See linux/arch/x86/vdso/vdso.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
All of these symbols are also available without the "__vdso_" prefix, but
|
|
|
|
you should ignore those and stick to the names below.
|
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__vdso_clock_gettime LINUX_2.6
|
|
|
|
__vdso_getcpu LINUX_2.6
|
|
|
|
__vdso_gettimeofday LINUX_2.6
|
|
|
|
__vdso_time LINUX_2.6
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS x86/x32 functions
|
|
|
|
.\" See linux/arch/x86/vdso/vdso32.lds.S
|
2014-01-01 19:41:50 +00:00
|
|
|
The table below lists the symbols exported by the vDSO.
|
2014-01-01 08:25:39 +00:00
|
|
|
.if t \{\
|
|
|
|
.ft CW
|
|
|
|
\}
|
|
|
|
.TS
|
|
|
|
l l.
|
|
|
|
symbol version
|
|
|
|
_
|
|
|
|
__vdso_clock_gettime LINUX_2.6
|
|
|
|
__vdso_getcpu LINUX_2.6
|
|
|
|
__vdso_gettimeofday LINUX_2.6
|
|
|
|
__vdso_time LINUX_2.6
|
|
|
|
.TE
|
|
|
|
.if t \{\
|
|
|
|
.in
|
|
|
|
.ft P
|
|
|
|
\}
|
|
|
|
.SS History
|
2014-01-01 10:14:33 +00:00
|
|
|
The vDSO was originally just a single function\(emthe vsyscall.
|
|
|
|
In older kernels, you might see that name
|
|
|
|
in a process's memory map rather than "vdso".
|
2014-01-10 19:04:54 +00:00
|
|
|
Over time, people realized that this mechanism
|
2014-01-01 10:14:33 +00:00
|
|
|
was a great way to pass more functionality
|
2014-01-01 08:25:39 +00:00
|
|
|
to user space, so it was reconceived as a vDSO in the current format.
|
|
|
|
.SH SEE ALSO
|
|
|
|
.BR syscalls (2),
|
|
|
|
.BR getauxval (3),
|
|
|
|
.BR proc (5)
|
|
|
|
|
2014-01-01 10:14:33 +00:00
|
|
|
The documents, examples, and source code in the Linux source code tree:
|
|
|
|
.in +4n
|
2014-01-01 08:25:39 +00:00
|
|
|
.nf
|
2014-01-01 10:14:33 +00:00
|
|
|
|
2014-01-01 08:25:39 +00:00
|
|
|
Documentation/ABI/stable/vdso
|
2014-01-01 10:14:33 +00:00
|
|
|
Documentation/ia64/fsys.txt
|
2014-01-01 08:25:39 +00:00
|
|
|
Documentation/vDSO/* (includes examples of using the vDSO)
|
2014-01-01 10:14:33 +00:00
|
|
|
|
2014-01-01 08:25:39 +00:00
|
|
|
find arch/ -iname '*vdso*' -o -iname '*gate*'
|
|
|
|
.fi
|
2014-01-01 10:14:33 +00:00
|
|
|
.in
|