MSI 功能结构有一个基地址寄存器,其中包含设备必须写入的地址以生成消息信号中断。我知道这个地址是由根联合体写入的,但是它到底位于哪里?我应该在 RC 配置空间中寻找什么偏移量才能找到这个地址?
我问这个问题是因为不久前我的电脑因随机死机和蓝屏死机而“崩溃”。我开始使用我的 VGA PCI 设备配置空间,并将 MSI 功能结构(包含一个地址)清零;之后,我重新启动电脑,发现地址被清零了。尽管我像以前一样重写了寄存器,但在再次重新启动后,第一个地址没有回来。
这怎么可能?如何恢复地址?
考虑到MSI功能结构中的该地址应该发生在图形驱动程序初始化函数中(不确定是否也可能发生在PCIe枚举期间),如果您启动Linux等操作系统,您将看到它被写入了合适的地址。我怀疑您看不到它的原因是因为您是从 UEFI shell 中查看它,并且固件中包含的图形驱动程序非常基本并且不使用 MSI。