Guión de Prácticas de Diseño de Sistemas Operativos
Ejemplo de módulo sencillo (2.4.18) (dirpag.c)
Ejemplo de cómo recuperar y operar con la 'tabla de llamadas al sistema (*sys_call_table[])' desde un módulo, utilizando Linux Kernel 2.6.10 [SCTinModule.c].
La primera práctica (Arranque de Linux y compilación del kernel) de esta asignatura tiene por finalidad que los alumnos se familiaricen con el uso de Linux. Para ello, se presentan las órdenes UNIX que se utilizarán con mayor frecuencia (por ejemplo, ls, cd, rm, mkdir, rmdir, more, cat, etc.); se estudia en detalle las etapas requeridas para el arranque de Linux, prestando especial atención al LILO como bootmanager; se presentan utilidades y herramientas que facilitarán el desarrollo de sucesivas prácticas (gcc como compilador y make como herramienta para la compilación de proyectos); se analiza en detalle los pasos necesarios para la compilación del kernel de Linux así como las herramientas necesarias (xconfig, depend, clean, bzlilo, modules y modules_install), haciendo uso de la utilidad make; para posteriormente rearrancar el sistema con el nuevo kernel; por último, se propone la implementación de ejemplos sencillos que utilizan funciones (mmap y munmap) para la proyección de archivos en memoria (memory-mapped files).
En la segunda práctica (Llamadas al sistema en Linux) se presentan las llamadas al sistema (system calls) de Linux. Para ello, empezamos estudiando lo que son, su función dentro del kernel, cómo añadirlas al kernel y cómo crear una interfaz C de la llamada al sistema, haciendo uso de un ejemplo sencillo pero a la vez muy ilustrativo de una llamada al sistema que muestra el resultado de la multiplicación de dos números (sys_show_mult). Después, se propone la implementación de una llamada al sistema más complicada a nivel del kernel del sistema operativo; ésta consiste en devolver la generación que ocupa un proceso dentro del árbol genealógico de procesos (sys_generacion). Por último, se debe proporcionar una interfaz C, para luego poder utilizarla en un programa ejemplo y comprobar su correcto funcionamiento.
En la tercera práctica (Módulos cargables del kernel) se introduce al alumno en el mundo de los módulos cargables del kernel de Linux (Linux Loadable Kernel Linux, LKM), con el objetivo de conocer la importancia que éstos tienen para añadir funcionalidad al kernel del sistema operativo. Se introduce el objetivo que persigue la implantación de módulos cargables, "tener un kernel extendido/reducido", y la forma (órdenes) de cargarlos (insmod), descargarlos (rmmod) y listarlos (lsmod). Se implementa un módulo sencillo y se describe la forma correcta de su utilización con un ejemplo ilustrativo. Se propone la implementación y prueba de dos módulos cargables en el kernel de Linux denominados acumulador y cliente, realizando cada uno de ellos tareas determinadas para observar ciertas particularidades de las dependencias entre módulos y su interacción. Para terminar, se deberá comprobar el correcto funcionamiento de la práctica a través de un ejemplo.
En esta última práctica (Añadir funcionalidad al kernel de Linux, utilizando módulos cargables) se motiva a los alumnos a que utilicen los módulos cargables del kernel de Linux (LKM), con el objetivo de añadir más funcionalidades al kernel. Se plantea la implementación de módulos cargables que realicen las siguientes funciones: (1) visualización de una imagen del objeto task_union, mostrando tamaños y localización relativa del descriptor de proceso (task_struct) y las zonas de pila (stack) como elementos de dicha unión; (2) visualización del espacio de direcciones virtual de Linux, basado en entradas de directorio de tablas de página (page-directory entries); (3) implementación de un driver de dispositivo modo carácter (3 LEDs de un teclado estándar), y (4) ocultación de archivos en el sistema de archivos EXT2, interceptando llamadas al sistema (la llamada al sistema que se intercepta, para realizar esta parte de la práctica es sys_getdents()).
Bibliografía Teoría/Prácticas.
http://www.mjmwired.net/resources/mjm-fedora-fc6.html#kernelsrc
http://www.howtoforge.com/kernel_compilation_fedora
Understanding Linux Kernel. By Daniel P. Bovet y Marco Cesati (2005).
Linux Kernel Development. Robert Love (2005).
Linux Device Drivers (3rd Edition). Jonathan Corbet, Greg Kroah-Hartman y Alessandro Rubini (2005).
Linux in a Nutshell (5th Edition). Stephen Figgins, Robert Love, Arnold Robbins, Ellen Siever y Aaron Weber (2005).
The Linux Kernel Module Programming Guide. http://www.tldp.org/LDP/lkmpg/2.6/html/index.html
El Maravilloso Mundo de Linux 2.6. Joseph Pranevich. http://www.escomposlinux.org/wwol26/wwol26.html
Navegador del código del kernel de Linux http://lxr.linux.no/source/
Paquete de compatibilidad con gcc-3.2
Portal drivers de 2.4 a 2.6 (módulos): http://lwn.net/Articles/driver-porting/
Descripción a alto nivel de los cambios (se centra en mejoras sin explicarlas): http://www.kniggit.net/wwol26.html
Lista de cambios en la rama de desarrollo 2.5: http://www.kernelnewbies.org/status/latest.html
Algoritmos utilizados en gestión de memoria, scheduler, etc: http://www-128.ibm.com/developerworks/linux/library/l-inside.html
Sincronización y scheduler en Linux: http://www.informit.com/articles/article.asp?p=414983&rl=1