c-在DOS模式下实现消息信号中断



我在编程设备上有点卡住了MSI(消息信号中断)欢迎任何指针(我的环境是Watcom C++DOS/32a-DOS扩展器,在平面模式下…)

@PIC(8259)模式对我来说可以…

我在下面列出了我所做的事情,也许有人可以帮助澄清这些。。。谢谢

(1)多消息启用=0(对于单个MSI设置,此字段=0;MMC=100b)

(2)对于MSI功能中的MSI消息地址寄存器

  • 位[31:20]=0xFEE
  • bit[19:12]=0(目的地ID,发现本地APIC ID=0…)
  • bit3=0(重定向提示=0)
  • bit2=0(目的地模式,不在乎,因为RH=0)

(3)对于MSI功能中的MSI消息数据寄存器

  • bit15=0(触发模式=边缘)
  • bit14=0(触发级别,如果触发模式=边缘,则忽略)
  • bit[10:8]=000(传送模式=固定)
  • bit[7:0]=0x20(矢量,我选择使用0x20)

(4)通过设置MSICAP.MC.MSIE=1 最终启用MSI

  1. 我已经大致阅读了文档(第10章)http://download.intel.com/products/processor/manual/253668.pdf
  2. 我认为没有必要对IO APIC和本地APIC寄存器进行编程,因为MSI不路由到APIC系统

当前状态: 启用MSIE=1后,我发现系统挂起,设备通过MSI生成中断!

注意:在上面的序列中,服务例程没有安装,因为我不知道如何安装…(这是我的应用程序挂起的原因吗?)

谢谢!

[20120822更新]消息数据字段中的矢量设置为0x20时,应用程序挂起。。。但如果设置为0x76,我发现应用程序没有挂起,然后我可以检查设备是否生成中断,本地APIC是否接收到如下中断消息:

  1. 对于PCI设备(AHCI控制器):

    • ID(中断禁用)=0
    • IS(中断状态)=0
    • MSI上限=09,FEE-00000000000076
  2. 对于AHCI HBA寄存器:

    • PxIS=00000023
    • PxIE=7DC0007F
    • 等于00000001
    • IE位1=1

通过1和2,我认为设备成功地将消息发送到请求服务,因为:

  • IS位0=1(端口0具有挂起的中断状态)
  • IE(中断启用)=1
  • PCI命令寄存器位10(ID)=0
  • MSICAP.MC.MSIE=1(到MSI引擎)

此外,我发现LAPIC收到这个中断消息是因为:

  • 本地APIC IRR(中断请求寄存器)位118(=0x76)=1
  • 本地APIC ISR(服务中寄存器)位118(=0x76)=1

因此,设备似乎生成了中断,而本地APIC接收到了该中断;即便如此,我的服务程序也没有被调用!

要在DOS模式下实现MSI功能,可以参考以下序列:

检查本地APIC是否已启用

  1. 读取CPU MSR 0x1B,检查本地APIC全局启用/禁用位是否为1
  2. 读取本地APIC寄存器杂散中断矢量寄存器位8(APIC SW启用/禁用)=1

初始化MSI功能寄存器

  1. 配置消息控制寄存器(例如MME…)
  2. 配置消息地址寄存器(例如目的地ID、DM和RH)
  3. 配置消息数据寄存器(例如触发器模式、断言、传递模式和矢量)

安装您自己的服务程序

  • 这取决于您使用的编译器/编程语言
  • 以(Watcom C++Dos32a)为例,您可以使用下面的声明和安装服务例程
  • 使用__interrupt__far声明和创建YourISR
  • 使用DPMI调用0x204/0x205来获取(旧的)和设置(新的)中断向量

注意:

  1. 消息数据寄存器中的中断矢量可以是例如0x70,0x71,。。。,或0x76
  2. 在ISR结束和返回之前,请"写入"本地APIC寄存器(EOI),然后LAPIC将清除服务中寄存器中的位,然后准备服务另一个中断

允许设备通过MSI请求服务

  1. PCI命令寄存器位10(ID)=0
  2. 设备的中断启用位=1(设备特定)
  3. mscap。MC.MSIE=1(中断路由到MSI引擎)

您可以检查设备是否生成请求,并且LAPIC是否收到此请求

  • 设备将发出PCI DWORD写入事务,将32位数据写入32位内存地址,因此您可以探测LA是否发生这种情况,也可以检查(ID=0&中断状态!=0&aamp;MSIE=1)
  • 检查LAPIC寄存器IRR和ISR,看看请求是否由LAPIC接收和服务

@参考文献:

英特尔64和IA-32体系结构软件开发人员手册

APIC

PCI本地总线规范v2.2

访问CPU MSR

DOS/32高级

最新更新