我有一台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配置的算法如下:
端口0xcf8..0xcfb - 配置地址端口(双字)
比特意思:
所以,我写到总线 - 0,dev - 0,func - 1,reg - 00
我做错了吗?
(我从用户空间运行编译和链接的应用程序,GNU / Debian“Wheezy”Linux 3.11.6)
答案 0 :(得分:4)
默认情况下,Linux不允许用户区代码写入I / O端口。 (从安全角度来看,这样做可能非常危险。)如果您希望Linux让您的进程访问I / O端口,您有两种选择:
您可以使用ioperm
系统调用。但是,ioperm
已被弃用了一段时间,Josh Triplett最近pushed a patch允许用户将其从内核中删除。如果您希望代码在可预见的未来继续工作,请避免使用ioperm
。
您可以读取/写入/ dev / port。见mem(4)。显然,您的进程需要/ dev / mem的读写权限。在Wheezy上,这意味着它需要以root身份运行,除非您更改设备上的权限。