# Controlador de dispositiu

Un controlador de dispositiu, comunament anomenat controlador, o, en anglès, driver, és un programa informàtic que permet al sistema operatiu d'un ordinador interaccionar amb un perifèric, fent una abstracció del maquinari i proporcionant una interfície -possiblement estandarditzada- per a poder-lo utilitzar. Els controladors de dispositius (device driver) són programes afegits al nucli del sistema operatiu, concebuts inicialment per gestionar perifèrics i dispositius especials.

## Propòsit

Un driver simplifica la programació, actuant com a traductor entre un dispositiu de maquinari i les aplicacions o sistemes operatius que l'utilitzen. Els programadors poden escriure el codi de l'aplicació de més alt nivell, independentment de qualsevol dispositiu de maquinari específic.
Un controlador normalment es comunica amb el dispositiu a través del Bus de l'ordinador o el subsistema de comunicacions al qual es connecta el maquinari. Quan un programa de trucada invoca una rutina al controlador, aquest resol les qüestions pertinents, donant ordres al dispositiu. Una vegada que el dispositiu envia les dades al controlador, aquest pot invocar les rutines en el programa de trucada original. Els controladors depenen del maquinari i del sistema operatiu específic. En general, proporcionar el tractament de les interrupcions necessàries per a qualsevol interfície asíncrona de maquinari depèn del temps.
Es pot esquematitzar com un manual d'instruccions que indica a l'ordinador com ha de controlar i comunicar-se amb un dispositiu concret. Per tant, és indispensable per a poder utilitzar qualsevol peça de maquinari, com ara el teclat, una càmera de fotos, la impressora, una memòria USB, etc.
Existeixen tants tipus de controladors com tipus de perifèrics i, és normal trobar més d'un controlador possible pel mateix dispositiu, cada un oferint un nivell diferent de funcionalitats. Per exemple, a part dels oficials (normalment disponibles a la pàgina web del fabricant), es poden trobar també els proporcionats pel sistema operatiu, o també versions no oficials fetes per altres.
A causa que el programari de controladors de dispositius s'executa com a part del sistema operatiu, amb accés sense restriccions a tot l'equip, és essencial que només es permetin els controladors de dispositius autoritzats. La signatura i l'emmagatzematge provisional dels paquets de controladors de dispositius en els equips client, mitjançant les tècniques descrites en aquesta guia, proporcionen els avantatges següents:
* Seguretat millorada: Com que els usuaris estàndard no poden instal·lar controladors de dispositius que no estiguin signats o que estiguin signats per un editor que no és de confiança, els administradors tindran un control rigorós respecte als controladors de dispositius que poden usar-se en una organització. Podran impedir els controladors de dispositius desconeguts, així com qualsevol controlador que l'administrador no permeti expressament. Mitjançant l'ús de directives de grup, un administrador pot proporcionar a tots els equips client d'una organització dels certificats dels editors que es considerin de confiança, permetent la instal·lació dels controladors sense intervenció de l'usuari, per comprovar que es tracta d'una firma digital de confiança.
* Reducció dels costos de suport tècnic: Els usuaris només podran instal·lar els dispositius que hagin estat provats i admesos per l'organització. En conseqüència, el sistema permet mantenir la seguretat de l'equip, alhora que es redueixen les sol·licituds del departament de suport tècnic.
* Experiència d'usuari millorada: Un paquet de controladors signat per un editor de confiança i emmagatzemat provisionalment al magatzem de controladors funciona de manera automàtica, quan l'usuari connecta el dispositiu a l'equip. No cal acció per part de l'usuari.
En aquesta secció s'inclouen les tasques principals per a la seguretat dels paquets de controladors de dispositius:
Els controladors de dispositiu (device drivers en anglès) són programes afegits al nucli del sistema operatiu, concebuts inicialment per gestionar perifèrics i dispositius especials. Els controladors de dispositiu poden ser de dos tipus: orientats a caràcters (com ara els dispositius NUL, AUX, PRN, del sistema) o bé orientats a blocs, constituint les conegudes unitats de disc. La diferència fonamental entre ambdós tipus de controladors és que els primers reben o envien la informació caràcter a caràcter, en canvi, els controladors de dispositiu de blocs processen, com el seu propi nom indica, blocs de certa longitud en bytes (sectors). Els controladors de dispositiu, apareguts amb el DOS 2.0, permeten afegir nous components a l'ordinador sense necessitat de redissenyar el sistema operatiu.
Tradicionalment han estat programes binaris purs, similars als COM encara que acoblats amb un ORG 0, als quals se'ls col·locava una extensió SYS. Tanmateix, no hi ha raó perquè això sigui així, ja que un controlador de dispositiu pot estar inclòs dins d'un programa EXE, amb la condició que el codi del controlador sigui el primer segment de l'esmentat programa. L'EMM386.EXE del MS-DOS 5.0 va sorprendre a més d'un en el seu dia, ja que cridava l'atenció observar com es podia carregar amb DEVICE: el cert és que això és factible fins i tot des del DOS 2.0 (malgrat el que pugui indicar algun llibre), però ha estat mantingut gairebé en secret. Actualment és relativament freqüent trobar programes d'aquest tipus. L'avantatge d'un controlador de dispositiu de tipus EXE és que pot ser executat des del DOS per modificar les seves condicions d'operació, sense complicar el seu ús per part de l'usuari amb un altre programa addicional. A més, un controlador de dispositiu EXE pot superar el límit dels 64 KB, ja que el DOS s'encarrega de localitzar les referències absolutes en segments com en qualsevol programa EXE ordinari.
Un programa controlador es comunica amb el perifèric a través del bus al qual està connectat el maquinari al que controla. Quan un programa invoca una rutina en el programa controlador, aquest llança les comandes necessàries al dispositiu de maquinari. El dispositiu enviarà la resposta al programa controlador, i aquest programa pot invocar rutines en l'aplicació que ha fet la primera crida. Els programes controladors són exclusius de cada dispositiu de maquinari i es dissenyen per a un determinat sistema operatiu.
En entorns Linux, els programadors poden crear controladors de dispositius, ja sigui com a part del nucli o per separat, com a mòduls. Makedev inclou una llista dels dispositius a Linux: ttyS (terminal), IP (port paral·lel), HD (disc), loop (bucle de dispositiu de disc), so (això inclou mesclador, seqüenciador, DSP, i àudio).
Microsoft ha tractat de reduir la inestabilitat del sistema a causa dels controladors de dispositius mal escrits mitjançant la creació d'un nou marc per al desenvolupament del controlador, anomenat Windows Driver Foundation (WDF). Apple disposa d'un marc de codi obert per a desenvolupar controladors per a Mac OS X anomenat I/O Kit.

