Guía Hardware

Cómo funciona un driver: Guía sobre el funcionamiento de los controladores

Actualizado a: 16 de abril de 2024

Un driver o controlador es una parte esencial para que funcione el hardware, o más bien para que el kernel pueda trabajar adecuadamente con el hardware y comunicarse con él. Sin embargo, pocos conocen la verdadera naturaleza de un driver y, por eso, te lo vamos a explicar aquí de forma detallada.

Sosftware vs hardware

Hardware vs software
Fuente: Studyes.in

Lo primero para comprender cómo funciona un driver o controlador es entender la diferencia entre hardware y software. Esto es algo que ya todos saben, pero luego entenderás por qué es importante esta diferenciación. En definitiva, cuando hablamos de un sistema informático tenemos:

  • Hardware: es la parte física, los componentes electrónicos o de otra índole que forman el ordenador, como puede ser el teclado, la pantalla, la placa base, la CPU, etc.
  • Software: es el código, una serie de instrucciones y datos que permiten realizar diferentes tareas gracias a los recursos que aporta el hardware. Como software entendemos al propio sistema operativo y al resto de programas (navegadores web, editor de texto, videojuegos,…). Es decir, es esa parte lógica, que no se puede tocar.

Estos dos son partes fundamentales, y no podrían funcionar el uno sin el otro tal como entendemos actualmente la computación. Los programas cargados en la memoria son los que determinan qué debe hacer la electrónica…


HardwareSoftware
Definición básicaEs la parte física. Es tangible, se puede tocar.Es la parte lógica. No es tangible.
DesarrolloEstá fabricado.Está desarrollado y diseñado.
DependenciaEl hardware no puede realizar ninguna tarea sin el software.El software no se puede ejecutar sin hardware.
Proceso de creaciónCreado mediante diferentes técnicas de manufactura.Creado mediante el uso de un lenguaje de programación.
DurabilidadGeneralmente suele desgastarse con el tiempo y el uso.El software no se desgasta con el tiempo. Sin embargo, puede contener bugs y vulnerabilidades, o estropearse la memoria en la que está almacenado.
TiposPodemos diferenciar a grandes rasgos entre los componentes internos, los periféricos (de entrada y salida).Tenemos el software del sistema, o sistema operativo, y el software de aplicación.
MalwareEl hardware no suele verse afectado por malware, aunque hay vulnerabilidades que pueden ser explotadas o casos extraños como los Power virus.El software sí se puede ver afectado por malware.
Lenguaje comprensibleCódigo máquina. Es decir, unos y ceros, señales de voltaje altas y bajas.El programa acepta entradas legibles por humanos y también permite mostrar salidas entendibles para los humanos.
ReemplazoSi el hardware está dañado, se reemplaza por uno nuevo.Si el software está dañado, se puede reinstalar su copia de seguridad.
Fallos típicosDebidos a un mal mantenimiento, sobrecalentamiento, roturas, problemas eléctricos, etc.Desbordamiento, errores, etc.

¿Qué es el firmware?

Además del hardware y software, también tenemos el firmware. Esta es otra parte fundamental de los actuales ordenadores. Y es esencial conocerlo de cara a conocer qué es un driver, ya que muchas veces se solapan o trabajan muy estrechamente.

En el caso del firmware no es ni software ni hardware, se trata de un código o rutina en una memoria no volátil (flash, EPROM, ROM,…). Este firmware es necesario para que el dispositivo de hardware funcione adecuadamente. Este firmware es instalado directamente por el fabricante del dispositivo, aunque se puede actualizar.

Además, existen varios tipos de firmware que se pueden catalogar como:

  • De bajo nivel: es un tipo de firmware que forma parte intrínseca del hardware, almacenado generalmente en un chip de memoria ROM. No se puede actualizar ni modificar.
  • De alto nivel: este firmware permite actualizaciones y es más complejo que el de bajo nivel por norma general. También reside en chips de memoria, pero suelen ser flash.
  • De subsistema: suele venir como parte de un sistema integrado. Es similar al de alto nivel y puede actualizarse. Por ejemplo, el subsistema de alimentación de un servidor tiene este tipo de firmware, y funciona de forma semi-independiente del servidor en sí.

