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