## Disseny

Els controladors de dispositius es poden separar en 2 capes, lògica i física, la lògica processa les dades per a una classe de dispositius com ara Ethernet o ports. En canvi les físiques són per comunicar-se amb les instàncies d'un dispositiu específic. Per exemple, un port sèrie ha de manejar protocols de comunicació estàndard, com ara el control de flux, que són comuns per a tot el maquinari de port sèrie. Això seria gestionat per una capa lògica del port sèrie. No obstant això, la capa física ha de comunicar-se amb un xip de port sèrie en particular, i no tots els xips són iguals. La capa física s'ocupa d'aquestes variacions de xips específics.
Convencionalment, les sol·licituds del sistema operatiu van a la capa lògica en primer lloc. Al seu torn, la capa lògica fa una crida a la capa física per a executar les sol·licituds del sistema operatiu en termes comprensibles pel maquinari. A la inversa, quan un dispositiu de maquinari vol respondre a les necessitats del sistema operatiu, utilitza la capa física per a parlar amb la capa lògica.

## Fallades de controladors

En ser una part crítica del sistema operatiu, la fallada d'un controlador pot ser més greu que altres errors de programari, podent bloquejar l'ordinador o fins i tot danyar el maquinari. Degut al fet que el maquinari és (necessàriament) indeterminista, trobar i solucionar una fallada en un controlador és una tasca complicada, ja que no només cal monitorar el programa, sinó també el mateix dispositiu. Alguns dels errors més comuns en controladors són les apagades electròniques, curtcircuits i alguna d'adversitat electrònica. Això pot provocar un error tal que vagi repercutit directament al hardware del sistema i en el pitjor dels casos haver de substituir la part afectada. Els problemes dels controladors de dispositius en els PC's són causats normalment degut a algun virus o degut a algun altre tipus de malware (cucs, troians, etc.). Tot i això, molts usuaris amb experiència poden reconèixer aquests temes i corregir el problema sense necessitat d'un suport tècnic.

## Mode usuari i Mode sistema

Els controladors de dispositius, particularment en sistemes operatius moderns, poden executar-se en mode sistema o en mode usuari. Els principals beneficis d'executar un controlador en mode usuari és la millora d'estabilitat, ja que un controlador defectuós en mode usuari no pot afectar el sistema sobreescrivint memòria del sistema operatiu. Per altra banda, les transicions entre el mode usuari i el mode sistema normalment suposen una sobrecàrrega considerable del rendiment, desaconsellant, per aquesta raó, que els controladors per dispositius de baixa latència o alt rendiment s'executin en mode usuari.
Al mode sistema només es pot accedir des de mode usuari mitjançant l'ús de crides del sistema. Programes finals d'usuari com el shell d'UNIX o altres aplicacions amb interfície gràfica són part de l'espai d'usuari. Aquestes aplicacions interaccionen amb el maquinari fent servir les funcions suportades pel nucli del sistema operatiu.

