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> int
main() printf(“1+2 = %d\n”, syscall(333, 1, 2)); exit(0); } |