Descripción
Comencemos la discusión con el controlador de personajes en Linux. Kernel clasifica a los controladores en tres categorías:
Conductores de personajes - Estos son los controladores que no tienen demasiado datos para tratar. Pocos ejemplos de controladores de personajes son el controlador de pantalla táctil, el controlador UART, etc. Todos estos son los controladores de caracteres, ya que la transferencia de datos se realiza a través del carácter.
Bloquear a los conductores - Estos son los impulsores que tratan con demasiados datos. La transferencia de datos se realiza BLOCK por bloque ya que se deben transferir demasiados datos. El ejemplo de los controladores de bloques son SATA, NVME, etc.
Conductores de red - Estos son los controladores que funcionan en el grupo de redes de redes de redes. Aquí, la transferencia de datos se realiza en forma de paquetes de datos. Los conductores inalámbricos como Atheros se encuentran en esta categoría.
En esta discusión, nos centraremos solo en el controlador de personajes.
Como ejemplo, tomaremos las simples operaciones de lectura/escritura para comprender el controlador de caracteres básico. En general, cualquier controlador de dispositivo tiene estas dos operaciones mínimas. La operación adicional podría ser abierta, cierre, ioctl, etc. En nuestro ejemplo, nuestro controlador tiene la memoria en el espacio del núcleo. Esta memoria es asignada por el controlador del dispositivo y puede considerarse como la memoria del dispositivo, ya que no hay componente de hardware involucrado. El controlador crea la interfaz del dispositivo en el directorio /dev Directory que puede ser utilizado por los programas de espacio de usuario para acceder al controlador y realizar las operaciones admitidas por el controlador. Para el programa UserSapace, estas operaciones son como cualquier otra operación de archivo. El programa de espacio de usuario debe abrir el archivo del dispositivo para obtener la instancia del dispositivo. Si el usuario desea realizar la operación de lectura, la llamada del sistema de lectura se puede usar para hacerlo. Del mismo modo, si el usuario desea realizar la operación de escritura, la llamada del sistema de escritura se puede utilizar para lograr la operación de escritura.
Conductor de personaje
Consideremos implementar el controlador de caracteres con las operaciones de datos de lectura/escritura.
Comenzamos tomando la instancia de los datos del dispositivo. En nuestro caso, es "struct cdrv_device_data".
Si vemos los campos de esta estructura, tenemos CDEV, búfer de dispositivos, tamaño de búfer, instancia de clase y objeto de dispositivo. Estos son los campos mínimos donde debemos implementar el controlador de caracteres. Depende del implementador en el que los campos adicionales quieran agregar para mejorar el funcionamiento del controlador. Aquí, tratamos de lograr el funcionamiento mínimo.
A continuación, debemos crear el objeto de la estructura de datos del dispositivo. Utilizamos la instrucción para asignar la memoria de manera estática.
struct cdrv_device_data char_device [cdrv_max_minors];
Esta memoria también se puede asignar dinámicamente con "Kmalloc". Mantengamos la implementación lo más simple posible.
Deberíamos tomar la implementación de las funciones de lectura y escritura. El prototipo de estas dos funciones está definido por el marco del controlador del dispositivo de Linux. La implementación de estas funciones debe ser definida por el usuario. En nuestro caso, consideramos lo siguiente:
LEA: La operación para obtener los datos de la memoria del controlador al espacio de usuarios.
static ssize_t cdrv_read (archivo struct *archivo, char __user *user_buffer, size_t size, loff_t *offset);
Escribir: la operación para almacenar los datos en la memoria del controlador desde el espacio de usuarios.
static ssize_t cdrv_write (archivo struct *archivo, const char __user *use_buffer, size_t size, loff_t *offset);
Ambas operaciones, leen y escriben, deben registrarse como parte de Struct File_Operations CDRV_FOPS. Estos están registrados en el marco del controlador del dispositivo Linux en el init_cdrv () del controlador. Dentro de la función init_cdrv (), todas las tareas de configuración se realizan. Pocas tareas son las siguientes:
El código de ejemplo completo para el controlador de dispositivo de caracteres básico es el siguiente:
#incluirCreamos una muestra de makefile para compilar el controlador de caracteres básico y la aplicación de prueba. Nuestro código de controlador está presente en CRDV.C y el código de la aplicación de prueba está presente en CDRV_APP.C.
obj-m+= cdrv.ODespués de que se realice la emisión al File, debemos obtener los siguientes registros. También obtenemos el CDRV.KO y ejecutable (CDRV_APP) para nuestra aplicación de prueba:
root@haxv-srathore-2:/home/cienauser/kernel_articles# makeAquí está el código de muestra para la aplicación de prueba. Este código implementa la aplicación de prueba que abre el archivo de dispositivo creado por el controlador CDRV y le escribe los "datos de prueba". Luego, lee los datos del controlador y los imprime después de leer los datos para imprimir como "datos de prueba".
#incluirUna vez que tenemos todas las cosas en su lugar, podemos usar el siguiente comando para insertar el controlador de caracteres básico en el núcleo de Linux:
root@haxv-srathore-2:/home/cienauser/kernel_articles# insmod cdrv.KODespués de insertar el módulo, recibimos los siguientes mensajes con DMESG y obtenemos el archivo del dispositivo creado en /dev AS /dev /cdrv_dev:
root@haxv-srathore-2:/home/cienauser/kernel_articles# dmesgAhora, ejecute la aplicación de prueba con el siguiente comando en el shell de Linux. El mensaje final imprime los datos de lectura del controlador, que es exactamente lo mismo que escribimos en la operación de escritura:
root@haxv-srathore-2:/home/cienauser/kernel_articles# ./cdrv_appTenemos pocas impresiones adicionales en la ruta de escritura y lectura que se puede ver con la ayuda del comando dmesg. Cuando emitimos el comando DMESG, obtenemos el siguiente resultado:
root@haxv-srathore-2:/home/cienauser/kernel_articles# dmesgConclusión
Hemos pasado por el controlador de caracteres básico que implementa las operaciones básicas de escritura y lectura. También discutimos la muestra MakeFile para compilar el módulo junto con la aplicación de prueba. La aplicación de prueba fue escrita y discutida para realizar las operaciones de escritura y lectura del espacio de usuario. También demostramos la compilación y ejecución del módulo y la aplicación de prueba con registros. La aplicación de prueba escribe pocos bytes de datos de prueba y luego lo lee hacia atrás. El usuario puede comparar ambos datos para confirmar el funcionamiento correcto del controlador y la aplicación de prueba.