Task 01
Enlaces a la documentación del kernel:
Documentación general para desarrollo: https://www.kernel.org/doc/html/latest/process/index.html
Descripción de como funciona la comunidad de desarrollo del kernel: https://www.kernel.org/doc/html/latest/process/howto.html
- El kernel usa ISO C89 con extensiones no estandar
- No se utiliza la standard C library
- Requerimientos para compilar y ejecutar el kernel: https://www.kernel.org/doc/html/latest/process/changes.html
- Estilo de código: https://www.kernel.org/doc/html/latest/process/coding-style.html
- Información de como generar parches y que estilo debe utilizarse: https://www.kernel.org/doc/html/latest/process/submitting-patches.html
- Documentación para entender el kernel: https://www.kernel.org/doc/html/latest/process/kernel-docs.html
- Página con documentación para programar (no parece muy completa):
https://kernelnewbies.org/
- Creación de parches: https://kernelnewbies.org/FirstKernelPatch
- The perfect patch
“Think of a teacher grading homework from a math student. The teacher does
not want to see the student’s trials and errors before they came up with the
solution. They want to see the cleanest, most elegant answer. A good student
knows this, and would never submit her intermediate work before the final
solution.
The same is true of kernel development. The maintainers and reviewers do
not want to see the thought process behind the solution to the problem
one is solving. They want to see a simple and elegant solution.”
De: https://www.kernel.org/doc/html/latest/process/submitting-patches.html
-
Obtener el current source tree del kernel:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
Style-check your changes:
Check your patches with the patch style checker prior to submission (scripts/checkpatch.pl)
De: https://www.kernel.org/doc/html/latest/process/coding-style.html
-
La indentación son 8 espacios. NOTA: NO ESTÁ ACLARADO, PERO LA INDENTACIÓN ES CON UN TABULADOR.
-
El limite de linea son 80 caracteres.
-
No más de 3 niveles de indentación.
-
La apertura de una función se realiza en la linea siguiente a su definición:
int function(int x) { body of function }
-
No usar
braces
en if’s de una sola linea:if (condition) action();
-
NEVER try to explain HOW your code works in a comment: it’s much better to write the code so that the working is obvious, and it’s a waste of time to explain badly written code.
Se puede utilizar el script scripts/checkpatch.pl
para verificar la
sintaxis de un archivo (esto no está documentado en el enlace anterior):
$ /path/to/checkpatch.pl -f file
La lista de los requerimientos minimos para compilar y ejecutar el kernel se encuentran en: https://www.kernel.org/doc/html/latest/process/changes.html
Los paquetes en debian
que se corresponden son los siguientes:
- build-essential: Instala gcc, make, binutils, patch, etc.
- linux-headers-amd64: Include files necesarios para compilar el módulo del kernel
FIXME: COMPLETAR LA LISTA Y EL COMANDO
Estos se instalan utilizando la siguiente linea:
$ sudo apt-get update
$ sudo apt-get install -qVy build-essential linux-headers-amd64
Para crear un módulo del kernel fuera del arbol se necesita:
-
Un archivo Kbuild Makefile
Este archivo indica los fuentes del módulo a compilar utilizando la variable obj-m. Ver el apartado 3.1 Goal definitions en la documentación del kernel sobre Kbuild.
-
Un archivo stand-alone Makefile
Para este caso que el módulo es sencillo se utiliza el makefile propuesto en la documentación sobre construcción de módulos, en el apartado 3.2 Separate Kbuild file and Makefile.
En este archivo se indica utilizando la variable KDIR cual es la ruta a los headers del kernel.
-
Los archivos fuente del módulo.
En nuestro caso es el archivo hello.c.
Por más información leer los enlaces previos.
En el libro Linux Kernel Development
en el capítulo 17 - Devices and
Modules se explica como crear un módulo Hello World!.
Para compilar el módulo y probar que este es correctamente instalado y desinstalado:
$ make clean \
&& make \
&& sudo -s -- sh -c "dmesg --clear \
&& insmod hello.ko \
&& echo \"==== After insmod\" \
&& dmesg \
&& echo \"==== After rmmod\" \
&& rmmod hello \
&& dmesg"
La salida de este comando es la prueba al problema.