syscalls(2) системные вызовы Linux

ОБЗОР

Системные вызовы Linux.

ОПИСАНИЕ

Системный вызов --- это основной интерфейс между приложением и ядром Linux.

Системные вызовы и обёрточные библиотечные функции

Обычно, системные вызовы не вызываются напрямую, это делается через обёрточную функцию из glibc (или другой библиотеки). Подробней о непосредственном вызове системного вызова, см. intro(2). Часто, но не всегда, имя обёрточной функции совпадает с именем системного вызова, который она осуществляет. Например, в glibc есть функция truncate(), которая осуществляет делающий всё работу системный вызов "truncate".

Часто, обёрточная функция glibc очень маленькая, она просто копирует аргументы в нужные регистры перед запуском системного вызова, а затем присваивает переменной errno значение, которое было возвращено системным вызовом. (Эти те же шаги выполняет syscall(2), её можно использовать для осуществления системных вызовов, для которых нет обёрточных функций.) Замечание: системные вызовы указывают, что произошла ошибка возвращая отрицательное целое число вызывающей стороне; когда это происходит, обёрточная функция меняет знак у возвращённого значения (на положительный), копирует его в errno и возвращает -1 вызвавшей обёртку функции.

Иногда, однако, обёрточная функция производит дополнительную работу до осуществления системного вызова. Например, в настоящее время существует (по причинам, описанным далее) два похожих системных вызова --- truncate(2) и truncate64(2); обёрточная функция glibc truncate() проверяет какой из системных вызовов предоставляет ядро и решает какой нужно задействовать.

Список системных вызовов

Далее приведён список список системных вызовов Linux. В колонке Ядро указана версия ядра для системных вызовов, которые появились в Linux 2.2, и с какой именно версии. Также заметим следующее:
*
Если версия ядра не указана, то системный вызов появился в ядре 1.0 или более раннем.
*
Системные вызовы, помеченные "1.2", скорее всего появились в в версиях ядра 1.1.x, и впервые появились в стабильном ядре 1.2. (Разработка ядра 1.2 началась с ответвления от ядра 1.0.6 и прошла несколько выпусков ядер 1.1.x.)
*
Системные вызовы, помеченные "1.2", скорее всего появились в в версиях ядра 1.3.x, и впервые появились в стабильном ядре 2.0. (Разработка ядра 2.0 началась с ответвления от ядра 1.2.x, начиная, приблизительно, с 1.2.10, и прошла несколько выпусков ядер 1.3.x.)
*
Системные вызовы, помеченные "2.2", скорее всего появились в в версиях ядра 2.1.x, и впервые появились в стабильном ядре 2.2.0. (Разработка ядра 2.2 началась с ответвления от ядра 2.0.21, и прошла несколько выпусков ядер 2.1.x.)
*
Системные вызовы, помеченные "2.4", скорее всего появились в в версиях ядра 2.3.x, и впервые появились в стабильном ядре 2.4.0. (Разработка ядра 2.4 началась с ответвления от ядра 2.2.8, и прошла несколько выпусков ядер 2.3.x.)
*
Системные вызовы, помеченные "2.6", скорее всего появились в в версиях ядра 2.5.x, и впервые появились в стабильном ядре 2.6.0. (Разработка ядра 2.6 началась с ответвления от ядра 2.4.15, и прошла несколько выпусков ядер 2.5.x.)
*
Начиная с ядра 2.6.0 порядок разработки был изменён, и новые системные вызовы могут появляться в каждом выпуске 2.6.x. В этом случае для системного вызова указан точный номер версии. 2.6.39. Это соглашение продолжает действовать и в ядрах серии 3.x, которая началась с ядра 2.6.39, и в ядрах серии 4.х, которая началась с ядра 3.19.
*
Иногда системный вызов, добавленный в текущую на тот момент стабильную ветвь ядра, переносился в предыдущие стабильные ветви ядра. Например, некоторые системные вызовы, которые появились в в 2.6.x были перенесены и в выпуски 2.4.x, начиная с 2.4.15. Если это производилось, будут показаны основные версии обеих ветвей ядра.

