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(
et non pas
valeur
, ,
port
)outportb(
comme en
MS-DOS.
port
, ,
valeur
)
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.