syscalls(2) | System Calls Manual | syscalls(2) |
NOMBRE
syscalls - llamadas al sistema de Linux
SINOPSIS
Llamadas al sistema de Linux.
DESCRIPCIÓN
La llamada al sistema es la interfaz fundamental entre una aplicación y el kernel Linux.
Llamadas al sistema y funciones envoltorio (wrapper) de librería
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.
Lista de Llamadas al Sistema
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.
Llamadas al sistema removidos en ports
Algunas llamadas al sistema sólo han existido en arquitecturas Linux que han sido eliminadas del núcleo:
- •
- bfin_spinlock(2) (added in Linux 2.6.22)
- •
- dma_memcpy(2) (added in Linux 2.6.22)
- •
- pread(2) (añadida en Linux 2.6.22)
- •
- pwrite(2) (añadida en Linux 2.6.22)
- •
- sram_alloc(2) (añadida en Linux 2.6.22)
- •
- sram_free(2) (añadida en Linux 2.6.22)
- •
- metag_get_tls(2) (add in Linux 3.9)
- •
- metag_set_fpu_flags(2) (add in Linux 3.9)
- •
- metag_set_tls(2) (add in Linux 3.9)
- •
- metag_setglobalbit(2) (add in Linux 3.9)
- •
- cmpxchg_badaddr(2) (added in Linux 2.6.36)
NOTAS
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().
Detalles específicos de la arquitectura: Alpha
- 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.
VÉASE TAMBIÉN
ausyscall(1), intro(2), syscall(2), unimplemented(2), errno(3), libc(7), vdso(7)
TRADUCCIÓN
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.
2 Mayo 2024 | Páginas de Manual de Linux 6.8 |