Список системных вызовов, доступных в ядре версии 4.4 (или, в некоторых случаях, только в более старых ядрах):

Системный вызов  ЯдроПримечания
_llseek(2)1.2
_newselect(2)2.0
_sysctl(2)2.0
accept(2)2.0смотрите замечания по socketcall(2)
accept4(2)2.6.28
access(2)1.0
acct(2)1.0
add_key(2)2.6.11
adjtimex(2)1.0
alarm(2)1.0
alloc_hugepages(2)2.5.36удалён в 2.5.44
bdflush(2)1.2 устарел (ничего не делает)
начиная с 2.6
bind(2)2.0смотрите замечания по socketcall(2)
bpf(2)3.18
brk(2)1.0
cacheflush(2)1.2не для x86
capget(2)2.2
capset(2)2.2
chdir(2)1.0
chmod(2)1.0
chown(2)2.2 Смотрите в chown(2)
подробности по версии
chown32(2)2.4
chroot(2)1.0
clock_adjtime(2)2.6.39
clock_getres(2)2.6
clock_gettime(2)2.6
clock_nanosleep(2)2.6
clock_settime(2)2.6
clone(2)1.0
close(2)1.0
connect(2)2.00
creat(2)1.0
create_module(2)1.0удалён в 2.6
delete_module(2)1.0
dup(2)1.0
dup2(2)1.0
dup3(2)2.6.27
epoll_create(2)2.6
epoll_create1(2)2.6.27
epoll_ctl(2)2.6
epoll_pwait(2)2.6.19
epoll_wait(2)2.6
eventfd(2)2.6.22
eventfd2(2)2.6.27
execve(2)1.0
execveat(2)3.19
exit(2)1.0
exit_group(2)2.6
faccessat(2)2.6.16
fadvise64(2)2.6
fadvise64_64(2)2.6
fallocate(2)2.6.23
fanotify_init(2)2.6.37
fanotify_mark(2)2.6.37
fchdir(2)1.0
fchmod(2)1.0
fchmodat(2)2.6.16
fchown(2)1.0
fchown32(2)2.4
fchownat(2)2.6.16
fcntl(2)1.0
fcntl64(2)2.4
fdatasync(2)2.0
fgetxattr(2)2.6; 2.4.18
finit_module(2)3.8
flistxattr(2)2.6; 2.4.18
flock(2)2.0
fork(2)1.0
free_hugepages(2)2.5.36удалён в 2.5.44
fremovexattr(2)2.6; 2.4.18
fsetxattr(2)2.6; 2.4.18
fstat(2)1.0
fstat64(2)2.4
fstatat64(2)2.6.16
fstatfs(2)1.0
fstatfs64(2)2.6
fsync(2)1.0
ftruncate(2)1.0
ftruncate64(2)2.4
futex(2)2.6
futimesat(2)2.6.16
get_kernel_syms(2)1.0удалён в 2.6
get_mempolicy(2)2.6.6
get_robust_list(2)2.6.17
get_thread_area(2)2.6
getcpu(2)2.6.19
getcwd(2)2.2
getdents(2)2.0
getdents64(2)2.4
getegid(2)1.0
getegid32(2)2.4
geteuid(2)1.0
geteuid32(2)2.4
getgid(2)1.0
getgid32(2)2.4
getgroups(2)1.0
getgroups32(2)2.4
getitimer(2)1.0
getpeername(2)2.0смотрите замечания по socketcall(2)
getpagesize(2)2.0не для x86
getpgid(2)1.0
getpgrp(2)1.0
getpid(2)1.0
getppid(2)1.0
getpriority(2)1.0
getrandom(2)3.17
getresgid(2)2.2
getresgid32(2)2.4
getresuid(2)2.2
getresuid32(2)2.4
getrlimit(2)1.0
getrusage(2)1.0
getsid(2)2.0
getsockname(2)2.0смотрите замечания по socketcall(2)
getsockopt(2)2.0смотрите замечания по socketcall(2)
gettid(2)2.4.11
gettimeofday(2)1.0
getuid(2)1.0
getuid32(2)2.4
getxattr(2)2.6; 2.4.18
init_module(2)1.0
inotify_add_watch(2)2.6.13
inotify_init(2)2.6.13
inotify_init1(2)2.6.27
inotify_rm_watch(2)2.6.13
io_cancel(2)2.6
io_destroy(2)2.6
io_getevents(2)2.6
io_setup(2)2.6
io_submit(2)2.6
ioctl(2)1.0
ioperm(2)1.0
iopl(2)1.0
ioprio_get(2)2.6.13
ioprio_set(2)2.6.13
ipc(2)1.0
kcmp(2)3.5
kern_features(2)3.7Sparc64
kexec_file_load(2)3.17
kexec_load(2)2.6.13
keyctl(2)2.6.11
kill(2)1.0
lchown(2)1.0 Смотрите в chown(2)
подробности по версии
lchown32(2)2.4
lgetxattr(2)2.6; 2.4.18
link(2)1.0
linkat(2)2.6.16
listen(2)2.0смотрите замечания по socketcall(2)
listxattr(2)2.6; 2.4.18
llistxattr(2)2.6; 2.4.18
lookup_dcookie(2)2.6
lremovexattr(2)2.6; 2.4.18
lseek(2)1.0
lsetxattr(2)2.6; 2.4.18
lstat(2)1.0
lstat64(2)2.4
madvise(2)2.4
mbind(2)2.6.6
memfd_create(2)3.17
migrate_pages(2)2.6.16
mincore(2)2.4
mkdir(2)1.0
mkdirat(2)2.6.16
mknod(2)1.0
mknodat(2)2.6.16
mlock(2)2.0
mlock2(2)4.4
mlockall(2)2.0
mmap(2)1.0
mmap2(2)2.4
modify_ldt(2)1.0
mount(2)1.0
move_pages(2)2.6.18
mprotect(2)1.0
mq_getsetattr(2)2.6.6
mq_notify(2)2.6.6
mq_open(2)2.6.6
mq_timedreceive(2)2.6.6
mq_timedsend(2)2.6.6
mq_unlink(2)2.6.6
mremap(2)2.0
msgctl(2)2.0смотрите замечания по ipc(2)
msgget(2)2.0смотрите замечания по ipc(2)
msgrcv(2)2.0смотрите замечания по ipc(2)
msgsnd(2)2.0смотрите замечания по ipc(2)
msync(2)2.0
munlock(2)2.0
munlockall(2)2.0
munmap(2)1.0
name_to_handle_at(2)2.6.39
nanosleep(2)2.0
nfsservctl(2)2.2удалён в 3.1
nice(2)1.0
oldfstat(2)1.0
oldlstat(2)1.0
oldolduname(2)1.0
oldstat(2)1.0
olduname(2)1.0
open(2)1.0
open_by_handle_at(2)2.6.39
openat(2)2.6.16
pause(2)1.0
pciconfig_iobase(2)2.2.15; 2.4не в x86
pciconfig_read(2)2.0.26; 2.2не в x86
pciconfig_write(2)2.0.26; 2.2не в x86
perf_event_open(2)2.6.31 Был perf_counter_open() в
2.6.31; в 2.6.32 переименовано
personality(2)1.2
perfctr(2)2.2Sparc; удалён в 2.6.34
perfmonctl(2)2.4ia64
pipe(2)1.0
pipe2(2)2.6.27
pivot_root(2)2.4
poll(2)2.0.36; 2.2
ppc_rtas(2)2.6.2Только для PowerPC
ppoll(2)2.6.16
prctl(2)2.2
pread64(2) добавлен под именем «pread» в 2.2
переименован в «pread64» в 2.6
preadv(2)2.6.30
prlimit64(2)2.6.36
process_vm_readv(2)3.2
process_vm_writev(2)3.2
pselect6(2)2.6.16
ptrace(2)1.0
pwrite64(2) добавлен под именем «pwrite» в 2.2
переименован в «pwrite64» в 2.6
pwritev(2)2.6.30
query_module(2)2.2удалён в 2.6
quotactl(2)1.0
read(2)1.0
readahead(2)2.4.13
readdir(2)1.0
readlink(2)1.0
readlinkat(2)2.6.16
readv(2)2.0
reboot(2)1.0
recv(2)2.0смотрите замечания по socketcall(2)
recvfrom(2)2.0смотрите замечания по socketcall(2)
recvmsg(2)2.0смотрите замечания по socketcall(2)
recvmmsg(2)2.6.33
remap_file_pages(2)2.6устарел начиная с 3.16
removexattr(2)2.6; 2.4.18
rename(2)1.0
renameat(2)2.6.16
renameat2(2)3.15
request_key(2)2.6.11
restart_syscall(2)2.6
rmdir(2)1.0
rt_sigaction(2)2.2
rt_sigpending(2)2.2
rt_sigprocmask(2)2.2
rt_sigqueueinfo(2)2.2
rt_sigreturn(2)2.2
rt_sigsuspend(2)2.2
rt_sigtimedwait(2)2.2
rt_tgsigqueueinfo(2)2.6.31
s390_runtime_instr(2)3.7только для s390
s390_pci_mmio_read(2)3.19только для s390
s390_pci_mmio_write(2)3.19только для s390
sched_get_priority_max(2)2.0
sched_get_priority_min(2)2.0
sched_getaffinity(2)2.6
sched_getattr(2)3.14
sched_getparam(2)2.0
sched_getscheduler(2)2.0
sched_rr_get_interval(2)2.0
sched_setaffinity(2)2.6
sched_setattr(2)3.14
sched_setparam(2)2.0
sched_setscheduler(2)2.0
sched_yield(2)2.0
seccomp(2)3.17
select(2)1.0
semctl(2)2.0смотрите замечания по ipc(2)
semget(2)2.0смотрите замечания по ipc(2)
semop(2)2.0смотрите замечания по ipc(2)
semtimedop(2)2.6; 2.4.22
send(2)2.0смотрите замечания по socketcall(2)
sendfile(2)2.2
sendfile64(2)2.6; 2.4.19
sendmmsg(2)3.0
sendmsg(2)2.0смотрите замечания по socketcall(2)
sendto(2)2.0смотрите замечания по socketcall(2)
set_mempolicy(2)2.6.6
set_robust_list(2)2.6.17
set_thread_area(2)2.6
set_tid_address(2)2.6
setdomainname(2)1.0
setfsgid(2)1.2
setfsgid32(2)2.4
setfsuid(2)1.2
setfsuid32(2)2.4
setgid(2)1.0
setgid32(2)2.4
setgroups(2)1.0
setgroups32(2)2.4
sethostname(2)1.0
setitimer(2)1.0
setns(2)3.0
setpgid(2)1.0
setpriority(2)1.0
setregid(2)1.0
setregid32(2)2.4
setresgid(2)2.2
setresgid32(2)2.4
setresuid(2)2.2
setresuid32(2)2.4
setreuid(2)1.0
setreuid32(2)2.4
setrlimit(2)1.0
setsid(2)1.0
setsockopt(2)2.0смотрите замечания по socketcall(2)
settimeofday(2)1.0
setuid(2)1.0
setuid32(2)2.4
setup(2)1.0удалён в 2.2
setxattr(2)2.6; 2.4.18
sgetmask(2)1.0
shmat(2)2.0смотрите замечания по ipc(2)
shmctl(2)2.0смотрите замечания по ipc(2)
shmdt(2)2.0смотрите замечания по ipc(2)
shmget(2)2.0смотрите замечания по ipc(2)
shutdown(2)2.0смотрите замечания по socketcall(2)
sigaction(2)1.0
sigaltstack(2)2.2
signal(2)1.0
signalfd(2)2.6.22
signalfd4(2)2.6.27
sigpending(2)1.0
sigprocmask(2)1.0
sigreturn(2)1.0
sigsuspend(2)1.0
socket(2)2.0смотрите замечания по socketcall(2)
socketcall(2)1.0
socketpair(2)2.0смотрите замечания по socketcall(2)
splice(2)2.6.17
spu_create(2)2.6.16только для PowerPC
spu_run(2)2.6.16только для PowerPC
ssetmask(2)1.0
stat(2)1.0
stat64(2)2.4
statfs(2)1.0
statfs64(2)2.6
stime(2)1.0
subpage_prot(2)2.6.25только для PowerPC
swapoff(2)1.0
swapon(2)1.0
symlink(2)1.0
symlinkat(2)2.6.16
sync(2)1.0
sync_file_range(2)2.6.17
sync_file_range2(2)2.6.22
syncfs(2)2.6.39
sysfs(2)1.2
sysinfo(2)1.0
syslog(2)1.0
tee(2)2.6.17
tgkill(2)2.6
time(2)1.0
timer_create(2)2.6
timer_delete(2)2.6
timer_getoverrun(2)2.6
timer_gettime(2)2.6
timer_settime(2)2.6
timerfd_create(2)2.6.25
timerfd_gettime(2)2.6.25
timerfd_settime(2)2.6.25
times(2)1.0
tkill(2)2.6; 2.4.22
truncate(2)1.0
truncate64(2)2.4
ugetrlimit(2)2.4
umask(2)1.0
umount(2)1.0
umount2(2)2.2
uname(2)1.0
unlink(2)1.0
unlinkat(2)2.6.16
unshare(2)2.6.16
uselib(2)1.0
ustat(2)1.0
userfaultfd(2)4.2
utime(2)1.0
utimensat(2)2.6.22
utimes(2)2.2
utrap_install(2)2.2только для SPARC

