写入端口0cf8h失败并出现segfault

时间:2013-11-30 22:35:06

标签: linux assembly x86-64 pci

我有一台e2-2000型号的AMD处理器。这是家庭0fh。 根据家庭0fh BKDG我有这个代码来读取设备和供应商ID:

ReadPCIConfiguration:
movq    $0x80000100, %rax
movq    $0x0cf8, %rdx
outl    %eax, %dx          # sigsegv caught here
movq    $0x0cfc, %rdx
inl     %dx, %eax
ret

据我所知,读/写PCI配置的算法如下:

  • 将目标总线编号,设备编号功能编号和偏移或寄存器编号写入配置地址端口
  • 从/向配置数据端口
  • 执行1字节,2字节或4字节的r / w操作

端口0xcf8..0xcfb - 配置地址端口(双字)

比特意思:

  • 31 - EnReg - 启用交易(R / W)
  • 24..31 - 保留(R / O)
  • 16..23 - BusNum(R / W)
  • 11..15 - DevNum(R / W)
  • 8..10 - FuncNum(R / W)
  • 2..7 - RegNum(R / W)
  • 0..1 - 保留(R / O)

所以,我写到总线 - 0,dev - 0,func - 1,reg - 00

我做错了吗?

(我从用户空间运行编译和链接的应用程序,GNU / Debian“Wheezy”Linux 3.11.6)

1 个答案:

答案 0 :(得分:4)

默认情况下,Linux不允许用户区代码写入I / O端口。 (从安全角度来看,这样做可能非常危险。)如果您希望Linux让您的进程访问I / O端口,您有两种选择:

  1. 您可以使用ioperm系统调用。但是,ioperm已被弃用了一段时间,Josh Triplett最近pushed a patch允许用户将其从内核中删除。如果您希望代码在可预见的未来继续工作,请避免使用ioperm

  2. 您可以读取/写入/ dev / port。见mem(4)。显然,您的进程需要/ dev / mem的读写权限。在Wheezy上,这意味着它需要以root身份运行,除非您更改设备上的权限。