## Controladors de dispositius virtuals

Els controladors de dispositiu virtuals representen una variant particular dels controladors. S'utilitzen per emular un dispositiu de maquinari, especialment en entorns de virtualització, per exemple, quan un programa DOS s'executa en un equip amb Microsoft Windows o quan s'està executant un sistema operatiu convidat. En lloc de delegar la responsabilitat del diàleg amb el maquinari al sistema operatiu convidat, els controladors de dispositiu virtual assumeixen el paper oposat i emulen una peça de maquinari, de manera que el sistema operatiu convidat i els seus controladors de dispositiu s'executen dins d'una màquina virtual i pot tenir la il·lusió que l'accés s'està fent al maquinari real.
Quan el sistema operatiu "convidat" intenta accedir al maquinari es fa mitjançant crides de funcions al controlador virtual (al seu sistema operatiu). El controlador del dispositiu virtual també pot enviar esdeveniments simulats com faria el processador, com ara interrupcions a la màquina virtual.
Els dispositius virtuals també poden operar en un entorn no virtualitzat. Per exemple, un adaptador de xarxa virtual s'utilitza amb una xarxa privada virtual, mentre que un dispositiu de disc virtual s'utilitza amb iSCSI.

## Sistemes operatius lliures

El cas dels sistemes operatius lliures és molt exemplar, ja que en la majoria de les oportunitats dels fabricants no solen desenvolupar controladors per a GNU / Linux o BSD, es creen drivers lliures específics, la qual cosa és complicat si el fabricant no coopera en absolut. Aquests sistemes operatius lliures tenen en general una enorme quantitat de drivers instal·lats als CD o DVD, és així que al moment d'iniciar falla la maquinari i es carreguen els drivers per a aquest maquinari, aconseguint un temps mínim de configuració, i una enorme comoditat per a l'usuari final. En alguns casos, al contrari, la instal·lació d'un dispositiu que no té un driver lliure pot ser tortuosa.
El driver està en el kernel. El kernel té les següents feines:
* Gestió de processos: creació i destrucció de processos, comunicació entre processos, assignació de CPU.
* Gestió de la memòria: la memòria és un recurs crític, i elkernel administra la seva assignació.
* Sistema de fitxers.
* Control de dispositius.
Networking:
El kernel diferencia tres tipus de drivers:
* Drivers de caràcter (character devices)
* Drivers de bloc (block devices)
* Drivers de xarxa (network devices)
No tots els drivers són de dispositius. Alguns són de programari. Per exemple, el driver d'un sistema d'arxius com ext3 o reiserfs són drivers de programari, que mapeja estructures de dades de baix nivell a estructures de dades de més alt nivell.

## Aplicacions

Degut a la diversitat del hardware i dels sistemes operatius, els controladors de dispositius han de poder operar en diferents medis. Els controladors de dispositius poden interaccionar amb:
* impressores
* targetes gràfiques
* targetes de xarxa
* targetes de so
* busos locals de diversos tipus
* busos d'entrada-sortida d'amplada de banda baixa de tipus diferents com poden ser ratolins, teclats, USB, etc.
* dispositius d'emmagatzematge com discs durs, CD-ROM i busos de disc (ATA, SATA i SCSI)
* escàners
* càmeres digitals
Els nivells comuns d'abstracció per als controladors són:
* Per al maquinari:
** Interconnexió directa.
** Escriptura o lectura d'un registre.
** Usant alguna de les interfícies d'alt nivell (per exemple, BIOS de vídeo).
** Utilitzant un altre controlador de dispositiu de nivell inferior (per exemple, els conductors del sistema d'arxius utilitzant els controladors de disc).
** Simulant el treball amb el maquinari.
* Per al programari:
** Permet l'accés directe del sistema operatiu als recursos del maquinari.
** Utilització de primitives.
** La implementació d'una interfície no conductora pel software (per exemple, TWAIN).
** La implementació d'un llenguatge, de vegades a alt nivell (per exemple, PostScript).

## Referències

* ↑ «Llista obligatòria de controladors».

## Vegeu també

* Scanner Access Now Easy

## Enllaços externs

* Dev Center - Hardware (anglès)
* Linux Hardware Compatibility Lists & Linux Drivers (anglès)