8. Troubleshooting
- Q1.
I get segmentation faults when accessing ports.
- A1.
Either your program does not have root privileges, or the
ioperm()
call failed for some other reason. Check the return value ofioperm()
. Also, check that you're actually accessing the ports that you enabled withioperm()
(see Q3). If you're using the delaying macros (inb_p()
,outb_p()
, and so on), remember to callioperm()
to get access to port 0x80 too.- Q2.
I can't find the
in*()
,out*()
functions defined anywhere, and gcc complains about undefined references.- A2.
You did not compile with optimisation turned on (
-O
), and thus gcc could not resolve the macros inasm/io.h
. Or you did not#include <asm/io.h>
at all.- Q3.
out*()
doesn't do anything, or does something weird.- A3.
Check the order of the parameters; it should be
outb(value, port)
, notoutportb(port, value)
as is common in MS-DOS.- Q4.
I want to control a standard RS-232 device/parallel printer/joystick...
- A4.
You're probably better off using existing drivers (in the Linux kernel or an X server or somewhere else) to do it. The drivers are usually quite versatile, so even slightly non-standard devices usually work with them. See the information on standard ports above for pointers to documentation for them.
Next Previous Contents