在Windows中访问英特尔CPU I/O寄存器的简便方法
Easy way to access Intel CPU I/O registers in Windows
我使用需要256字节TLP有效负载大小的PCIe板。我有支持它的CPU(酷睿i7-3930K)和英特尔主板DX79SR,它在BIOS中不提供TLP有效负载大小设置。默认情况下,最大TLP负载为128字节,我需要将其更改为256字节,而不需要BIOS。我发现PCIUtils软件可以在Windows中显示这个值,但它是一个多用途的便携式软件,太复杂了,找不到我需要的东西。
英特尔文档描述了我需要在CPU I/O寄存器中设置的值,还有另一个文档说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。
基本上,您要做的就是分别使用out
和in
x86 asm指令。问题是,在受保护模式下,这两条指令被锁定,因此您无法在userland模式下使用它们。
最好的起点是获得WDK(windows驱动程序套件)并查看它们的示例(您只需要一个软件驱动程序)。如果PCI板的驱动程序是内核模式的驱动程序,尽管你可以在DriverEntry
函数中添加调用并完成它
如果这不是一个选项,您将不得不构建自己的软件内核模式驱动程序——以下是一些简单的示例代码,其中包含如何构建和部署驱动程序的说明。实际的代码应该是琐碎的,因为您只想在内核模式下执行一些指令。
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- CPU寄存器中返回的用户定义类型的C 对象.实例方法如何工作
- 内联类方法的寄存器优化不足
- 在Windows中访问英特尔CPU I/O寄存器的简便方法
- 有没有一种方法可以利用所有的XMM寄存器