当我存取 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 埠的相关信息请参考前面说过的文件指引.