GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué son las llamadas al sistema Linux y las funciones de biblioteca?

Los programas informáticos se desarrollan para automatizar algunas tareas o resolver algunos problemas. De cualquier manera, un software logra el objetivo con la ayuda de la lógica que escribe el desarrollador de ese software. Cada lógica requiere algunos servicios, como calcular la longitud de una cadena, abrir un archivo, etc. Los servicios estándar son atendidos por algunas funciones o llamadas que se proporcionan solo para este propósito.

Al igual que para calcular la longitud de la cadena, hay existe una función estándar como strlen(), para abrir un archivo, existen funciones como open() y fopen(). Llamamos a estas funciones funciones estándar ya que cualquier aplicación puede usarlas.

Estas funciones estándar se pueden clasificar en dos categorías principales:

  1. Llamadas a funciones de biblioteca.
  2. Llamadas a funciones del sistema.

En este artículo, intentaremos discutir el concepto detrás del sistema y las llamadas de biblioteca en forma de varios puntos y, cuando sea necesario, proporcionaré la diferencia entre los dos.

1. Funciones de biblioteca Vs Llamadas al sistema

Las funciones que forman parte de la biblioteca C estándar se conocen como funciones de biblioteca. Por ejemplo, las funciones estándar de manipulación de cadenas como strcmp(), strlen(), etc. son todas funciones de biblioteca.

Las funciones que cambian el modo de ejecución del programa de modo usuario a modo kernel se conocen como llamadas al sistema. Estas llamadas son necesarias en caso de que el programa requiera algunos servicios del kernel. Por ejemplo, si queremos cambiar la fecha y la hora del sistema o si queremos crear un socket de red, estos servicios solo los puede proporcionar el kernel y, por lo tanto, estos casos requieren llamadas al sistema. Por ejemplo, socket() es una llamada al sistema.

2. ¿Por qué necesitamos llamadas al sistema?

Las llamadas al sistema actúan como punto de entrada al kernel del sistema operativo. Hay ciertas tareas que solo se pueden realizar si un proceso se ejecuta en modo kernel. Ejemplos de estas tareas pueden ser la interacción con el hardware, etc. Por lo tanto, si un proceso quiere realizar este tipo de tarea, entonces deberá ejecutarse en modo kernel, lo que es posible gracias a las llamadas al sistema.

3. Tipos de funciones de biblioteca

Las funciones de biblioteca pueden ser de dos tipos:

  • Funciones que no llaman a ninguna llamada del sistema.
  • Funciones que hacen una llamada al sistema.

Hay funciones de biblioteca que no hacen ninguna llamada al sistema. Por ejemplo, las funciones de manipulación de cadenas como strlen(), etc. entran en esta categoría. Además, hay funciones de biblioteca que además realizan llamadas al sistema, por ejemplo, la función fopen() que es una función de biblioteca estándar pero que internamente usa la llamada al sistema open().

4. Interacción entre componentes

El siguiente diagrama muestra cómo las funciones de la biblioteca, las llamadas al sistema y el código de la aplicación interactúan entre sí.


El diagrama anterior deja en claro que el código de la aplicación puede interactuar con funciones de biblioteca o llamadas al sistema. Además, una función de biblioteca también puede llamar a la función del sistema desde dentro. Pero solo las llamadas al sistema tienen acceso al kernel, que además puede acceder al hardware de la computadora.

5. fopen() frente a abierto()

Algunos de nosotros podemos argumentar que ¿por qué tenemos dos funciones para la misma operación, es decir, abrir un archivo?

Bueno, la respuesta a esto es el hecho de que fopen() es una función de biblioteca que proporciona servicios de E/S en búfer para abrir un archivo, mientras que open() es una llamada al sistema que proporciona servicios de E/S sin búfer. Aunque la función open() también está disponible para que la usen las aplicaciones, la aplicación debe evitar usarla directamente.

En general, si existe una función de biblioteca correspondiente a una llamada al sistema, las aplicaciones deberían usar la función de biblioteca porque:

  • Las funciones de biblioteca son portátiles, lo que significa que una aplicación que utilice funciones de biblioteca estándar se ejecutará en todos los sistemas. Mientras que, por otro lado, es posible que una aplicación que depende de la llamada del sistema correspondiente no se ejecute en todos los sistemas, ya que la interfaz de la llamada del sistema puede variar de un sistema a otro.
  • A veces, la función de biblioteca correspondiente hace que la carga de la llamada al sistema sea menor, lo que genera cambios no frecuentes del modo de usuario al modo kernel. Por ejemplo, si hay una aplicación que lee datos de un archivo con mucha frecuencia, el uso de fread() en lugar de read() proporcionaría E/S en búfer, lo que significa que no todas las llamadas a fread() darían como resultado una llamada al sistema de lectura. (). El fread() puede leer una mayor cantidad de datos (que los requeridos por el usuario) de una sola vez y, por lo tanto, el fread() subsiguiente no requerirá una llamada a la función del sistema read().

6. ¿Es malloc() una llamada al sistema?

Este es uno de los conceptos erróneos muy populares que tiene la gente. Dejemos claro que malloc() no es una llamada al sistema. La llamada de función malloc() es una llamada de función de biblioteca que utiliza además la llamada del sistema brk() o sbrk() para la asignación de memoria.

7. Llamadas al sistema:Cambio de modos de ejecución

Tradicionalmente, se usaba el mecanismo de elevar una interrupción de 'int $0x80' al kernel. Después de atrapar la interrupción, el kernel la procesa y cambia el modo de ejecución de usuario a modo kernel. Actualmente, las instrucciones systenter/sysexit se utilizan para cambiar el modo de ejecución.

8. Algunas otras diferencias

Además de todo lo anterior, aquí hay algunas diferencias más entre un sistema y una llamada de biblioteca:

  • Una función de biblioteca está vinculada al programa del usuario y se ejecuta en el espacio del usuario, mientras que una llamada al sistema no está vinculada a un programa del usuario y se ejecuta en el espacio del kernel.
  • El tiempo de ejecución de una función de biblioteca se cuenta en el tiempo de nivel de usuario, mientras que el tiempo de ejecución de una llamada al sistema se cuenta como parte del tiempo del sistema.
  • Las funciones de biblioteca se pueden depurar fácilmente con un depurador, mientras que las llamadas al sistema no se pueden depurar, ya que las ejecuta el núcleo.

Linux
  1. Comprender las llamadas al sistema en Linux con strace

  2. ¿Qué es un comando Chown en Linux y cómo usarlo?

  3. ¿Cuál es el nivel de ejecución actual del sistema Linux?

  4. ¿Qué son vdso y vsyscall?

  5. ¿Cuál es la diferencia entre las funciones de la familia exec de llamadas al sistema como exec y execve?

Kernel de Linux y sus funciones

Historia de Unix y Linux

¿Qué es el sistema de archivos de Linux? Guía fácil

¿Cuáles son las convenciones de llamada para las llamadas del sistema UNIX y Linux (y funciones de espacio de usuario) en i386 y x86-64?

¿Cuál es la diferencia entre la llamada al sistema y la llamada a la biblioteca?

¿Qué es un contenedor de Linux y un hipervisor de Linux?