Next Previous Contents

8. 问题排除

Q1.

当我存取 I/O 埠时结果碰到 segmentation faults 这个问题

A1.

不是你的程式没有 root 权限, 就是因为某些理由导致函式 ioperm() 呼叫失败. 检查函式 ioperm() 的传回值. 同时, 检查你所存取的埠也就是你以 函式 ioperm() 所启用的埠位址 (参考 Q3). 如果你使用的是延迟时间的巨集指令 (inb_p(), outb_p(), 等等), 记得也要呼叫函式 ioperm() 以便存取埠位址 0x80.

Q2.

我无法找到 in*(), out*() 等函式被定义在何处, 同时 gcc 也抱怨参考到未定义的符号 (undefined references).

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 伺服器中或其他的地方) 来达成你的目标. 这些驱动程式通常相当具通用性, 所以就算是有点不标准的装置, 他们通常都能正常运作. 这些标准 I/O 埠的相关资讯请参考前面说过的文件指引.


Next Previous Contents