Aprendizaje de controladores de dispositivo Linux (0) -¡Hola, mundo! Módulo

  
 

La primera rutina que encontrará al aprender los controladores de dispositivos Linux:

de > #include < linux /init.h > #include < linux /module.h > MODULE_LICENSE (" Dual BSD /GPL ");

static int hello_init (void) {printk (KERN_ALERT " Hola, Tekkaman Ninja! \\ N "); return 0;}

static void hello_exit ( Void) {printk (KERN_ALERT " ¡Adiós, Tekkaman Ninja! \\ N ¡Love Linux! Love ARM! Love KeKe! De > \\ nde > de >);) p> module_init (hello_init); module_exit (hello_exit); de >

Lo copié en mi directorio de trabajo y escribí un Makefile simple:

de > KERNELDIR = /Home /tekkaman /working /SBC2440 /linux-2.6.22.2 # El directorio actual se pasa a las sub-marcas como argumentoPWD: = $ (shell pwd) INSTALLDIR = /home /tekkaman /working /rootfs /lib /modules

CROSS_COMPILE = /home /tekkaman /working /crosstool-gcc410-k26222 /gcc-4.1.0-glibc-2.3.2 /arm-9tdmi-linux-gnu /bin /arm-9tdmi-linux-gnu-CC = $ (CROSS_COMPILE) gcc

obj-m: = Hello.o

módulos: $ (MAKE) -C $ (KERNELDIR) M = $ (PWD) módulos

modules_install: cp hello.ko $ (INSTALLDIR)

Limpiar: rm -rf * .o * ~ core .depend. *. Cmd * .ko * .mod.c .tmp_versions

.PHONY: modules modules_install cleande >

Para ser honesto, arriba Me refiero al código fuente de Makefile modificado "Controlador de dispositivo Linux (3ra edición)". No sé mucho sobre Makefile, ¡es hora de estudiar y aprender!

Luego están los módulos make, make modules_install.

[root @ Tekkaman-Ninja Helloworld] # make modulesmake -C /home/tekkaman/working/SBC2440/linux-2.6.22.2 M = /home /tekkaman /working /Linuxdriver /Helloworld modulesmake [1]: Ingresando al directorio `/home/tekkaman/working/SBC2440/linux-2.6.22.2'CC [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.oBuilding modules, stage 2.MODPOST 1 modulesCC /home /tkkaman /working /Linuxdriver/Helloworld/hello.mod.oLD [M] /home/tekkaman/working/Linuxdriver/Helloworld/hello.komake[1]: dejando el directorio `/home/tekkaman/working/SBC2440/linux-2.6.22.2 '[ ,null,null,3],Root @ Tekkaman-Ninja Helloworld] # make modules_installcp hello.ko /home /tekkaman /working /rootfs /lib /modules [root @ Tekkaman-Ninja Helloworld] #

Operación en mi placa de desarrollo: [ ,null,null,3],Tekkaman2440 @ SBC2440V4] #cd /lib /modules /

[Tekkaman2440 @ SBC2440V4] #ls

cs89x0.ko hello.ko p80211.ko prism2_usb.ko

[Tekkaman2440 @ SBC2440V4] #insmod hello.ko

¡Hola, Tekkaman Ninja!

[Tekkaman2440 @ SBC2440V4] #lsmod

Tamaño del módulo utilizado por No contaminado

hola 1376 0

[Tekkaman2440 @ SBC2440V4] #rmmod hola

¡Adiós, Tekkaman Ninja!

Love Linux! Love ARM! Love KeKe!

[Tekkaman2440 @ SBC2440V4] #lsmod

Tamaño del módulo utilizado por No contaminado

[Tekkaman2440 @ SBC2440V4 ] #

------------------------------------------ -------------------------------------- Experiencia de aprendizaje: (1) el módulo del controlador se ejecuta en el espacio del kernel El tiempo de ejecución no puede depender de ninguna biblioteca de funciones y conexiones de módulo, por lo que la función llamada al escribir el controlador solo puede ser una función que forma parte del núcleo.
(2) Una diferencia importante entre el módulo del controlador y el programa de aplicación es que la aplicación sale independientemente de la liberación de recursos u otro trabajo de limpieza, pero la función de salida del módulo debe revocar cuidadosamente todo lo que hace la función de inicialización, de lo contrario, antes de que el sistema se reinicie Algo permanecerá en el sistema.
(3) Los distintos modos de trabajo (niveles) del procesador están diseñados para el espacio de usuario y el espacio de kernel del sistema operativo. Solo se utilizan dos niveles en el sistema operativo
de la clase Unix: los niveles más alto y más bajo.
(4) Preste mucha atención al procesamiento simultáneo del controlador.
(5) La función de la API del kernel con doble guión bajo (_ _), generalmente el componente subyacente de la interfaz, debe usarse con precaución.
(6) El código del kernel no puede implementar operaciones de libro de punto flotante.

(7) Análisis de Makefile: de > obj-m: = hello.o representa el módulo que estamos construyendo, se llama hell.ko, make encontrará automáticamente el archivo hell.c en este directorio para compilar . Si de > de > hello.o es generado por otro archivo fuente (como file1.c y de > de > file2.cde > de >), agréguelo a continuación (observe la correspondencia de la fuente roja): de > De > de > de style = " color: rgb (255, 1, 2); " > hellode > de > -objs: = file1.o file2.o ...... de >

de > $ (MAKE) -C $ (KERNELDIR) M = $ (PWD) módulos donde de > de > -C $ (KERNELDIR) especifica la ubicación del código fuente del kernel, que contiene el archivo de archivo de nivel superior del kernel. De > de > M = $ (PWD) de > de > especifica la ubicación del código fuente del módulo de > de > módulos puntos de destino al conjunto de módulos en la variable obj-m.

de > (8) insmod utiliza una tabla de símbolos del kernel común para resolver los símbolos no definidos en el módulo. La tabla de símbolos públicos del kernel contiene todas las entradas globales del kernel (las direcciones de funciones y variables), que son necesarias para implementar controladores modulares.
(9) Linux utiliza la tecnología de apilamiento de módulos, podemos dividir el módulo en múltiples capas y acortar el ciclo de desarrollo simplificando cada capa. Si un módulo necesita pasar símbolos a otros módulos, use la siguiente macro:

de > EXPORT_SYMBOL (nombre); EXPORT_SYMBOL_GPL (nombre); los símbolos de > deben exportarse en la sección de variables globales del archivo de módulo, ya que estos dos Las macros se extenderán a una declaración de una variable especial, que debe ser global.

(10) Todo el código del módulo contiene los siguientes dos archivos de encabezado:

de > #include < linux /init.h > #include < linux /module.h > de >

(11) Todos los códigos de los módulos deben especificar la licencia utilizada:

Copyright © Conocimiento de Windows All Rights Reserved