Dicho esto, hay que decir que las funciones del firmware pueden ser de lo más variado. Por ejemplo, el firmware es capaz de ayudar al hardware a arrancar, a detenerse, a comunicarse con otros dispositivos, etc. Sin embargo, puede variar según el dispositivo al que pertenezca:

  • BIOS/UEFI: es un firmware que se encarga de realizar el arranque del equipo, poniendo la CPU en un estado conocido, realizar unos tests al hardware para comprobar si hay problemas, y buscar el medio donde está instalado el sistema operativo para iniciarlo y cederle el control. Hay que resaltar que las tarjetas gráficas son como placas base o computadoras en pequeño, con una unidad central de procesamiento, en este caso la GPU, con una memoria RAM, en este caso VRAM, y con otras partes similares como la E/S con las salidas al monitor, etc. Por eso, tienen también un chip BIOS propio con el firmware, pero es independiente del BIOS/UEFI de la placa base.
  • Dispositivos de almacenamiento: tienen un firmware básico que les permite funcionar cuando se conectan al equipo.
  • Periféricos: este firmware también ayuda a funcionar al periférico en cuestión. Por ejemplo, una impresora tiene un firmware que ayuda al hardware a realizar las operaciones necesarias según lo que se requiera en cada momento.

Diferencia entre firmware y software.

Algunos consideran al firmware un tipo de software de bajo nivel, pero son dos cosas diferentes:

  • Es una rutina o programa a bajo nivel muy elemental para que el hardware funcione correctamente y para permitirle comunicarse con otro software.
  • El software es un programa mucho más complejo y con el que interactúa el usuario para realizar tareas específicas. Y, mientras el firmware se almacena en una memoria tipo ROM, EPROM, EEPROM, o flash en algunos casos, el software se puede almacenar en unidades de almacenamiento masivo, unidades ópticas, etc.

Firmware vs driver

Otra cosa que suele ser bastante confusa, especialmente en la actualidad donde se han solapado aún más, es diferenciar entre firmware y driver. Y es que en la actualidad algunos drivers o controladores también incluyen el firmware del dispositivo.

Pero, mientras el driver se considera un software que permite al sistema operativo o al kernel comunicarse con el dispositivo al que controla, el firmware está a un nivel aún más bajo, y generalmente es el intermediario entre el driver y el hardware.

Por otro lado, el firmware no es necesario instalarlo, ya que viene ya con el dispositivo. Mientras que el driver sí que necesita instalarse, o dejar que el sistema operativo lo haga por ti. Incluso, si tenemos en cuenta el objetivo, el controlador se encarga del buen funcionamiento del dispositivo de hardware, mientras que el firmware tiene como objetivo dar «vida» a este dispositivo de hardware, controlando funciones esenciales como la comunicación E/S, inicialización, etc.

¿Qué es un driver o controlador?

Un driver o controlador no es más que un grupo de archivos que deben ser instalados para permitir que uno o varios dispositivos se puedan comunicar con el sistema operativo. Sin ellos, el sistema no podría enviar o recibir datos del dispositivo de hardware, por lo que no funcionaría. Así que, ya sea el driver genérico que instala el sistema operativo o el driver específico del fabricante del dispositivo, se necesitará para que funcione.

Muchos dispositivos de hardware necesitan controladores, como la tarjeta gráfica, el chipset, el lector de tarjetas, la impresora, la tarjeta de red, la tarjeta de sonido, etc. En algunos casos, con un solo driver pueden funcionar multitud de unidades diferentes. Por ejemplo, un pendrive usará el controlador USB para funcionar, por lo que aunque cambies de pendrive no tendrás que instalar otro driver.

También es verdad que algunos componentes no necesitan de driver o controlador para funcionar. Por ejemplo, cuando miras una placa base, te das cuenta que existen multitud de elementos adicionales que no necesitan de un controlador, como es lógico, como podrían ser los componentes electrónicos básicos.

El driver o controlador se encargará de las transmisiones de solicitudes de acceso a dispositivos, ya sea desde o hacia el dispositivo. De lo contrario, el sistema operativo no podría interactuar con el dispositivo y sería como si no estuviese presente. Además, el controlador también debe definir los mensajes y mecanismos empleados para las comunicaciones.

Por ejemplo, aquí tienes un ejemplo de código fuente de un controlador escrito en C para el kernel Linux que se encarga de controlar el parpadeo de un LED conectado a los GPIO de una placa Raspberri Pi:

/*
 * DESCRIPTION:
 *     The example of using the timer to perform the blinking LED .
 * */

#include <linux/module.h>   
#include <linux/string.h>    
#include <linux/init.h>
#include <linux/cdev.h>

#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/sched.h>
#include <linux/interrupt.h>

#include <linux/list.h>
#include <linux/irq.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/time.h>
#include <linux/delay.h>
#include <linux/timer.h>

#define LED0 22 
#define LED1 27 

#define MY_DEVICE_NAME    "myLED_timer"

MODULE_LICENSE("GPL");
MODULE_AUTHOR("ITtraining.com.tw");
MODULE_DESCRIPTION("A Simple GPIO Device Driver module for RaspPi");


struct timer_list my_timer;
int my_flag = 0;

/*
 * TIMER FUNCTION
 * */

