WINDOWS func 内核驱动程序如何与实际硬件通信?

How do WINDOWS func kernel drivers communicate with actual hardware?

所以我知道内核驱动程序位于硬件设备之上,然后通过用户 space 与设备通信,您需要通过 CreateFile && Read && Write 与内核驱动程序通信。我已经看过 Window 的内核驱动程序的设计及其示例代码,无论是 USB 还是 PCI 还是...

现在我想了解的是内核驱动是如何与硬件通信的?我们通常会在某个设备上找到负责 reading/writing 寄存器的驱动程序代码在哪里?驱动程序与设备通信需要什么?有人告诉我,是 BAR0 值将硬件映射到虚拟内存区域,这意味着我们想要在物理设备上访问的任何地址都将从该地址开始。那是对的吗?如果我有 BAR0 = 0xfc500000,我是否必须在设备上找到某个寄存器的地址然后将其添加为偏移量?

驱动程序需要从 OS 获取硬件资源。在 PCI 设备示例中,您将获得 MMIO 地址和中断向量。 MMIO 地址是 PCI 控制器的物理地址,BIOS 也映射设备。

驱动程序在 EvtPepareHardware callback (in KMDF) and then need to map it to kernel Virtual address using MmMapIoSpace() 中获取此值。 一旦获得内核虚拟地址,理论上它就是指向硬件内存的“指针”space,您可以随意访问寄存器。

但建议使用 HAL 宏来消除缓存和访问该内存的其他问题。例如READ_REGISTER_ULONG64

查找注册硬件设备规范的地址

有关更多信息,请阅读此“Reading and Writing to Device Registers