當我存取 I/O 埠時結果碰到 segmentation faults 這個問題
不是你的程式沒有 root 權限, 就是因為某些理由導致函式 ioperm()
呼叫失敗. 檢查函式 ioperm()
的傳回值. 同時, 檢查你所存取的埠也就是你以
函式 ioperm()
所啟用的埠位址 (參考 Q3).
如果你使用的是延遲時間的巨集指令 (inb_p()
, outb_p()
, 等等),
記得也要呼叫函式 ioperm()
以便存取埠位址 0x80.
我無法找到 in*()
, out*()
等函式被定義在何處,
同時 gcc 也抱怨參考到未定義的符號 (undefined references).
你在編譯程式時沒有打開最佳化選項 (-O
),
因此 gcc 不能解析 asm/io.h
中的巨集指令.
或是你根本就沒有使用 #include <asm/io.h>
.
out*()
沒有動作, 或是動作怪怪的.
檢查參數所放置的次序; 他應該是這樣 outb(value, port)
,
而不是 MS-DOS 上常用的那樣 outportb(port, value)
我想要控制一個標準的 RS-232 裝置/連接並列埠的印表機/操縱桿...
你最好能停止此事而使用現有的驅動程式 (他們存在於 Linux 的核心中或 X 伺服器中或其他的地方) 來達成你的目標. 這些驅動程式通常相當具通用性, 所以就算是有點不標準的裝置, 他們通常都能正常運作. 這些標準 I/O 埠的相關資訊請參考前面說過的文件指引.