【问题标题】:Easy way to access Intel CPU I/O registers in Windows在 Windows 中访问 Intel CPU I/O 寄存器的简单方法
【发布时间】:2012-11-20 14:42:24
【问题描述】:

我使用需要 256 字节 TLP 有效负载大小的 PCIe 板。我的 CPU 支持(Core i7-3930K)和英特尔主板,DX79SR 不提供 BIOS 中的 TLP 有效负载大小设置。 默认情况下,最大 TLP 有效负载为 128 字节,我需要将其更改为 256 字节,无需 BIOS。我发现 PCIUtils 软件可以在 Windows 中显示此值,但它是一款多功能便携式软件,而且太复杂了,无法找到我需要的东西。

Intel文档describe what values我需要在CPU I/O寄存器中设置,有another document说I/O位置是C8Fh和CFCh。

这就是我卡住的地方,如果我想设置这些寄存器,我不知道从哪里开始。 我是一位经验丰富的 Windows S/W 开发人员,但我从未处理过驱动程序。我确实有这个 PCIe 板驱动程序的源代码,我可以修改、构建和运行,但我不知道如何将数据写入英特尔 CPU 的 I/O 寄存器。我发现 _outp() 函数在用户模式下不起作用。

请指出从哪里开始,从可执行文件(更简单)或驱动程序开始。如果我没记错的话,我认为我需要做的就是从 I/O 端口 C8Fh 和 CFCh 读/写。现在是 Windows XP 32 位,Win7 x64 将在以后,Visual Studio 2010 C++ 或 WDK。

【问题讨论】:

    标签: c++ windows io intel


    【解决方案1】:

    基本上你要做的就是使用out,分别使用in x86 asm 指令。问题是在保护模式下,这两条指令被锁定,因此您无法在用户态模式下使用它们。

    最好的起点是获取 WDK(Windows 驱动程序套件)并查看他们的示例(您只需要一个软件驱动程序即可)。如果 PCI 板的驱动程序是内核模式驱动程序,尽管您可以在 DriverEntry 函数中添加调用并完成它。

    如果这不是一个选项,您将不得不构建自己的软件内核模式驱动程序 - here 是一些简单的示例代码,其中包含有关如何构建和部署驱动程序的说明。实际代码应该很简单,因为您只想在内核模式下执行一些指令。

    【讨论】:

    • 谢谢。我确实有 WDK,我可以为这块板编译驱动程序,然后它就可以工作了。我当然可以看到驱动程序条目,但我不知道驱动程序是在内核模式下工作还是在用户模式下工作。我对司机很陌生。所以,您是说在驱动程序加载时调用的驱动程序主函数中,我可以尝试 _inp(),设置我的位,然后只需 _outp(0xC8F.mydata),其中 0xC8F 是英特尔文档中的位置,对吧?
    • @user1871691 几乎是的。如果您的代码具有使用 KMDF 的 DriverEntry 方法,则该方法对于用户模式驱动程序 afaik 的调用方式不同(尽管从未使用过)。更新代码应该很简单。
    • 非常感谢。那行得通。我在 DriverEntry 中放了 4 行:_outpd(0xCF8,0x80000098);唯一的窍门是我必须为两个设备设置寄存器。我的 PCIe 插槽有地址总线:0 设备:1 功能:0,但我还必须为总线设置 TLP 大小:0 设备:0 功能:0(我猜是一些通用设备)
    • 直接从 Windows 驱动程序访问 PCI 配置寄存器恕我直言,这是一种非常丑陋的黑客行为,并且不能保证始终有效。您需要使用 Windows PCI 堆栈来为您执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2011-09-20
    • 2011-03-31
    • 2010-12-29
    • 2014-10-23
    相关资源
    最近更新 更多