Detalles del desarrollo del controlador de Linux

  
                  

El primer módulo del kernel (módulo Hello World)

El código es el siguiente: Ver código # include < linux /init.h > # include < linux /module.h > MODULE_LICENSE (" Dual BSD /GPL "); static __init int hello_init (void) {//la función printk se define en el núcleo para el módulo, el núcleo necesita sus propias estadísticas de impresión //porque se ejecuta solo y no hay una función de biblioteca correspondiente. //El módulo puede llamar a printk porque el insmod está cargado, el módulo está vinculado al kernel //el símbolo público del kernel llamable, KERN_ALERT es la prioridad del mensaje printk (KERN_ALERT " HELLO WORLD \\ n "); return 0; Static __exit void hello_exit (void) {printk (KERN_ALERT " GoodBye \\ n ");} module_init (hello_init); module_exit (hello_exit);

Dos funciones están definidas en este módulo, una está cargada en el módulo Las llamadas al núcleo (hello_init) y las otras llamadas (hello_exit) cuando se elimina el módulo del núcleo, en el código anterior, module_init y module_exit son dos definiciones de macro del núcleo que le indican al núcleo dónde comenzar y dónde salir, MODULE_LICENSE La macro se utiliza para declarar que el módulo es compatible con una licencia gratuita, de lo contrario aparecerá una advertencia cuando se cargue el núcleo. Bien, ahora puede probar el programa anterior según corresponda. Debe escribir el Makefile correspondiente antes de probar. La compilación del módulo es diferente de la compilación del programa normal.

Makefile

El código es el siguiente: Ver código #makefile for hello world # KERNELRELEASE es la primera variable definida en el código fuente del núcleo ifneq ($ (KERNELRELEASE),) #determinar si la variable está vacía (no definida durante la primera ejecución) # 未定义Ejecute la instrucción else obj-m: = HelloWorld.o # indica que hay un módulo que se creará desde el archivo de directorio HelloWorld.o. Después de crearlo, asígnele el nombre # HelloWorld.ko #Si hay un módulo llamado module.ko, provienen de dos El archivo de origen, asumiendo que file1.c y file2.c # debe ser tal que obj-m: = module.o # module-objs: = file1.o file2.o else KDIR: = /lib /modules /$ (shell uname - r) /build all: # Cuando el objetivo de make es all, -C $ (KDIR) salta al directorio de origen del kernel y lee Makefile #M = $ (PWD) para regresar al directorio actual para continuar leyendo, ejecute el Makefile actual, Cuando se haya ejecutado de nuevo, se ha definido # $ (KERNELRELEASE), make se leerá antes que else. Haga que los módulos de -C $ (KDIR) M = $ (PWD) estén limpios: rm -rf * .ko * .o * .mod.o * .mod.c * .symvers endif

La explicación correspondiente es la anterior.  Abrir como kernel compilado: debe ser superusuario Introduzca la marca en la ruta actual Compile, ingrese insmd HelloWorld.ko para cargar el kernel, use dmesg

Copyright © Conocimiento de Windows All Rights Reserved