Red de conocimiento informático - Material del sitio web - Cómo implementar nuevas llamadas al sistema Linux

Cómo implementar nuevas llamadas al sistema Linux

.Tres métodos para implementar llamadas al sistema Linux

Colaborador: lijiao Fuente:: [Aumentar y reducir] Tipo: Tiempo de reimpresión: 2016-01-03 Quiero comentar

Este artículo Introduce principalmente tres métodos para implementar llamadas al sistema Linux. Los amigos interesados ​​pueden consultarlos

. System Call es un conjunto de interfaces proporcionadas por el sistema operativo para que los procesos que se ejecutan en modo de usuario interactúen con dispositivos de hardware (como CPU, disco, impresora, etc.). Cuando ocurre una llamada al sistema en un proceso de usuario, la CPU cambia al estado del kernel mediante una interrupción suave y comienza a ejecutar la función de llamada al sistema del kernel. Las siguientes son tres formas de realizar llamadas al sistema en Linux:

Primero, a través de las funciones de biblioteca proporcionadas por glibc

glibc es una biblioteca C estándar de código abierto utilizada en Linux, que está desarrollada por la biblioteca libc distribuida por GNU o la biblioteca de tiempo de ejecución. Glibc proporciona a los programadores una rica API (Interfaz de programación de aplicaciones). Además de los servicios de usuario más importantes, como el procesamiento de cadenas y las operaciones matemáticas, también encapsula los servicios del sistema proporcionados por el sistema operativo, es decir, la encapsulación de llamadas al sistema. Entonces, ¿cuál es la relación entre la API de llamadas al sistema proporcionada por glibc y las llamadas al sistema específicas del kernel?

1. Normalmente, cada llamada al sistema específica corresponde al menos a una función de biblioteca encapsulada por glibc, como la llamada sys_open proporcionada por el sistema para abrir el sistema de archivos, que corresponde a la función de apertura en glibc;

2. En segundo lugar, una única API de glibc puede llamar a múltiples llamadas al sistema, como la función printf proporcionada por glibc. En segundo lugar, una única API de glibc puede llamar a múltiples llamadas al sistema. proporcionado por glibc llamará a sys_open, sys_mmap, sys_write, sys_close, etc.

3. Además, varias API pueden corresponder a la misma llamada al sistema, como malloc, calloc, free, etc. Estas funciones utilizan las funciones sys_open, sys_mmap, sys_write y sys_close del kernel. También se explota la llamada al sistema sys_brk del kernel.

En segundo lugar, utilice syscall para llamar directamente

Hay muchas ventajas al utilizar el método anterior. Primero, no necesita conocer más detalles, como el número de llamada del sistema chmod, sino solo el prototipo de la API proporcionado por glibc; segundo, este método tiene mejor portabilidad, por lo que puede portar fácilmente el programa a otras plataformas. O use otras bibliotecas para reemplazar la biblioteca glibc, y el programa solo necesita ser portado a otras plataformas. Puede portar fácilmente su programa a otras plataformas o reemplazar la biblioteca glibc con otras bibliotecas realizando sólo modificaciones menores a su programa.

Pero la desventaja es que si glibc no encapsula la llamada al sistema proporcionada por el kernel, no puedo llamar a la llamada al sistema mediante el método anterior. Si agrego la llamada al sistema compilando el kernel yo mismo, no es posible que glibc proporcione una API contenedora para la nueva llamada al sistema que agrega, por lo que podemos usar la función syscall proporcionada por glibc para llamarla directamente. Esta función está definida en el archivo de encabezado unistd.h.

3. Ingresar mediante la instrucción int

Si comprendemos todo el proceso de las llamadas al sistema, deberíamos poder saber que el programa de usuario cae en el estado del núcleo mediante la instrucción de interrupción suave int 0x80 (la instrucción sysenter se introdujo en Intel Pentium II), los parámetros se pasan a través de registros, eax se pasa al número de llamada del sistema, ebx, ebx, ecx, edx, esi y edi pasan hasta cinco parámetros por turno. El valor se almacena en eax.