Nästa Föregående Innehållsförteckning

8. Felsökning

Q1.

Jag får segmentation faults när jag adresserar portar.

A1.

Antingen har ditt program inte root­privilegier, eller har ioperm() falerat av någon annan orsak. Testa det returnerade värdet från ioperm(). Testa också att du verkligen adresserar de portar som du gett tillstånd till med ioperm() (se Q3).

Om du använder 'delaying macros' (inb_p(), outb_p(), osv.), kom ihåg att du då måste anropa ioperm() för att ge accesstillstånd till adress 0x80.

Q2.

Jag kan inte hitta var in*(), out*() funktionerna definieras, och gcc klagar över odefinierade referenser.

A2.

Du kompilerade inte med optimerings­flaggan på (-O1 eller högre), och därför kunde inte gcc lösa upp de makron som finns i asm/io.h. Eller glömde du kanske #include <asm/io.h>.

Q3.

out*() gör ingenting, eller gör något konstigt.

A3.

Kolla ordningen på parametrarna; set skall vara outb(value, port), inte outb(port, value) som förekommer i MS-DOS.

Q4.

Jag vill köra en standard RS-232 device/parallel printer/joystick...

A4.

Då är det nog bäst att använda en befintlig driver (i Linux kernel eller en X-server eller någon annanstans) för detta. Drivrutinerna är vanligtvis mycket flexibla, så att även en icke­standard apparat fungerar vanligtvis med dem. Se info om standard portar ovan efter hänvisningar till dokumentation.


Nästa Föregående Innehållsförteckning