Quiz 5 - System Calls (Llamadas al Sistema)
Llamadas al sistema en sistemas operativos: mecanismo trap, pasos de ejecución, el estándar POSIX y la interfaz entre programas y kernel.
Teoría
Las llamadas al sistema (system calls) son el mecanismo mediante el cual los programas de usuario solicitan servicios al sistema operativo. Son el puente entre los programas y el kernel, permitiendo operaciones como leer archivos, crear procesos o gestionar memoria.
Una llamada al sistema funciona de la siguiente manera: un proceso en modo usuario necesita un servicio del kernel (como leer un archivo). Para ello ejecuta una instrucción de trampa (trap), específicamente la instrucción SYSCALL en arquitecturas x86-64, que cambia el modo de usuario a modo kernel y transfiere el control a una dirección fija dentro del kernel.
El proceso completo consta de 10 pasos:
- La aplicación prepara los parámetros en registros (RDI, RSI, RDX en x86-64).
- Llama a la función de biblioteca (ej.
read). - La biblioteca coloca el número de llamada en el registro RAX.
- Ejecuta la instrucción
SYSCALL(trap) para entrar al kernel. - El kernel examina el número de llamada y lo despacha al manejador correcto mediante una tabla de punteros.
- El manejador ejecuta la operación solicitada.
- El control regresa a la biblioteca en espacio de usuario.
- La biblioteca retorna al programa de usuario.
El estándar POSIX define aproximadamente 100 llamadas al sistema para crear/terminar procesos, manejar archivos/directorios y realizar E/S. Sin embargo, no todas las funciones POSIX corresponden directamente a llamadas al sistema: algunas pueden ejecutarse completamente en espacio de usuario por eficiencia, y varias funciones de biblioteca pueden compartir una misma llamada al sistema.
Es importante destacar que una llamada al sistema puede bloquear al proceso (por ejemplo, al esperar entrada del teclado). En ese caso, el sistema operativo selecciona otro proceso listo para ejecutarse hasta que los datos estén disponibles.
Quiz
¿Cuáles son las dos funciones principales del sistema operativo?
Proveer abstracciones a los programas de usuario y administrar los recursos del computador.
¿Con qué parte del sistema operativo interactúan principalmente los programas de usuario?
Con las abstracciones que provee el sistema operativo.
¿Es la gestión de recursos del sistema operativo visible para el usuario?
No, generalmente es transparente y automática.
¿Qué interfaz se analiza para comprender lo que hace un sistema operativo?
La interfaz entre los programas de usuario y el sistema operativo.
¿Varían las llamadas al sistema entre diferentes sistemas operativos?
Sí, pero los conceptos subyacentes son similares.
¿Qué enfoque se eligió en el texto para explicar las llamadas al sistema?
El enfoque específico, usando POSIX y sistemas como UNIX, Linux y MINIX 3.
¿Qué permite una biblioteca de procedimientos en relación a las llamadas al sistema?
Permite realizar llamadas al sistema desde programas en C y otros lenguajes.
¿Qué debe hacer un proceso en modo usuario para solicitar un servicio del sistema operativo?
Ejecutar una instrucción de trampa (trap) para transferir el control al sistema operativo.
¿Qué hace el sistema operativo al recibir una llamada al sistema?
Inspecciona los parámetros, ejecuta la llamada y retorna el control al proceso.
¿A qué se parece una llamada al sistema?
A una llamada a procedimiento especial que entra al kernel.
¿Cuántos parámetros tiene la llamada al sistema read?
Tres: archivo, búfer y número de bytes a leer.
¿Cómo se invoca una llamada al sistema desde un programa en C?
Llamando a una función de biblioteca con el mismo nombre, por ejemplo: read(fd, buffer, nbytes);
¿Qué devuelve la función read?
El número de bytes leídos o un valor menor a 0 si ocurrió un error.
¿Dónde se guarda el número de error si falla la llamada read?
En una variable global llamada errno.
¿Qué debe hacer un programa después de una llamada al sistema?
Verificar si ocurrió un error.
¿Dónde se almacenan los parámetros antes de ejecutar la llamada al sistema en x86-64?
En los registros RDI, RSI, RDX, RCX, R8 y R9.
¿Qué sucede si hay más de seis argumentos en una llamada al sistema?
Los argumentos adicionales se almacenan en la pila.
¿Cómo se pasa el parámetro del búfer en la llamada read?
Por referencia, es decir, se pasa la dirección del búfer.
¿Qué hace la biblioteca de procedimientos antes de ejecutar la instrucción de trampa?
Coloca el número de llamada al sistema en un registro, como RAX.
¿Qué instrucción cambia del modo usuario al modo kernel en x86-64?
La instrucción SYSCALL.
¿A qué dirección salta la instrucción de trampa en x86-64?
A una dirección fija dentro del kernel.
¿Qué hace el kernel después de recibir la trampa?
Lee el número de la llamada y salta al manejador correspondiente.
¿Cómo se invoca el manejador de la llamada al sistema?
A través de una tabla de punteros indexada por el número de llamada.
¿Qué ocurre después de ejecutar el manejador del sistema?
El control regresa a la función de biblioteca y luego al programa de usuario.
¿Puede una llamada al sistema bloquear al proceso que la realiza?
Sí, por ejemplo si espera entrada del teclado que aún no ha ocurrido.
¿Qué hace el sistema operativo cuando un proceso se bloquea?
Busca otro proceso para ejecutar mientras espera.
¿Cuántas llamadas POSIX existen aproximadamente?
Aproximadamente 100.
¿Qué categorías de servicios ofrecen las llamadas POSIX?
Creación y terminación de procesos, manejo de archivos y directorios, entrada y salida.
¿El estándar POSIX especifica si una llamada debe ser al sistema o de biblioteca?
No, solo exige que la llamada esté disponible, pero no cómo debe implementarse.
¿Puede una función POSIX no invocar una llamada al sistema?
Sí, si puede ejecutarse en espacio de usuario se prefiere por razones de rendimiento.
¿Puede una misma llamada al sistema servir a múltiples funciones de biblioteca?
Sí, especialmente si las funciones son variaciones menores entre sí.