vfork(2)2.2
vhangup(2)1.0
vm86old(2)1.0 ранее «vm86»; переименован в 2.0.28/2.2
vm86(2)2.0.28; 2.2
vmsplice(2)2.6.17
wait4(2)1.0
waitid(2)2.6.10
waitpid(2)1.0
write(2)1.0
writev(2)2.0

Для многих платформ, включая x86-32, все сокетные вызовы мультиплексируются (с помощью обёрточных функций glibc) через socketcall(2), а подобные IPC вызовы System V мультиплексируются через ipc(2).

Хотя для них и зарезервированы места в таблице системных вызовов, следующие системные вызовы не реализованы в стандартном ядре: afs_syscall(2), break(2), ftime(2), getpmsg(2), gtty(2), idle(2), lock(2), madvise1(2), mpx(2), phys(2), prof(2), profil(2), putpmsg(2), security(2), stty(2), tuxcall(2), ulimit(2) и vserver(2) (см. также unimplemented(2)). Однако ftime(3), profil(3) и ulimit(3) есть среди библиотечных функций. Место для phys(2) занято начиная с ядра 2.1.116 под umount(2); phys(2) никогда не будет реализован. Вызовы getpmsg(2) и putpmsg(2) есть в ядрах с заплатами, обеспечивающими поддержку STREAMS, и могут никогда не появиться в стандартном ядре.

