¿Qué es una llamada del sistema Linux??

¿Qué es una llamada del sistema Linux??

Lo primero es lo primero

Antes de profundizar en la definición de una llamada del sistema Linux y examinar los detalles de su ejecución, es mejor comenzar definiendo las diversas capas de software de un sistema Linux típico.

El kernel de Linux es un programa especializado que bota y se ejecuta en el nivel más bajo disponible en su hardware. Tiene la tarea de orquestar todo lo que se ejecuta en la computadora, incluido el manejo del teclado, el disco y los eventos de red para proporcionar cortes de tiempo para ejecutar múltiples programas en paralelo.

Cuando el kernel ejecuta un programa a nivel de usuario, virtualiza el espacio de memoria para que los programas crean que son el único proceso que se ejecuta en la memoria. Esta burbuja protectora de aislamiento de hardware y software aumenta la seguridad y la confiabilidad. Una aplicación no invitada no puede acceder a la memoria que pertenece a otros programas, y si ese programa se bloquea, el núcleo termina para que no pueda dañar el resto del sistema.

Excelente la barrera con llamadas al sistema Linux

Esta capa de aislamiento entre aplicaciones no privilegiadas proporciona un excelente límite para proteger otras aplicaciones y usuarios en el sistema. Sin embargo, sin alguna forma de interactuar con los otros elementos en la computadora y el mundo exterior, los programas no podrían lograr nada de.

Para facilitar la interacción, el kernel designa una puerta de software que permite que el programa de ejecución solicite que el núcleo actúe en su nombre. Esta interfaz se conoce como una llamada al sistema.

Dado que Linux sigue la filosofía Unix de "Todo es un archivo", se pueden realizar muchas funciones abriendo y leyendo o escribiendo en un archivo, que podría ser un dispositivo. En Windows, por ejemplo, puede usar una función llamada CryptGenRandom para acceder a bytes aleatorios. Pero en Linux, esto se puede hacer simplemente abriendo el "archivo"/dev/urandom y leyendo bytes utilizando llamadas estándar al sistema de entrada/salida de archivo. Esta diferencia crucial permite una interfaz de llamadas de sistema más simple.

Envoltura delgada

En la mayoría de las aplicaciones, las llamadas del sistema no se realizan directamente al núcleo. Prácticamente todos los programas enlazan en la biblioteca C Standard C, que proporciona un envoltorio delgado pero importante en torno a las llamadas del sistema Linux. La biblioteca se asegura de que los argumentos de la función se copian en los registros correctos del procesador y luego emita la llamada del sistema Linux correspondiente. Cuando los datos se reciben de la llamada, el envoltorio interpreta los resultados y los devuelve al programa de manera consistente.

Entre bastidores

Cada función en un programa que interactúa con el sistema finalmente se traduce en una llamada del sistema. Para ver esto en acción, comencemos con un ejemplo básico.

vacío principal()

Este es probablemente el programa C más trivial que jamás verá. Simplemente gana control a través del punto de entrada principal y luego sale. Ni siquiera devuelve un valor ya que Main se define como vacío. Guarde el archivo como CTEST.c y compilemos:

CTEST GCC.C -O CTEST

Una vez que se compila, podemos ver el tamaño del archivo como 8664 bytes. Puede variar ligeramente en su sistema, pero debe ser alrededor de 8k. Eso es mucho código solo para ingresar y salir! La razón por la que es 8k es que se incluye el tiempo de ejecución de libc. Incluso si desnudamos los símbolos, sigue siendo un poco más de 6k.

En un ejemplo aún más simple, podemos hacer que la llamada del sistema Linux salga en lugar de depender del tiempo de ejecución C para hacerlo por nosotros.

void _start ()
ASM ("MOVL $ 1,%EAX";
"Xorl %EBX, %EBX";
"int $ 0x80");

Aquí nos movemos 1 al registro EAX, borre el registro EBX (que de otro modo contendría el valor de retorno) y luego llame a la interrupción del sistema Linux 0x80 (o 128 en decimal). Esta interrupción desencadena el núcleo para procesar nuestra llamada.

Si compilamos nuestro nuevo ejemplo, llamado asmtest.C, y elimine los símbolos y excluya la biblioteca estándar:

gcc -s -nostdlib asmtest.c -o asmtest

Produciremos un binario menos de 1K (en mi sistema, produce 984 bytes). La mayor parte de este código son encabezados ejecutables. Ahora estamos llamando a la llamada del sistema Direct Linux.

Para todos los propósitos prácticos

En casi todos los casos, nunca tendrá que hacer llamadas directas al sistema en sus programas C. Sin embargo, si usa el lenguaje de ensamblaje, puede surgir la necesidad. Sin embargo, en la optimización, sería mejor dejar que las funciones de la biblioteca C hagan llamadas al sistema y solo tenga su código crítico de rendimiento integrado en las directivas de ensamblaje.

Cómo programar Tutoriales de llamadas al sistema

  • Llamada del sistema EXEC
  • Llamada del sistema de horquilla
  • Llamada del sistema de estadísticas

Lista de todas las llamadas del sistema

Si desea ver una lista de todas las llamadas del sistema disponibles para Linux, puede verificar estas páginas de referencia: Lista completa de llamadas al sistema en Linuxhint.com, filippo.IO/ Linux-Syscall-Table/ o Syscalls.núcleo.comunicarse