static void timer_function(unsigned long data){
	gpio_set_value(LED0, my_flag == 1);
	gpio_set_value(LED1, my_flag == 0);
	my_flag = my_flag ? (0):(1);
	// modify the timer for next time
	mod_timer(&my_timer, jiffies + HZ / 2);
}

/*
 * INIT MODULE
 * */
int init_module(void)
{

	printk("moudle: LED blinking ...\n");

	printk("*****LED GPIO Init ******************\n");
	if(gpio_request(LED0,"LED0") ) return -1;
	if(gpio_request(LED1,"LED1") ) return -1;
	gpio_direction_output(LED0, 0);
	gpio_direction_output(LED1, 0);

	//  -- initialize the timer 
	init_timer(&my_timer);
	my_timer.expires = jiffies + HZ ;
	my_timer.function = timer_function;
	my_timer.data = NULL;

	// -- TIMER START 
	add_timer(&my_timer);

	return 0;
}

/*
 * CLEANUP MODULE
 * */
void cleanup_module(void)
{
	del_timer(&my_timer);

	printk("module : LED blinking END\n");
	gpio_set_value(LED0, 0);
	gpio_set_value(LED1, 0);
	gpio_free(LED0);
	gpio_free(LED1);
}

Aquí también puedes ver un ejemplo de código fuente en C para un driver USB simple para Linux.

A veces, no solo existen drivers o controladores para dispositivos de hardware físicos o reales, también puede haber para dispositivos virtuales, es decir, para emulaciones de hardware creadas a través de software.

Al principio, estos controladores se solían escribir en lenguaje ensamblador, en vez de usar lenguajes de programación de alto nivel. Eso permitía poder acceder a más bajo nivel al hardware, o inferior de forma inmediata y directa con la CPU para el control de dicho dispositivo.

En cambio, actualmente, dada la complejidad de los controladores actuales, se suelen escribir en lenguajes de programación como C o C++ principalmente. Estos lenguajes también permiten usar algunos accesos a más bajo nivel, por lo que son perfectos para los drivers, además de tener un buen rendimiento. No obstante, algunos drivers podrían también tener partes en ASM o ensamblador para maximizar el rendimiento.

Dado que los drivers o controladores se ejecutarán en niveles privilegiados, hay que tener en cuenta que podrían representar una gran amenaza para la seguridad si contienen código malicioso o vulnerabilidades. Por eso, es importante mantenerlos actualizados, además de que pueden traer mejoras de eficiencia, rendimiento o corregir bugs.

Un ejemplo

tarjetas gráficas 200 euros

Veamos un ejemplo para tener más clara la función del driver o controlador. En este caso vamos a ver a grandes rasgos qué hace el driver de la GPU. Si rcuerdas mi explicación sobre las llamadas al sistema, también recordarás que era necesario para las aplicaciones o para el propio sistema operativo, tener privilegios para acceder al hardware. Por eso los drivers están en una zona privilegiada o integrados en el kernel, para poder permitir tener acceso directo.

Bien, dicho esto, hay que decir que el driver o controlador lo que hará es leer y escribir en la GPU con instrucciones regulares (p.e.: posición del elemento, color,…) de la CPU, accediendo a los puertos mapeados en memoria. Por ejemplo, cuando pulsas una tecla A para que aparezca ese caracter en un editor de texto, se inciará un mecanismo en el que interviene el driver para escribir en una dirección de memoria de la VRAM de la GPU unas directrices que son necesarias para que la GPU pueda procesar ese gráfico y hacer que se muestre en pantalla la letra A.

Además, hay que tener en cuenta que en el caso de la GPU, también tendremos otras interfaces que intervienen en el proceso o APIs gra´ficas, como OpenGL, Vulkan, DirectX 3D, etc. para la generación de ciertos gráficos. De estas APIs hacen uso el software como los videojuegos para poder «pintar» los gráficos que se necesitan.

Dicho de otro modo, la GPU se encarga de actualizar todo lo que sucede en la pantalla, como si fuese el monitor un buffer de memoria en el que escribir las novedades. Pero, como la GPU usa una ISA diferente, «habla otro idioma», por decirlo de algún modo, para eso está el driver o controlador, para cuando reciba un comando de algún gráfico que tiene que procesar, traducirlo a ese otro idioma que la GPU entiende.

