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:
Con la ventaja de una fuerte estabilidad, el DVR integrado es cada vez más aceptado por la industria
(1) Comando ifconfig El primer tipo usa el comando ifconfig para configurar la dir
Para garantizar el funcionamiento normal del sistema Linux y resolver con precisión los diversos pro
Descripción general Este artículo describe cómo transferir archivos entre un host Linux y un host
Linux borrar archivos antes de la fecha especificada
Habilidades comunes de Linux: enseñarle la misma tarjeta de red para configurar múltiples IP
Modo de usuario único de Linux Suse para modificar la contraseña de root
Linux pila del subsistema de barrio (tres procesos relacionados)
DirectAdmin habilita HTTP /2 support
Windows en la partición de Linux SWAP formateada mal recuperada
Linux creada en virtud de la transparencia servidor de pasarela proxy squid
Punto de montaje del sistema Linux y relación de partición
La solicitud de dispositivo está ocupada cuando se desmonta bajo Linux
Funciones de TCP y de programación pasos detallados
La implementación del puente de la pila de protocolo de Linux
Cada vez que abres IE 8, hay una solución para la pantalla de bienvenida
¿Cómo quita win7 el cuadro discontinuo del ícono del escritorio?
¿Dónde se ve el número de versión del kernel de Windows?
Lectura directa de archivos de audio y video en el paquete comprimido
La última versión de Win10 9879 se lanzará a "Slow Ring"
Analizar el sistema de grietas anti-activación Win 8 OA3.0
Win10 9926 cómo activar la voz de Microsoft Xiaona este asistente
¿Cómo genera AutoCAD un archivo PDF completo en HD?
Qiao Jie mata el método de ingreso de muerte suave /no se puede apagar el error