На короткое время появлялся set_zone_reclaim(2), добавленный в Linux 2.6.13 и удалённый в 2.6.16; данный системный вызов никогда не был доступен из пользовательского пространства.

ЗАМЕЧАНИЯ

Чаще всего, код системного вызова с номером __NR_xxx, определённого в /usr/include/asm/unistd.h, можно найти в исходном коде ядра Linux в функции sys_xxx(). (Таблицу вызовов для i386 можно найти в /usr/src/linux/arch/i386/kernel/entry.S.) Есть много исключений из этого правила, в основном из-за того, что большинство старых системных вызовов заменена на новые, при чём без всякой системы. На платформах с эмуляцией собственнических ОС, таких как parisc, sparc, sparc64 и alpha, существует много дополнительных системных вызовов; для mips64 также есть полный набор 32-битных системных вызовов.

С течением времени при необходимости происходили изменения в интерфейсе некоторых системных вызовов. Одной из причин таких изменений была необходимость увеличения размера структур или скалярных значений передаваемых системному вызову. Из-за этих изменений на некоторых архитектурах (а именно на старых 32-битных i386) появились различные группы похожих системных вызовов (например, truncate(2) и truncate64(2)), которые выполняют одинаковые задачи, но отличаются размером своих аргументов. (Как уже отмечалось, на приложения это не влияет: обёрточные функции glibc выполняют некоторые действия по запуску правильного системного вызова, и это обеспечивает совместимость по ABI для старых двоичных файлов.) Примеры системных вызовов, у которых есть несколько версий:

