下一页 上一页 目录

8. 故障排除

Q1.

当我访问端口时,出现段错误。

A1.

要么你的程序没有 root 权限,要么 ioperm() 调用因其他原因失败。检查 ioperm() 的返回值。还要检查你是否真的在访问你用 ioperm() 启用的端口(参见 Q3)。如果你正在使用延迟宏(inb_p()outb_p() 等等),请记住调用 ioperm() 以获取端口 0x80 的访问权限。

Q2.

我找不到任何地方定义了 in*()out*() 函数,并且 gcc 抱怨未定义引用。

A2.

你编译时没有打开优化 (-O),因此 gcc 无法解析 asm/io.h 中的宏。或者你根本没有 #include <asm/io.h>

Q3.

out*() 没有执行任何操作,或者执行了一些奇怪的操作。

A3.

检查参数的顺序;它应该是 outb(value, port),而不是像 MS-DOS 中常见的那样 outportb(port, value)

Q4.

我想控制一个标准的 RS-232 设备/并行打印机/操纵杆...

A4.

你最好使用现有的驱动程序(在 Linux 内核中或 X 服务器中或其他地方)来执行此操作。驱动程序通常非常通用,因此即使是稍微非标准的设备通常也可以与它们一起工作。请参阅上面关于标准端口的信息,以获取指向其文档的指针。


下一页 上一页 目录