System calls: ¿qué son y para qué se emplean?

En el mundo actual, los sistemas operativos deben ofrecer a los usuarios no solo el mayor confort posible, sino también la máxima estabilidad y seguridad. Para esto, los desarrolladores de sistemas como Linux o Windows se ocupan, entre otras cosas, de minimizar el riesgo de posibles complicaciones en el sistema causados por una negligencia personal involuntaria o por ataques dirigidos desde el exterior. Una de las medidas más importantes tomadas para este propósito es la separación estricta del núcleo del sistema operativo y los programas de aplicación o procesos de usuario. Esto quiere decir que los programas y procesos que no pertenecen al sistema no tienen acceso directo a la CPU y a la memoria, sino que dependen de las llamadas al sistema.

¿Qué hay exactamente detrás de las llamadas al sistema, y qué tipos hay?

¿Qué es una llamada al sistema (syscall)?

Una llamada al sistema o system call es un método utilizado por los programas de aplicación para comunicarse con el núcleo del sistema. En los sistemas operativos modernos, esto es necesario cuando una aplicación o proceso de usuario necesita transmitir a o leer información del hardware, de otros procesos o del propio núcleo. De este modo, la llamada es el punto de enlace entre el modo de usuario y el modo de núcleo, los dos modos cruciales de privilegio y seguridad para el procesamiento de las instrucciones de la CPU en los sistemas informáticos.

Antes de que la llamada al sistema termine de procesarse y se transmitan o reciban los datos correspondientes, el núcleo del sistema toma el control del programa o proceso. La ejecución se interrumpe durante este período. Una vez realizada la acción solicitada por una llamada al sistema, el núcleo renuncia al control y el código continúa desde el punto en el que se inició previamente la llamada al sistema.

Nota

La mayoría de los sistemas operativos modernos proveen ciertas llamadas al sistema en forma de funciones de biblioteca que se pueden realizar a través de una interfaz de programación, que también está incluida. Gracias a ello, la tarea de los desarrolladores de software se facilita enormemente, ya que no se requiere un conocimiento más preciso del funcionamiento interno del respectivo software de sistema.

¿Para qué se necesitan las system calls?

Las system calls están estrechamente ligadas al modelo moderno de sistema operativo con modo usuario y modo núcleo, que se introdujo en respuesta al creciente número de procesos que se ejecutan simultáneamente en la memoria principal (RAM) de los ordenadores. De este modo, cada proceso individual tiene sus propios datos con derechos de acceso especiales y, solo si se distribuyen los recursos correctamente, el sistema y los programas pueden ejecutarse según lo esperado.

El modo núcleo de mayor privilegio es aquí la instancia de control decisiva, porque, como mencionamos, en este no solo se ejecutan todos los servicios y procesos del sistema en sí, sino también las acciones críticas del sistema de los programas de aplicación que en el modo usuario están bloqueadas. Para esto, es necesario que el programa realice una llamada al sistema, que en la mayoría de los casos es simplemente una cuestión de acceso a la potencia de cálculo (CPU) o a las estructuras de memoria (memoria de trabajo y espacio de disco duro). Por ejemplo, si una aplicación requiere más potencia de cálculo o espacio de almacenamiento, o si se solicita un archivo no específico de la aplicación (abrir, leer, editar, etc.), es necesario realizar una system call.

En resumen

Se puede decir que una llamada al sistema es necesaria siempre que un proceso que se ejecuta en modo usuario intente ejecutar una función que solo sea ejecutable en modo núcleo.

¿Qué tipos de llamadas al sistema hay?

En principio, como se dijo arriba, todas las llamadas al sistema se pueden utilizar como unidades de control para la comunicación entre los procesos de aplicación y el sistema operativo o el hardware. Además, las llamadas al sistema establecidas también se pueden clasificar en diferentes categorías, por lo que se han establecido en particular estos cinco tipos:

  • Control de procesos: todos los procesos de un sistema informático deben controlarse para que en cualquier momento se puedan detener u otros procesos los puedan dirigir. Para esto, las llamadas al sistema de esta categoría supervisan, por ejemplo, el inicio o la ejecución o la detención/terminación de procesos.
  • Gestión de archivos: los programas de aplicación requieren este tipo de llamadas al sistema para acceder a las operaciones típicas con archivos. Estos métodos de manipulación de archivos incluyen la creación, eliminación, apertura, cierre, escritura y lectura (create, delete, open, close, write y read).
  • Gestión de dispositivos: la categoría “Gestión de dispositivos” incluye todas las llamadas al sistema que sirven para solicitar o administrar los recursos de hardware necesarios, como la potencia de computación o el espacio de almacenamiento.
  • Gestión de la información: los procesos tienen mucha información asociada, y la puntualidad y la integridad son muy importantes. Para intercambiar o solicitar información, los programas de aplicación utilizan llamadas al sistema para la gestión o el mantenimiento de la información.
  • Comunicación entre procesos: solo se puede garantizar una interacción fluida entre el sistema operativo y los distintos programas de aplicación si los procesos individuales están coordinados. Con este fin, es indispensable la comunicación a través de las correspondientes llamadas al sistema.

Windows y Linux: visión general de las llamadas al sistema

La medida en que los tipos de llamadas al sistema enumerados se pueden implementar o realizar depende principalmente del hardware y de la arquitectura del sistema utilizados, pero también del sistema operativo. En Linux, por ejemplo, las llamadas al sistema se almacenan directamente en el núcleo de Linux en la “Tabla de llamadas al sistema”. Cada entrada de esta tabla tiene asignados un número único y una función específica que se ejecutará en el modo núcleo. Para ejecutar cualquier llamada al sistema Linux, se carga el número en la memoria de la CPU y después se carga mediante una interrupción de software 128 (llamada a una subfunción del sistema operativo que interrumpe la ejecución del programa en el modo de usuario).

Para mostrar este video, se requieren cookies de terceros. Puede acceder y cambiar sus ajustes de cookies aquí.

La funcionalidad es similar en los sistemas operativos Windows, pero aquí una llamada al sistema siempre se convierte primero internamente: una función de biblioteca de la API de Windows (abreviatura WinAPI) se convierte automáticamente en una llamada al sistema que el sistema operativo puede leer, incluyendo un número único que hace referencia a la función deseada en el modo núcleo.

En la siguiente tabla se enumeran algunos ejemplos concretos de llamadas al sistema de Windows y Linux:

Tipo de system call Función Linux Windows
Control del proceso Crear proceso fork() CreateProcess()
Control del proceso Terminar proceso exit() ExitProcess()
Gestión de archivos Crear/abrir archivo open() CreateFile()
Gestión de archivos Leer archivo read() ReadFile()
Gestión de archivos Editar archivo write() WriteFile()
Gestión de archivos Cerrar archivo close() CloseHandle()
Gestión de dispositivos Abrir dispositivo read() ReadConsole()
Gestión de dispositivos Cerrar dispositivo close() CloseConsole()
Gestión de la información Definición de un intervalo de tiempo específico alarm() SetTimer()
Gestión de la información Pausa (por ejemplo, de un proceso) sleep() Sleep()
Comunicación Crear Pipe (memoria intermedia para el flujo de datos entre dos procesos) pipe() CreatePipe()
Comunicación Creación de una memoria compartida (Shared memory) shmget() CreateFileMapping()
Consejo

¿Buscas un hardware potente para manejar los procesos de tu aplicación? Las https://www.ionos.es/servidores/vps "Servidores virtuales VPS">soluciones VPS de IONOS te ofrecen el mejor servidor en la nube a un precio excepcional, con Windows o Linux como sistema operativo.