*
В настоящее время есть три различные версии stat(2): sys_stat() (место __NR_oldstat), sys_newstat() (место __NR_stat) и sys_stat64() (место __NR_stat64), последняя используется в в данный момент. Похожая ситуация с lstat(2) и fstat(2).
*
Похожим образом определены __NR_oldolduname, __NR_olduname и__NR_uname для вызовов sys_olduname(), sys_uname() и sys_newuname().
*
В Linux 2.0 появилась новая версия vm86(2), новая и старая версии ядерных процедур называются sys_vm86old() и sys_vm86().
*
В Linux 2.4 появилась новая версия getrlimit(2) новая и старая версии ядерных процедур называются sys_old_getrlimit() (место __NR_getrlimit) и sys_getrlimit() (место __NR_ugetrlimit).
*
В Linux 2.4 увеличено размер поля ID пользователей и групп с 16 до 32 бит. Для поддержки этого изменения добавлено несколько системных вызовов (например, chown32(2), getuid32(2), getgroups32(2), setresuid32(2)), упраздняющих ранние вызовы с теми же именами, но без суффикса "32".
*
В Linux 2.4 добавлена поддержка доступа к большим файлам (у которых размеры и смещения не умещаются в 32 бита) в приложениях на 32-битных архитектурах. Для этого потребовалось внести изменения в системные вызовы, работающие с размерами и смещениями по файлам. Были добавлены следующие системные вызовы: fcntl64(2), getdents64(2), stat64(2), statfs64(2), truncate64(2) и их аналоги, которые обрабатывают файловые дескрипторы или символьные ссылки. Эти системные вызовы упраздняют старые системные вызовы, которые, за исключением вызовов «stat», называются также, но не имеют суффикса «64».

На новых платформах, имеющих только 64-битный доступ к файлам и 32-битные UID/GID (например, alpha, ia64, s390x, x86-64), есть только одна версия системных вызовов для UID/GID и файлового доступа. На платформах (обычно это 32-битные платформы) где имеются *64 и *32 вызовы, другие версии устарели.

*
Вызовы rt_sig* добавлены в ядро 2.2 для поддержки дополнительных сигналов реального времени (см. signal(7)). Эти системные вызовы упраздняют старые системные вызовы с теми же именами, но без префикса "rt_".
*
В системных вызовах select(2) и mmap(2) используется пять или более аргументов, что вызывало проблемы определения способа передачи аргументов на i386. В следствии этого, тогда как на других архитектурах вызовы sys_select() и sys_mmap() соответствуют __NR_select и __NR_mmap, на i386 они соответствуют old_select() и old_mmap() (процедуры, использующие указатель на блок аргументов). В настоящее время больше нет проблемы с передачей более пяти аргументов и есть __NR__newselect, который соответствует именно sys_select(), и такая же ситуация с __NR_mmap2.