首页 文章

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

提问于
浏览
3

我有点卡在编程设备 MSI(Message Signaled interrupt) 并且任何指针欢迎...(我的环境是Watcom C DOS / 32a - dos扩展程序,在 flat 模式......)

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

我列出了我的工作如下,也许有人可以帮助澄清这些...谢谢!

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

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

  • 位[31:20] = 0xFEE

  • 位[19:12] = 0(目标ID,找到本地APIC ID = 0 ......)

  • bit3 = 0(重定向提示= 0)

  • bit2 = 0(目的地模式,因RH = 0而不在乎)

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

  • bit15 = 0(触发模式=边缘)

  • bit14 = 0(触发电平,如果触发模式=边沿则忽略)

  • 位[10:8] = 000(交货方式=固定)

  • 位[7:0] = 0x20(向量,我选择使用0x20)

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

Current status: 我在启用MSIE = 1后发现系统挂起,设备通过MSI生成中断!

注意:在上面的序列中 service routine is NOT installed 因为我不知道怎么做...(这就是我的应用程序挂起的原因吗?)

谢谢 !

[20120822 updated] 当将 Message Data 字段中的向量设置为0x20时,应用程序挂起...但是如果设置为0x76,我发现应用程序没有挂起,然后我可以检查设备是否生成中断,本地APIC收到此中断消息,如下所示:

  • For PCI device(AHCI controller):

  • ID(中断禁用)= 0

  • IS(中断状态)= 0

  • MSI Cap = 09,FEE00000,00000076

  • For AHCI HBA registers:

  • PxIS = 00000023

  • PxIE = 7DC0007F

  • IS = 00000001

  • IE bit1 = 1

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

  • IS bit0 = 1(端口0具有待处理的中断状态)

  • IE(中断使能)= 1

  • PCI命令寄存器bit10(ID)= 0

  • MSICAP.MC.MSIE = 1(到MSI引擎)

我还发现LAPIC收到此中断消息,因为:

  • 本地APIC IRR(中断请求寄存器)bit118(= 0x76)= 1

  • 本地APIC ISR(服务中寄存器)bit118(= 0x76)= 1

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

1 回答

  • 2

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

    检查是否启用了本地APIC

    • 读取CPU MSR 0x1B并检查本地APIC全局启用/禁用位= 1

    • 读取本地APIC寄存器寄生中断向量寄存器bit8(APIC SW使能/禁止)= 1

    初始化MSI功能寄存器

    • 配置消息控制寄存器(例如MME ...)

    • 配置消息地址寄存器(例如目标ID,DM和RH)

    • 配置消息数据寄存器(例如触发模式,断言,传送模式和向量)

    安装自己的服务例程

    • 这取决于你使用的编译器/编程语言......

    • 以(Watcom C Dos32a)为例,您可以使用以下声明和安装服务例程

    • 使用__interrupt __far声明并创建YourISR

    • 使用DPMI调用0x204 / 0x205获取(旧)和设置(新)中断向量!

    笔记:

    • 消息数据寄存器中的中断向量可以是Ex . 0x70,0x71,...或0x76

    • 在ISR结束时和返回之前请"write"本地APIC寄存器(EOI)“然后LAPIC将清除服务中寄存器中的位,然后准备服务另一个中断!

    启用设备以通过MSI请求服务

    • PCI命令寄存器bit10(ID)= 0

    • 设备的中断使能位= 1(特定于器件)

    • MSICAP.MC.MSIE = 1(中断路由到MSI引擎)

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

    • 设备将发出PCI DWORD写入事务以将32位数据写入32位存储器地址,因此您可以探测LA是否发生这种情况,或者您可以检查是否(ID = 0 &&中断状态!= 0 && MSIE = 1)

    • 检查LAPIC寄存器IRR和ISR以查看LAPIC是否收到并提供服务!

    @ References:

    Intel 64 and IA-32 Architectures Software Developer Manuals

    APIC

    PCI Local Bus Specification v2.2

    Access CPU MSR

    DOS/32 Advanced

相关问题