dimanche 9 septembre 2007

programmation des ports E/S sous linux

En cherchant à porter d'anciens programmes dos vers linux, j'ai été confronté à la problématique de l'accès aux ports d'entrées/sorties du processeur. A l'époque du dos c'était simple, puisque il n'existait aucune protection à ce niveau, mais avec des systèmes en mode protégé cela est moins évident. Il existe plusieurs possibilités avec linux. L'une d'entre elle passe par des api système qui sont ioperm, outb et inb.
ioperm a pour rôle de demander l'autorisation au système d'accéder aux entrées sorties. Lorsque les opérations d'E/S sont terminés on demande à ioperm de libérer les autorisations.
Si le système accorde l'accès au peut appeler des api comme outb ou inb. Voici un exemple minimaliste en c pour illustrer cette technique :


/*
* programme très simple permettant d'accéder au port parallèle
*/

#include
#include
#include

#define BASEPORT 0x378 /* lp1 */

int main()
{

/* on demande l'accès des adresses BASEPORT à BASEPORT+3*/
if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm");
exit(1);
}

/* Initialisation de tous les signaux de données (D0-D7) à l'état bas (0) */

outb(0, BASEPORT);

/* on libère l'accès des adresses BASEPORT à BASEPORT+3*/
if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm");
exit(1);
}

exit(0);
}