【发布时间】:2013-11-30 22:35:06
【问题描述】:
我有一个 e2-2000 型号的 AMD 处理器。这是家庭 0fh。 根据family 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 字节读/写操作
Ports 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)
所以,我写到 bus - 0, dev - 0, func - 1, reg - 00
我做错了吗?
(我从用户空间运行编译和链接的应用程序,GNU/Debian "Wheezy" Linux 3.11.6)
【问题讨论】:
-
我不是硬件专家,但操作系统可能不允许您直接写入端口?绝对有一个系统调用,以确保只有具有正确权限的进程才能这样做。
-
也许你是对的。但问题是,将来代码应该在操作系统启动时运行(以重新配置系统内存映射),我想至少测试代码的读取访问权限和读取正确性。
-
虚拟化它?在 virtualbox 内的操作系统之前运行它。由于没有操作系统,那肯定不会出现段错误,但我不知道你的代码是做什么的!
-
我明白了。我发现一个解决方案是一个名为
ioperm和iopl的电话。也许我应该删除这个问题?