gpt4 book ai didi

linux - 写入端口 0cf8h 失败并出现段错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:41 26 4
gpt4 key购买 nike

我有一个 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 字节读/写操作

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

位含义:

  • 31 - EnReg - 启用交易(读/写)
  • 24..31 - 保留(R/O)
  • 16..23 - 总线编号(读/写)
  • 11..15 - 开发编号(读/写)
  • 8..10 - FuncNum(读/写)
  • 2..7 - 注册号(读/写)
  • 0..1 - 保留(R/O)

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

我做错了什么吗?

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

最佳答案

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

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

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

关于linux - 写入端口 0cf8h 失败并出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com