Agregar
una Llamada al Sistema al kernel de linux 2.6.25 en un CPU i386 |
Introducción El presente documento explica
cómo agregar una nueva llamada al sistema en el kernel de linux
2.6.25. Una llamada al sistema es utilizada por una aplicación
(programa de usuario) para solicitarle un servicio al sistema operativo.
|
Requerimientos Se recomienda tener la
experiencia de haber compilado el kenel de linux. Por ejemplo, se
podría haber compilado el kernel para soportar
directamente el sistema de archivos ext3.
Por supuesto, es necesario tener las fuentes del kernel de linux. |
Llamadas Sistema Una llamada al sistema es... |
Archivos a modificar/crear Las siguientes rutas deberían ser relativas a:/usr/src/linux 1. /usr/src/linux/arch/i386/kernel/syscall_table.S 2. /usr/src/linux/include/asm-i386/unistd.h 3. /usr/src/linux/include/linux/syscalls.h 4. /usr/src/linux/Makefile Archivos y directorios a crear en el espacio del kernel: 1. /usr/src/linux/llamada 2. /usr/src/linux/llamada/llamada.c 3. /usr/src/linux/llamada/Makefile Archivos en el espacio de usuario: 1. som_millamada.c 2. som_llamada.h - Header file. |
Tabla de
nombres
El archivo arch/i386/kernel/syscall_table.S contiene la tabla de las llamadas al sistema, la cual consiste en la definición de sus nombres. Agregamos el nombre de nuestra llamada precedida por sys_, al final del archivo: .long sys_llamada |
Tabla de definiciones En el archivo include/asm-i386/unistd.h
se hace la realación entre el nombre de la llamada
y su número. Es éste número el que será
pasado al kernel (por medio del registro EAX) cuando una llamada
al sistema sea invocada. Agregamos al final del archivo nuestra llamada
con el número consecutivo.
1. /usr/src/linux/arch/i386/kernel/syscall_table.S |
Declaración de la llamada Ya que desarrollaremos la
llamada al sistema en lenguaje C, se deberá hacer la
declaración de la función en el archivo include/linux/syscalls.h.
El prefijo asmlinkage
es utilizado para rescatar los parámetros de la función
de la pila del kernel.
asmlinkage long sys_llamada(int i); |
Definición de la llamada En la ruta de trabajo (/usr/src/linux)
creamos el directorio
som. El dicho directorio desarrollamos el código de
nuestra llamada en el archivo llamada.c:
#include<linux/linkage.h> asmlinkage
long sys_mycall(int i) return i+10; } |
Compilación de la llamada Será necesario decirle
al compilador las reglas y dependencias para la compilación de
nustro código. Creamos el archivo Makefile
con las siguientes reglas:
#obj-y
:= llamada.o |
Compilación del kernel Para compilar el kernel
|
Prueba en un programa de usuario |