Agregar una Llamada al Sistema al kernel de
linux 2.6.29 en un CPU x86 de 32 bits




Introducción

El  presente documento es una guía simplificada para agregar una llamada al sistema en el kernel de linux versión 2.6.29. Una llamada al sistema es utilizada por una aplicación (programa de usuario) para solicitarle un servicio al sistema operativo.... más información en la clase y notas de curso



Requerimientos

Se recomienda tener experiencia en la compilación del kenel de linux. Por ejemplo, se podría haber compilado el kernel para soportar directamente el sistema de archivos ext3 o ext4.

Por supuesto, es necesario tener las fuentes del kernel de linux.



Archivos a modificar/crear

Las siguientes rutas son relativas a /usr/src/linux. La ruta anterior podría ser un enlace simbólico a la ruta /usr/src/linux-2.6.29


#vim arch/x86/kernel/syscall_table_32.S

#vim arch/x86/include/asm/unistd_32.h

#vim arch/x86/kernel/entry_32.h


#vim arch/x86/include/asm/syscalls.h


Archivos y directorios a crear en el directorio donde se encuentran las fuentes del kernel (/usr/src/linux):

#mkdir som

#vim som/som_llamada.c

#vim som/Makefile


Archivo en el espacio de usuario, para realizar la llamada al sistema:

$vim som_millamada.c
 



Tabla de nombres

El archivo arch/x86/kernel/syscall_table_32.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_sumar  /*llamada al sistema agregada*/



Definición de la llamada

En el archivo arch/x86/include/asm/unistd_32.h se hace la relació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. Por ejemplo, si la última se ve así:

#define __NR_inotify_init1      332

agregamos:

#define __NR_sumar              333

El tamaño de la tabla está definido en el archivo arch/x86/kernel/entry_32.S de la siguiente forma:

#define nr_syscalls ((syscall_table_size)/4)





Definición de la llamada

La definición de la llamada al sistema será desarrollada como una función en lenguaje C, la cual será compilada y enlazada al kernel. Algunas llamadas al sistema descritas en C están definidas en el archivo arch/x86/kernel/sys_i386_32.c. Agregamos el siguiente código como definición de nuestra llamada (27):

asmlinkage int sys_sumar(int a,int b)
{

   return a + b;

}



Compilación de la llamada

Podemos observar en el archivo arch/x86/kernel/Makefile las reglas y dependencias para la compilación de las llamadas al sistema. La regla para la compilación del código en C contenido en el archivo  arch/x86/kernel/sys_i386_32.c, se  lee de la siguiente forma:

obj-$(CONFIG_X86_32) := sys_i386.o i386_ksysms_32.o


Compilación del kernel

Procedemos a compilar el kernel. Y mientras se compila, ya sabes, un cafecito. Por cierto les recomiendo que prueben el café de origen de la Finca de Jocutla.


Prueba en un programa de usuario

Finalmente, lanzamos nuestro nuevo kernel y lo probamos invocando nuestra llamada desde un programa de usuario, som_llamada.c:


#include<linux/unistd.h>
#include<stdio.h>
#include<stdlib.h>

int main()
{

   printf(“1+2 = %d\n”, syscall(333, 1, 2));

   exit(0);

}