Hola! Por aquà dejo un resumen de una fuente original de linux, bastante interesante:
Un SO es el conjunto de procedimientos manuales y automáticos que permiten a un conjunto de usuarios compartir un sistema de cómputo de manera eficiente. El diccionario define un SO como un programa o conjunto de programas que gestionan los procesos de un sistema informático y permiten la ejecución normal de los demás trabajos. Esta diferencia es muy importante porque, por lo general, los procesos se ejecutan bajo el control del sistema operativo. AquÃ, nuestro programa es el sistema operativo, por lo que no podemos hablar de procesos.
Usaremos el término kernel para referirnos al cuerpo principal del sistema operativo, que es un programa escrito en lenguaje C. Cuando hablamos de la compilación del kernel, queremos decir que editaremos los archivos fuente para generar un nuevo kernel.
¿Qué es un controlador?
La figura 1 muestra la relación entre los programas de usuario, el sistema operativo y los dispositivos. En el lado izquierdo, los programas de usuario pueden interactuar con los dispositivos a través de un conjunto de funciones de biblioteca de alto nivel.
En este nivel de ejecución, el kernel llama a funciones de controlador como lp_open o lp_write . Finalmente, el controlador del dispositivo es la interfaz fÃsica entre el software y el hardware.
Tenga en cuenta que estas funciones no están disponibles para el usuario. Dado que el kernel de Linux se ejecuta en modo protegido, las direcciones de poca memoria, donde residen las direcciones de los puertos, no son accesibles para el usuario.
Las principales caracterÃsticas de un controlador son
Realiza la gestión de entrada/salida . Proporciona una gestión transparente de los dispositivos, evitando la programación de bajo nivel . Incluye gestión de errores de software y hardware. Permite el acceso simultáneo al hardware por varios procesos.
Los controladores de caracteres transmiten información del usuario al dispositivo byte por byte . Los controladores de bloque transmiten información bloque por bloque. Cuando esto ocurre, el contenido del búfer se envÃa fÃsicamente al dispositivo o al usuario. Esta es la razón por la que todos los mensajes impresos no aparecen en la pantalla cuando un programa de usuario falla , o la luz de la unidad de disquete no siempre se enciende cuando el usuario escribe en un archivo.
Los controladores de terminal constituyen un conjunto especial de controladores de caracteres para la comunicación del usuario. Por ejemplo, las herramientas de comando en un entorno de ventanas abiertas, una terminal X o una consola, son dispositivos que requieren funciones especiales, por ejemplo, las flechas hacia arriba y hacia abajo para un administrador de búfer de comandos o tabulación en el shell bash. Ejemplos de controladores de bloque son /dev/tty0 o /dev/ttya . En ambos casos, el kernel incluye rutinas especiales y el controlador procedimientos especiales para hacer frente a todas las caracterÃsticas particulares.
Los flujos son los controladores más jóvenes y están diseñados para flujos de datos de muy alta velocidad. Tanto el kernel como el controlador incluyen varias capas de protocolo. El mejor ejemplo de este tipo es un controlador de red. Como hemos dicho, un controlador es una parte de un programa.
Hay varias razones para escribir nuestro propio controlador de dispositivo
Para solucionar problemas de concurrencia cuando dos o más procesos intentan acceder a un dispositivo al mismo tiempo. Para manejar otras aplicaciones inusuales, como administrar un dispositivo virtual . Para conocer las partes internas del sistema.
En el proceso de depuración, el kernel se cuelga fácilmente y no es posible usar depuradores o funciones de biblioteca C como printf . Finalmente, debemos agregar que escribir nuestro propio controlador de dispositivo solo es necesario cuando el fabricante del dispositivo no proporciona un controlador para nuestro sistema operativo o cuando deseamos agregar una funcionalidad adicional a la que tenemos.
Un ejemplo real de un controlador
Sin embargo, tanto la estructura del directorio como la interfaz del controlador con el kernel dependen del sistema operativo. Por ejemplo, varias cosas cambiaron de Linux 1.2. X a Linux 2.0. X, como los prototipos de las funciones del controlador, el método de configuración del kernel y los Makefiles para la compilación del kernel.
El dispositivo que hemos seleccionado para nuestra explicación es el Robot Móvil MRV-4 de la empresa estadounidense Denning-Brach International Robotics. Aunque el robot utiliza una PC con una placa especÃfica para la interfaz de hardware , la empresa no proporciona un controlador para Linux. La solución es escribir un controlador para Linux. En el ejemplo, usamos la versión 2.0.24 del kernel, aunque también funcionará en versiones posteriores con algunas modificaciones.
Volviendo al esquema inicial , el dispositivo es el robot MRV-4, la interfaz de hardware es la tarjeta motor/sonar, el archivo fuente del controlador será mrv4. C, el nuevo kernel que generaremos será vmlinuz , el programa de usuario para las pruebas del núcleo será mrv4test. C y el dispositivo será /dev/mrv4 .
Consideraciones generales de programación
Programe los archivos fuente del controlador, prestando especial atención a la interfaz del kernel. Integre el controlador en el kernel, incluidas las llamadas de origen del kernel a las funciones del controlador. Configure y compile el nuevo kernel. Pruebe el controlador, escribiendo un programa de usuario.
La primera tarea al programar los archivos fuente de un controlador es seleccionar un nombre para identificarlo de manera única, como hd, sd, fd, lp, etc. En nuestro caso decidimos usar mrv4. Nuestro controlador será un controlador de caracteres, por lo que escribiremos la fuente en el archivo /usr/src/linux/drivers/char/mrv4. C, y su encabezado en /usr/include/linux/mrv4. La segunda tarea es implementar las funciones de E/S del controlador.
En nuestro caso, mrv4_open , mrv4_read , mrv4_write , mrv4_ioctl y mrv4_release .
Se debe tener especial cuidado al programar el controlador debido a las siguientes limitaciones
No es posible esperar eventos, porque el núcleo y, por lo tanto, todos los procesos están detenidos.
Programación de bajo nivel
El acceso a la interfaz de hardware se proporciona a través del direccionamiento de memoria baja.