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