8. Problèmes et solutions

Q1.

J'obtiens une erreur de segmentation lorsque j'essaye d'accéder aux ports.

R1.

Soit votre programme n'a pas les privilèges de super utilisateur, soit l'appel à ioperm() n'a pas réussi pour une raison ou une autre. Vérifiez la valeur de retour de ioperm(). Vérifiez également que vous accédez bien aux ports que vous avez activés préalablement avec ioperm() (voir Q3). Si vous faites appel aux macros de temporisation (inb_p(), outb_p(), et cætera), pensez aussi à utiliser ioperm() pour obtenir l'accès au port 0x80.

Q2.

Je n'arrive à trouver nulle part la définition de in*(), out*(), de plus gcc se plaint de références non-définies.

R2.

Vous n'avez pas lancé la compilation avec les drapeaux d'optimisation (-O), en conséquence gcc n'a pas pu trouver les macros définies dans asm/io.h. Ou alors, vous n'avez pas inclus du tout la ligne #include <asm/io.h> dans votre code.

Q3.

out*() ne fait rien ou ne retourne que des valeurs bizarres.

R3.

Vérifiez l'ordre des paramètres, ceux-ci devraient être comme ce qui suit : outb(valeur, port) et non pas outportb(port, valeur) comme en MS-DOS.

Q4.

Je souhaite contrôler un périphérique standard, tel qu'un périphérique RS-232, une imprimante parallèle, une manette de jeu, …

R4.

Vous auriez plutôt intérêt à utiliser les pilotes déjà existants (dans le noyau Linux ou un serveur X ou ailleurs) pour ce faire. Ces pilotes sont généralement assez polyvalents. Ainsi ils arrivent même en général à faire fonctionner les périphériques sortant légèrement des standards. Voyez la note d'information ci-dessus sur les ports standards pour de la documentation à leur sujet.