Una llamada al sistema es una entrada definida al kernel mediante la cual el código del espacio de usuario solicita una operación, como abrir un archivo, asignar memoria, crear un proceso o enviar datos por la red. El kernel valida los argumentos, las credenciales, el estado de los objetos y la política de seguridad antes de realizar la solicitud.
Kernel · Lección 3
Llamadas al sistema
Aprende cómo el código del espacio de usuario invoca servicios del kernel de Linux y cómo inspeccionar llamadas de forma segura con `strace`.
Bibliotecas y ABI de llamadas al sistema
Las aplicaciones suelen llamar a funciones de la biblioteca de C en lugar de escribir instrucciones de entrada específicas de la arquitectura. Un envoltorio de biblioteca prepara los registros y la memoria según la ABI de llamadas al sistema, entra en el kernel y traduce el resultado a la convención del lenguaje.
La relación no siempre es de una función por cada llamada al sistema:
- una función de biblioteca puede combinar varias llamadas al sistema
- algunas funciones operan por completo en el espacio de usuario
- una función vDSO optimizada puede obtener ciertos datos mantenidos por el kernel sin una transición completa de modo
- una llamada al sistema puede dar soporte a muchas API de mayor nivel
¿Qué hace un envoltorio típico de libc para una llamada al sistema?
Entrar y salir del kernel
El envoltorio coloca un número de llamada al sistema y sus argumentos en las ubicaciones definidas por la arquitectura, y después ejecuta una instrucción de entrada como syscall en x86-64 o svc en AArch64. El procesador cambia a un punto de entrada privilegiado configurado y el kernel distribuye la solicitud.
Al terminar, el kernel devuelve un valor o una indicación de error. Los envoltorios de la biblioteca de C suelen devolver -1 y establecer el errno local del hilo cuando se produce un error. Otros lenguajes y entornos de ejecución exponen tipos de error diferentes.
Llamar «interrupción de software» a todas las entradas es impreciso en las arquitecturas actuales; las trampas, las instrucciones rápidas de llamadas al sistema y las llamadas al supervisor implementan de maneras distintas transiciones controladas relacionadas.
¿Quién valida los argumentos y la autorización de una llamada al sistema?
Números y compatibilidad
Los números de las llamadas al sistema y sus convenciones de llamada son específicos de cada arquitectura. La misma llamada simbólica puede tener un número o una disposición de estructuras diferente en otra ABI. Las versiones del kernel pueden añadir llamadas al sistema, mientras que las ABI estables del espacio de usuario intentan conservar el comportamiento existente.
Un proceso sin privilegios no puede insertar manejadores arbitrarios nuevos en la tabla de llamadas al sistema del kernel activo. Ampliar la interfaz requiere código del kernel y un diseño cuidadoso de la ABI. Funciones como seccomp pueden filtrar qué llamadas tiene permitido realizar un proceso, pero no crean nuevas implementaciones en el kernel.
¿Por qué debe una aplicación evitar codificar directamente números de llamadas al sistema de otra arquitectura?
Rastrear con `strace`
Rastrea un comando sencillo y guarda la salida por separado:
$ strace -o trace.log -- ls
Cuando dispongas de autorización, sigue los procesos hijo con -f o limita la salida mediante una expresión como:
$ strace -f -e trace=%file -o trace.log -- command
strace puede revelar rutas, argumentos, datos derivados del entorno, direcciones de red, fragmentos del contenido de archivos y credenciales pasadas incorrectamente mediante argumentos. Almacena los rastros con permisos restrictivos y elimínalos de acuerdo con la política de datos de incidentes.
¿Qué observa principalmente strace?
Interpretar los rastros con cuidado
El rastreo altera los tiempos y puede imponer una sobrecarga considerable. Una llamada fallida puede ser una comprobación esperada, y el último error visible puede ser consecuencia de una operación anterior o de la política de la aplicación. Interpreta los descriptores de archivo, sigue las relaciones entre procesos y relaciona los resultados con los registros de la aplicación.
Los permisos y la política de seguridad de ptrace restringen qué procesos pueden rastrearse. No te conectes al proceso de otro usuario o a uno de producción sin autorización; las suspensiones y los cambios de tiempos pueden afectar al comportamiento del servicio.
¿Significa necesariamente que la aplicación está averiada el hecho de que falle una llamada al sistema en un rastro?
Lección completada
Has completado Llamadas al sistema
Ahora puedes seguir una llamada al sistema desde la API de una biblioteca hasta el trabajo validado del kernel.
Distingue las funciones de alto nivel de la ABI de llamadas al sistema.
Relaciona las instrucciones de entrada de la arquitectura con la distribución controlada del kernel.
Trata los números y las estructuras de las llamadas al sistema como elementos específicos de la arquitectura.
Usa salidas filtradas de
stracey protege los datos sensibles.Interpreta los fallos y la sobrecarga del rastreo en el contexto de la aplicación.
Guarda tu progreso
Crea una cuenta gratuita para guardar esta lección y continuar en cualquier dispositivo.
Crear una cuenta gratuita