¿No te ha quedado muy claro? Veamos otro ejemplo. Imagina que tienes abierta una ventana de un programa y la mueves hacia un lado. Para que el movimiento sea posible, los pasos que se seguirán son:

  1. La parte del entorno de escritorio o entorno gráfico hará uso de la API gráfica para enviar una serie de comandos necesarios para que la ventana pueda moverse.
  2. El driver o controlador de la GPU traducirá desde la API estos comandos para que puedan ser entendibles para la GPU, es decir, los comandos propietarios y secretos que usa la GPU. Hasta aquí todo el trabajo lo ha realizado la CPU.
  3. Ahora la CPU entregará las instrucciones que debe procesar la GPU y ésta se encargará de ello, poniendo el resultado en la salida que va hacia el monitor para refrescar éste y que la ventana aparezca desplazada.

Los comandos de la GPU de los que hablamos, o instrucciones, pueden hacer multitud de cosas, igual que la ISA de la CPU. Pero, mientras que la ISA de la CPU es visible y se puede usar para programar, la ISA de la GPU es opaca y no se suelen dar detalles. Además, estos conjuntos de comandos varían de una GPU a otra, por lo que se necesita esa capa intermediaria del driver y la API para que todo funcione adecuadamente, sin tener que hacer grandes modificaciones, solo realizar modificaciones en el controlador de la GPU, sin tener que reescribir software.

En la API gráfica también se pueden necesitar algunas modificaciones puntuales, como cuando se implementa trazado de rayos, etc. Pero no suelen tener que cambiar de una generación a otra de GPU o entre marcas.

Preguntas y respuestas frecuentes

Para finalizar, vamos a ver algunas preguntas y respuestas rápidas que muchos usuarios se suelen hacer sobre los drivers o controladores:

¿Qué pasa si no existe un driver instalado para un dispositivo?

Por lo general, si el driver no está instalado el dispositivo no funcionará en absoluto, ni lo reconocerá el sistema operativo. Sin embargo, existen algunos casos excepcionales, como por ejemplo un ratón y teclado, que suelen funcionar sin necesidad de driver específico. Esto es porque el propio sistema ya tiene estos controladores genéricos para permitir unas funciones básicas. Por ejemplo, mientras instalas un SO es necesario usar estos periféricos, pero sin un controlador no se podría.

Sin embago, si no hay un driver espcífico para un teclado o ratón particular, podría no funcionar al completo. Por ejemplo, podrías usar las teclas básicas, pero ese controlador no implementará lo necesario para usar ciertas teclas o botones especiales de funciones, botones programables, etc.

¿Un driver funciona para todos los SSOO?

No, a pesar de que un driver sea el intermediario o interlocutor entre el dispositivo y el software, es necesario que esté específicamente diseñado para trabajar junto con el kernel o el sistema operativo en particular. Además, también tendrá que estar compilado para una arquitectura en particular. Por ejemplo, un driver de Linux no funcionaría en Windows o macOS, y viceversa. Tampoco funcionaría un driver de Windows para ARM en un x86, y así…

¿Por qué son gratuitos?

Aunque no hay una regla que obligue a ofrecer los drivers de forma gratuita, lo cierto es que no tendría mucho sentido cobrar por ellos, ya que de lo contrario, el hardware que has comprado no funcionaría. Sin embargo, podría haber casos en los que se cobre por un driver hecho específicamente para un dispositivo o para una máquina para la que no existía.

¿Son seguros?

Un driver o controlador se ejecuta en un modo privilegiado, por lo que si contiene vulnerabilidades o código malicioso, el daño podría ser bastante severo. Sin embargo, si descargas el driver de la web oficial del fabricante de hardware, no debería haber problemas. Así que, evita por todos los medios descargar drivers de páginas de terceros.

¿Qué pasa si descargo un driver incorrecto?

Si no es el controlador correcto, simplemente podría fallar durante la instalación o instalarse con éxito, pero el hardware al que controlan no funcionaría.

¿Puede un driver generar problemas en el sistema?

Los drivers, si existen conflictos entre ellos (p.e.: si existen varios drivers para un mismo dispositivo) podrían generar problemas en el sistema operativo. Además, si no funcionan correctamente por algún bug, también podrían hacer que el dispositivo funcione de forma inapropiada o que haya mensajes de error.

Los drivers más críticos y que más problemas suelen generar son los de la GPU. Estos drivers podrían hacer incluso que el sistema operativo no arranque tras una actualización o instalación.

Jaime Herrera

Jaime Herrera

Técnico electrónico y experto en el sector de los semiconductores y el hardware. Con una amplia y sólida trayectoria en el campo de la electrónica, he acumulado una extensa experiencia. Mi pasión por la tecnología y la informática me ha impulsado a dedicar décadas de mi vida al estudio y desarrollo de soluciones en este fascinante sector. Como técnico electrónico, he tenido el privilegio de trabajar en una variedad de proyectos y desafíos, lo que me ha permitido adquirir un profundo conocimiento y experiencia en la creación, diseño y mantenimiento de dispositivos electrónicos.

>
Guía Hardware
Logo