syscalls - llamadas al sistema de Linux
Llamadas al sistema de Linux.
La llamada al sistema es la interfaz fundamental entre una
aplicación y el kernel Linux.
Las llamadas al sistema generalmente no son invocadas
directamente, sino a través de funciones envoltura en glibc (o
quizás alguna otra librería). Para detalles acerca de la
invocación directa de una función envoltura, ver
intro(2). A menudo, pero no siempre, el nombre de la función
envoltura es el mismo que el nombre de la llamada al sistema que invoca. Por
ejemplo, glibc contiene una función llamada chdir() la cual
invoca la llamada al sistema "chdir" subyacente.
A menudo la función envoltura de glibc is muy
pequeña, haciendo muy poco además de copiar los argumentos a
los registros correctos antes de invocar la llamada al sistema, y luego
establecer el errno apropiado después de que la llamada al
sistema haya terminado. (Estos son los mismos pasos realizados por
syscall(2), que puede utilizarse para invocar llamadas al sistema
para las que no se proporciona ninguna función envoltura.) Nota: las
llamadas al sistema indican un error retornando un número de error
negativo al invocador en arquitecturas sin un registro/bandera de error
separado, como se indica en syscall(2); cuando esto pasa, la
función envoltura niega el número de error retornado (para
hacerlo positivo), lo copia a errno, y retorna -1 al invocador de la
función envoltura.
A veces, sin embargo, la función envoltura hace algo de
trabajo extra antes de invocar la llamada al sistema. Por ejemplo,
actualmente hay (por razones descritas a continuación) dos llamadas
al sistema relacionadas, truncate(2) y truncate64(2), y la
función envoltura glibc truncate() revisa cual de esas
llamadas al sistema son provistas por el kernel y determina cual
debería ser empleada.
A continuación está una lista de las llamadas al
sistema Linux. En la lista, la columna Kernel indica la
versión del kernel de esas llamadas al sistema que eran nuevas en
Linux 2.2, o aparecieron desde esa versión del kernel. Nótense
los siguientes puntos:
- •
- Donde no se indica la versión del kernel, la llamada al sistema
apareció en Linux 1.0 o antes.
- •
- Where a system call is marked "1.2" this means the system call
probably appeared in a Linux 1.1.x kernel version, and first appeared in a
stable kernel with 1.2. (Development of the Linux 1.2 kernel was initiated
from a branch of Linux 1.0.6 via the Linux 1.1.x unstable kernel
series.)
- •
- Donde una llamada al sistema es marcada con "2.0" esto significa
que la llamada al sistema probablemente apareció en una
versión 1.3.x del kernel Linux, y primero apareció en un
kernel Linux 2.0 estable. (El desarrollo del kernel Linux 2.0 fue iniciado
de una rama Linux 1.2.x, en algún punto alrededor de Linux 1.2.10,
a través de la serie de kernels inestables Linux 1.3.x.)
- •
- Where a system call is marked "2.2" this means the system call
probably appeared in a Linux 2.1.x kernel version, and first appeared in a
stable kernel with Linux 2.2.0. (Development of the Linux 2.2 kernel was
initiated from a branch of Linux 2.0.21 via the Linux 2.1.x unstable
kernel series.)
- •
- Donde una llamada al sistema es marcada con "2.4" esto significa
que la llamada al sistema probablemente apareció en una
versión 2.3.x del kernel Linux, y primero apareció en una
versión estable del kernel Linux 2.4.0. (El desarrollo del kernel
Linux 2.4 fue iniciado de una rama de Linux 2.2.8 a través de la
serie de kernels inestables Linux 2.3.x.)
- •
- Donde una llamada al sistema es marcada con "2.6" esto significa
que la llamada al sistema probablemente apareció en una
versión 2.5.x del kernel Linux, y primero apareció en una
versión estable del kernel Linux 2.6.0. (El desarrollo del kernel
Linux 2.6 fue iniciado de una rama de Linux 2.4.15 a través de la
serie de kernels inestables Linux 2.5.x.)
- •
- Starting with Linux 2.6.0, the development model changed, and new system
calls may appear in each Linux 2.6.x release. In this case, the exact
version number where the system call appeared is shown. This convention
continues with the Linux 3.x kernel series, which followed on from Linux
2.6.39; and the Linux 4.x kernel series, which followed on from Linux
3.19; and the Linux 5.x kernel series, which followed on from Linux 4.20;
and the Linux 6.x kernel series, which followed on from Linux 5.19.
- •
- En algunos casos, una llamada al sistema se añadió a una
serie estable del kernel después de que se ramificara desde la
serie estable anterior del kernel, y luego se retroportó a la serie
estable anterior del kernel. Por ejemplo, algunas llamadas al sistema que
aparecieron en Linux 2.6.x también fueron retroportadas a una
versión Linux 2.4.x posterior a Linux 2.4.15. Cuando esto es
así, se lista la versión en la que la llamada al sistema
apareció en ambas series principales del núcleo.
La lista de llamadas al sistema que están disponibles a
partir de Linux 5.14 (o en algunos casos sólo en núcleos
más antiguos) es la siguiente:
On many platforms, including x86-32, socket calls are all
multiplexed (via glibc wrapper functions) through socketcall(2) and
similarly System V IPC calls are multiplexed through
ipc(2).
Although slots are reserved for them in the system call table, the
following system calls are not implemented in the standard kernel:
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), and vserver(2) (see also unimplemented(2)).
However, ftime(3), profil(3), and ulimit(3) exist as
library routines. The slot for phys(2) is in use since Linux 2.1.116
for umount(2); phys(2) will never be implemented. The
getpmsg(2) and putpmsg(2) calls are for kernels patched to
support STREAMS, and may never be in the standard kernel.
Existía brevemente set_zone_reclaim(2),
añadida en Linux 2.6.13, y eliminada en Linux 2.6.16; esta llamada al
sistema nunca estuvo disponible para el espacio de usuario.
Roughly speaking, the code belonging to the system call with
number __NR_xxx defined in /usr/include/asm/unistd.h can be found in
the Linux kernel source in the routine sys_xxx(). There are many
exceptions, however, mostly because older system calls were superseded by
newer ones, and this has been treated somewhat unsystematically. On
platforms with proprietary operating-system emulation, such as sparc,
sparc64, and alpha, there are many additional system calls; mips64 also
contains a full set of 32-bit system calls.
Over time, changes to the interfaces of some system calls have
been necessary. One reason for such changes was the need to increase the
size of structures or scalar values passed to the system call. Because of
these changes, certain architectures (notably, longstanding 32-bit
architectures such as i386) now have various groups of related system calls
(e.g., truncate(2) and truncate64(2)) which perform similar
tasks, but which vary in details such as the size of their arguments. (As
noted earlier, applications are generally unaware of this: the glibc wrapper
functions do some work to ensure that the right system call is invoked, and
that ABI compatibility is preserved for old binaries.) Examples of system
calls that exist in multiple versions are the following:
- •
- Por ahora existen tres versiones diferentes de stat(2):
sys_stat() (ranura __NR_oldstat), sys_newstat()
(ranura __NR_stat), e sys_stat64() (ranura
__NR_stat64), siendo la última la más actual. Algo
similar ocurre con lstat(2) y fstat(2).
- •
- De forma similar, las definiciones __NR_olduname,
__NR_olduname e __NR_uname hacen referencia a las rutinas
sys_olduname(), sys_uname() e sys_newuname().
- •
- En Linux 2.0, apareció una nueva versión de vm86(2),
con las rutinas del kernel antiguas y nuevas denominadas
sys_vm86old() e sys_vm86().
- •
- En Linux 2.4, apareció una nueva versión de
getrlimit(2), con las rutinas del kernel antigua y nueva
denominadas sys_old_getrlimit() (ranura __NR_getrlimit) e
sys_getrlimit() (ranura __NR_ugetrlimit).
- •
- Linux 2.4 aumentó el tamaño de los identificadores de
usuario y grupo de 16 a 32 bits. Para soportar este cambio, se
añadieron una serie de llamadas al sistema (por ejemplo,
chown32(2), getuid32(2), getgroups32(2),
setresuid32(2)), sustituyendo a las llamadas anteriores del mismo
nombre sin el sufijo "32".
- •
- Linux 2.4 añadió soporte para aplicaciones en arquitecturas
de 32 bits para acceder a archivos grandes (es decir, archivos cuyos
tamaños y offsets no pueden representarse en 32 bits). Para
soportar este cambio, se requirieron reemplazos para las llamadas al
sistema que tratan con offsets y tamaños de archivos. Así,
se añadieron las siguientes llamadas al sistema: fcntl64(2),
getdents64(2), stat64(2), statfs64(2),
truncate64(2), y sus análogos que trabajan con descriptores
de fichero o enlaces simbólicos. Estas llamadas al sistema
sustituyen a las antiguas llamadas al sistema que, excepto en el caso de
las llamadas "stat", tienen el mismo nombre sin el sufijo
"64".
- On newer platforms that only have 64-bit file access and 32-bit UIDs/GIDs
(e.g., alpha, ia64, s390x, x86-64), there is just a single version of the
UID/GID and file access system calls. On platforms (typically, 32-bit
platforms) where the *64 and *32 calls exist, the other versions are
obsolete.
- •
- Las llamadas rt_sig* se añadieron en Linux 2.2 para soportar
la adición de señales en tiempo real (ver signal(7)).
Estas llamadas al sistema sustituyen a las antiguas llamadas al sistema
del mismo nombre sin el prefijo "rt_".
- •
- The select(2) and mmap(2) system calls use five or more
arguments, which caused problems in the way argument passing on the i386
used to be set up. Thus, while other architectures have
sys_select() and sys_mmap() corresponding to
__NR_select and __NR_mmap, on i386 one finds
old_select() and old_mmap() (routines that use a pointer to
an argument block) instead. These days passing five arguments is not a
problem any more, and there is a __NR__newselect that corresponds
directly to sys_select() and similarly __NR_mmap2. s390x is
the only 64-bit architecture that has old_mmap().
- getxgid(2)
- retorna un par de GID y GID efectivo a través de los registros
r0 y r20; seproporcionan en lugar de getgid(2) y
getegid(2).
- getxpid(2)
- devuelve un par de PID y PID padre a través de los registros
r0 y r20; se proporciona en lugar de getpid(2) y
getppid(2).
- old_adjtimex(2)
- es una variante de adjtimex(2) que utiliza struct timeval32,
por compatibilidad con OSF/1.
- getxuid(2)
- devuelve un par de GID y GID efectivo a través de los registros
r0 y r20; se proporciona en lugar de getuid(2) y
geteuid(2).
- sethae(2)
- se utiliza para configurar el registro Host Address Extension en los
Alphas de bajo coste con el fin de acceder al espacio de direcciones
más allá de los primeros 27 bits.
La traducción al español de esta página del
manual fue creada por Juan José López Mellado
<laveneno@hotmail.com>, Juan Piernas <piernas@ditec.um.es> y
Ivan Robles <navitux@disroot.org>
Esta traducción es documentación libre; lea la
GNU General
Public License Version 3 o posterior con respecto a las condiciones de
copyright. No existe NINGUNA RESPONSABILIDAD.
Si encuentra algún error en la traducción de esta
página del manual, envíe un correo electrónico a
debian-l10n-spanish@lists.debian.org.