J'obtiens une erreur de segmentation lorsque j'essaye d'accéder aux ports.
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.
Je n'arrive à trouver nulle part la définition de
in*()
, out*()
,
de plus gcc se plaint de références non-définies.
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.
out*()
ne fait rien ou ne retourne
que des valeurs bizarres.
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.
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, …
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.