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.