Diseño e implementación de controlador de dispositivo para sistema operativo Linux integrado
Liu Tao Qu Xiaoping
(Escuela de Ciencia y Tecnología de la Información, Universidad de Jiujiang, Jiujiang, Jiangxi 332005)
Explica principalmente el concepto de controlador de dispositivo Linux integrado, resume las características del controlador de dispositivo Linux integrado y analiza el controlador de dispositivo Linux integrado.
Presenta el proceso de desarrollo específico y los códigos clave del controlador, y resume las ideas principales en el desarrollo de controladores de dispositivos Linux integrados.
Palabras clave: sistema integrado; controlador de dispositivo Linux; núcleo
Tecnología informática y automatización
Diseño e implementación de controlador de dispositivo Linux integrado
p>Xiao Quping, Liu Tao
(Escuela de Tecnología de la Información, Universidad de Jiujiang, Jiujiang, Jiangxi 332005)
Palabras clave: sistema integrado; núcleo del dispositivo Linux
< Los sistemas integrados se utilizan ampliamente en electrónica de consumo, automóviles, electrónica, microcontrol y comunicaciones inalámbricas y otros campos.Información, productos digitales, equipos de redes, sistemas de seguridad y otros campos. Cada vez más empresas, instituciones de investigación
Instituciones de investigación, universidades e individuos están comenzando a estudiar e integrar sistemas integrados.
El diseño de sistemas será un foco de investigación durante mucho tiempo.
1 Descripción general de los controladores de dispositivos Linux
Linux integrado se puede aplicar a una variedad de plataformas de hardware, con un kernel eficiente y estable,
código fuente abierto, y software rico, mecanismos completos de comunicación de red y gestión de archivos, etc.
El sexo se ha convertido en un foco de investigación en el campo de los sistemas integrados. Sistemas Linux integrados
El kernel proporciona un mecanismo de protección y los procesos en el espacio del usuario generalmente no pueden acceder directamente al hardware.
Piezas. Al desarrollar sistemas integrados, se trabaja mucho en escribir controladores para varios dispositivos.
Programas, salvo que el sistema no utilice un sistema operativo. Controladores de dispositivos Linux
El código fuente del kernel representa una gran proporción. Desde las versiones 2.0, 2.2 a 2.4 del kernel, la longitud del código de generación del código fuente aumenta día a día. La razón principal es que el controlador del dispositivo aumenta.
El controlador de dispositivo ocupa una posición extremadamente importante en el kernel de Linux. Es el núcleo interno
utilizado para completar las operaciones de control de los dispositivos físicos. Además de la CPU, la memoria
y varias otras partes, todas las operaciones de control del dispositivo deben realizarse mediante código relacionado con el dispositivo controlado (es decir, el controlador). El kernel debe incluir
controladores para cada dispositivo externo del sistema. De lo contrario, el dispositivo no
funcionará correctamente en Linux. Así es como se desarrollan los controladores en el kernel de Linux.
Principales motivos laborales. Como se puede ver en la distribución del código del código fuente del kernel, el código fuente del controlador del dispositivo.
El código representa al menos la mitad del código fuente del kernel y puede explicar mejor el funcionamiento del controlador del dispositivo.
La importancia y valor del sistema.
2 Desarrollo del controlador de dispositivo Linux integrado
2.1 Principio de funcionamiento del controlador de dispositivo
Hay tres tipos principales de archivos de dispositivo en el sistema operativo Linux: dispositivos de bloque,
p>
Dispositivos de carácter y dispositivos de red. Este método de clasificación puede controlar diferentes entradas/salidas.
Los controladores de dispositivo son independientes del software de otro sistema operativo. La principal diferencia entre los dispositivos de caracteres y los dispositivos de bloque es que cuando se envía una solicitud de lectura/escritura a un dispositivo de caracteres, generalmente sigue la E/S del hardware real. Los dispositivos de bloque, por otro lado, utilizan un bloque de memoria del sistema como búfer.
Si la solicitud del proceso del usuario para el dispositivo cumple con los requisitos del usuario, devolverá la solicitud.
Datos; de lo contrario, se llamará a la función de solicitud para realizar la operación de E/S real. Dispositivos de red
Puede acceder a los datos a través de sockets BSD de Windows. Todos los controladores de dispositivos Linux integrados
Sequence tiene algunas características que son comunes a todos los tipos de controladores. Sistema operativo
El soporte proporcionado por el sistema al conductor es más o menos el mismo. Estas funciones incluyen: (1) Lectura/escritura.
Casi todos los dispositivos tienen entradas y salidas. Cada conductor es responsable de este dispositivo.
Otras partes del sistema operativo no necesitan conocer las operaciones específicas de lectura/escritura del dispositivo.
El controlador bloquea la forma en que se completa la operación de escritura. Configuración del sistema operativo
Las interfaces de lectura y escritura están bien definidas y el controlador completa las funciones específicas. Al iniciar el controlador
En el momento de la inicialización, es necesario registrar las capacidades de lectura/escritura con el sistema operativo. (2)
Las interrupciones desempeñan un papel importante en la arquitectura informática moderna y el sistema operativo debe
proporcionar a los controladores la capacidad de responder a las interrupciones. En general, preste atención a los manejadores de interrupciones.
Vuelve el volumen al sistema y el sistema operativo llama al controlador para procesarlo después de la interrupción del hardware.
Programa. Linux admite el uso compartido de interrupciones, es decir, varios dispositivos comparten una interrupción. (3) Reloj
Al implementar un controlador, los relojes se utilizan en muchos lugares, como en algunos protocolos.
Procesamiento de tiempo de espera, sondeo de hardware sin mecanismo de interrupción, etc. El sistema operativo debe ser el controlador.
La secuencia proporciona un mecanismo de sincronización, que generalmente se usa cuando se vuelve a llamar el registro después de un tiempo predeterminado.
Función de reloj.
El desarrollo de controladores de sistemas Linux integrados no es muy diferente del de Linux normal.
No. Debido a la diversidad de hardware, los dispositivos integrados son la versión predeterminada del kernel.
No es posible incluir todos los controladores. Esto se puede hacer con el fabricante del hardware o en Internet.
Ve a buscar al conductor. Si no puede encontrarlo, puede seguir un controlador de hardware similar.
Reescribir. El proceso general de implementación de un controlador de dispositivo Linux integrado es el siguiente: (1) Reparación.
El número de dispositivo mayor y el número de dispositivo menor también se pueden obtener dinámicamente; (2) Implementar funciones de inicialización y borrado del controlador.
Si el controlador adopta el modo de módulo, es necesario inicializar y borrar el módulo. Funcionalidad cero.
Número; (3) Diseñar la operación de archivo que se implementará y definir la estructura de la operación de archivo; (4) Realizar
las llamadas a operaciones de archivo requeridas ahora, como lectura, escritura, etcétera. (5) Implemente la función de servicio de interrupción y regístrese en el kernel mediante la solicitud irq (6) Compile el controlador en un kernel o módulo.
Bloquear, cargar usando el comando insmod; (7) Generar archivo de nodo de dispositivo.
En comparación con los archivos normales, el funcionamiento de los archivos del dispositivo es mucho más complicado y no puede ser sencillo.
Se implementa a través de la lectura, la escritura y la búsqueda. Todos los demás tipos de operaciones se pueden realizar llamando a ioctl a través de VFS, por lo tanto, solo es necesario implementarlo en el controlador.
Ahora funciona ioctl y agrégale el caso correspondiente. Distinga las operaciones
por cmd y pase parámetros y resultados a través de arg.
2.2 Proceso de desarrollo del controlador de dispositivo
2.2.1 Interfaz del controlador de dispositivo
Estructura file_operación IOdriver_fops=
{leer: 1Odriver_read, p>
Escribir: IOdriver_write,
};
Estructura de operación de archivos clave en la interfaz del controlador del dispositivo de caracteres:
ltLinux/fs h gt; se define de la siguiente manera:
struct file_operation {
struct module*owner;
loft_t(*llseek)(struct file*, loff_t, int);
45
ssize_t(*read)(archivo de estructura*, char*, size_t, loft_t);
ssize_t(* write)(archivo de estructura*, const char*, size_t, 1 off _ t *);
int(readdir struct inode*, struct file*, void*, fill dir _ t); )(struct inode*, struct file*, int, select table *);
int(*ioct1)(struct inode*, struct file*, unsigned int, unsigned int);
int(*mmap)(struct inode*, struct file*, struct VM _ area _ struct *
int( *open)(struct inode*, struct file *);
void(*release)(inodo de estructura*, archivo de estructura*);
int(*fsync)(inodo de estructura*, archivo de estructura*);
};
2.2.2 Módulo de alta y baja
2.2.2.1 Módulo de registro de dispositivo
Static int_nit IOdriver_init(void)
p>{ int ret=0:
ret=register_chrdv(MAJOR_NUM, "IOdriver", & iodriver
if (return)
{ printk(KERN_ALERT"Error en el registro de IOdriver ! ") }
Otros
{ printk(KERN_AL ERT "¡Registro de IOdriver exitoso!") }
Devolver ret
} p>
2.2.2.2 Módulo de baja del dispositivo
Estático int_exit IOdriver_exit(void)
{ int ret = 0
ret=unregister_chrdv(MAJOR_NUM, " io driver ");
If (return)
{ printk(KERN_AL ERT "¡Error al cerrar sesión en IOdriver!");}
Otros
{ printk(KERN_AL ERT "IOdriver cierre de sesión exitoso!");}
Volver ret
}
2.2.3 Funciones básicas del dispositivo de punto de entrada Implementación específica
2.2.3.1 Lectura del dispositivo
Obtener módulo
static ssize_t io driver_read(struct file * file, char*buf, size_t len,
loft_t*off)
{ if (_ _copy_to_user( bur, ampIOdriver_var, sizeof(int)))
{ retum _ EFAULT}
retum sizeof(int);
}
2.2.3.2 Módulo de escritura del dispositivo
Estático ssize_t io driver_write(struct file * file, const char*buf, size_t
len, loff_t*off )
{ if(_ _ copiar _ de _ usuario( amp; IOdriver_var, buf, sizeof(int)))
{ retum _ _ EFAULT}
retum sizeof(int); p>
}
2.2.4 Macro de inicialización y salida del módulo
módulo _ init (controlador io _ init
p>Module_exit (); io driver_exit);
3 El proceso de compilar el controlador del dispositivo en el kernel
Los pasos para compilar el controlador en el kernel son los siguientes:
( 1) Copie IOdriver.c a Linux-2.4.20-8/drivers/char y repárelo.
Cambie el archivo config.in en este directorio, que es el script de configuración para cada módulo.
Defina los módulos a configurar y cómo configurarlos en este archivo, de modo que cuando se agregue la configuración IO
Una vez completada la configuración IO, las opciones de configuración del módulo Aparecerá durante la configuración del kernel.
(2) Modifique el Makefile en el directorio actual y colóquelo en el Makefile de cada módulo.
Incluye submódulos contenidos en este módulo, incluyendo IO en dispositivos char.
El dispositivo debe indicarle al Makefile que compile iDriver. Y contiene el iDriver compilado.
c, para que el kernel se vincule a este módulo al vincular.
(3) Reconfigure el kernel, seleccione el módulo IO y ejecute el comando make menuconfig,
Ingrese al menú de configuración del kernel.
(4) Vuelva a compilar el kernel y actualice el kernel del sistema de destino integrado.
(5) Cree un archivo de dispositivo, reinicie Linux del sistema de destino integrado, ingrese al directorio
/proc y verifique la lista de archivos de dispositivo del sistema actual.
Algunos dispositivos de caracteres y dispositivos de bloque, incluidos los números y nombres de dispositivos, se enumeran en caracteres.
El último dispositivo migrado entre los dispositivos es: 254 IOdriver, que es el dispositivo controlador de identificación.
Se ha cargado correctamente en el kernel.
(6) Para agregar un nodo de archivo de dispositivo, ejecute el siguiente comando para agregar un nodo de archivo de dispositivo.
El nombre del dispositivo creado aquí se utiliza para acceder al dispositivo correspondiente en la aplicación. Si
Para dispositivos de caracteres, el tipo de número de dispositivo está representado por C y los dispositivos de bloque están representados por B, el número de dispositivo principal
es el número de dispositivo del IOdriver en /proc; /devices, porque este dispositivo solo hay uno, por lo que el número de dispositivo auxiliar es 0, y si hay otros dispositivos de este tipo, es uno.
1, 2, 3 y así sucesivamente.
5 Conclusión
El controlador de dispositivo es la interfaz entre el núcleo del sistema operativo y el hardware de la máquina. Dentro
el kernel utiliza la interfaz del controlador para inicializar y liberar el dispositivo. En este sistema, los datos se transfieren entre el kernel y el hardware, y los errores en el dispositivo siempre se detectan y manejan. Es la parte más básica del sistema operativo, por lo que es muy importante estar familiarizado con la escritura de controladores.
Sí.