PCI Bios 2.1设备中断设置求助:强制分配IRQ-10至PCI插槽
问题描述
我有一台搭载1997年奔腾级主板、运行Win98系统的逻辑分析仪测试设备。主板为硬配置,BIOS可选项极少,板载少量PCI设备,还有一个原本未启用的PCI插槽。我已自行焊接PCI连接器和跳线,硬件层面插槽正常,安装的PCI网卡能被系统识别并分配资源,但BIOS无法自动为其分配中断,且无手动分配选项,BIOS更新也不可行。
我尝试编写小程序写入82371南桥的IRQ路由控制寄存器,初始读取状态如下:
A# - IRQ 11 B# - IRQ-NONE C# - IRQ-NONE D# - IRQ 9
经确认无路由表,IRQ11/9是仅有的PCI中断,且单功能LAN卡的A#中断输出物理连接至路由B#输入。写入后B#被设为未占用的IRQ10,读取显示写入成功,但不久后会被还原为IRQ-NONE。我已成功将中断控制器设置为电平触发,该更改可保留至下次开机。
现需解决两个问题:
- 如何强制将IRQ10固定分配至PCI插槽对应的路由B#输入?
- 如何调用PCI BIOS Rev 2.1规范中的SET_PCI_HW_INT函数(4.2.3节)?
解决方案
一、阻止IRQ路由寄存器被自动还原
直接写入南桥寄存器后被重置,大概率是系统服务、BIOS后台机制或驱动程序改写了寄存器。可以尝试以下方法:
- 编写DOS常驻内存程序(TSR):在Win98的实模式DOS环境下运行,定期检测IRQ路由寄存器状态,一旦发现B#被还原为IRQ-NONE就重新写入IRQ10。TSR会常驻内存持续维护寄存器值。
- 修改网卡驱动初始化代码:找到网卡驱动的初始化入口,加入写入南桥IRQ路由寄存器的代码,确保每次驱动加载时都重新设置正确的路由。
- 锁定南桥路由寄存器:查阅82371南桥数据手册,确认是否存在IRQ路由锁定寄存器。若有,在写入B#的IRQ10配置后,设置锁定位,防止后续被改写。
二、调用PCI BIOS的SET_PCI_HW_INT函数(汇编实现)
以下是该函数的中文参数说明及实模式汇编调用示例:
函数参数说明
入口参数:
AH= PCI功能ID(固定为0Bh,PCI BIOS规范定义)AL= SET_PCI_HW_INT功能码(固定为0Dh,对应规范4.2.3节)CL= IntPin参数:有效值0Ah~0Dh(对应PCI插槽的A#~D#中断引脚,0Ah=A#、0Bh=B#、0Ch=C#、0Dh=D#;你的网卡A#连接路由B#,因此此处填0Bh)CH= IRQNum参数:有效值0~0Fh(要设置IRQ10,此处填0Ah)BX= BusDev参数:BH为总线号(板载PCI总线通常为00h);BL的高5位是设备号,低3位是功能号(单功能网卡功能号为0,需根据实际设备号计算,比如设备号为5,则BL = (5 << 3) | 0 = 28h)DS= BIOS数据段选择子:实模式下设置为0F000h(对应物理地址0F0000h,满足64K地址限制)返回参数:
AH= 返回码:
00h(SUCCESSFUL):设置成功01h(SET_FAILED):设置失败02h(FUNC_NOT_SUPPORTED):BIOS不支持该功能CF= 完成状态:置位表示错误,清零表示成功
汇编代码示例(NASM编写,生成COM文件)
org 0x100 section .text start: ; 设置DS指向BIOS数据段0F000h mov ax, 0F000h mov ds, ax ; 填充PCI BIOS调用参数 mov ah, 0Bh ; PCI_FUNCTION_ID mov al, 0Dh ; SET_PCI_HW_INT功能码 mov cl, 0Bh ; 指定IntPin为B# mov ch, 0Ah ; 指定IRQ为10 mov bh, 00h ; 总线号为0 mov bl, 28h ; 设备号5,功能号0(根据实际设备号调整) ; 调用PCI BIOS中断1Ah int 1Ah ; 检查返回结果 jc error_handler ; CF置位说明调用出错 cmp ah, 00h je success_msg cmp ah, 02h je unsupported_msg error_handler: mov dx, err_msg jmp print_result success_msg: mov dx, ok_msg jmp print_result unsupported_msg: mov dx, no_support_msg print_result: ; DOS打印字符串功能调用 mov ah, 09h int 21h ; 退出程序 mov ah, 4Ch int 21h section .data ok_msg db 'IRQ 10分配成功!$' err_msg db 'IRQ分配失败!$' no_support_msg db 'BIOS不支持该PCI功能!$'
使用说明
- 用NASM编译:
nasm -f bin irq_setup.asm -o irq_setup.com - 在Win98中重启进入纯DOS模式,运行
irq_setup.com - 设备号获取方法:在Win98设备管理器中找到网卡,查看其PCI设备位置(如“总线0,设备5,功能0”),计算
BL值:(设备号 << 3) | 功能号,转为十六进制即可。
内容的提问来源于stack exchange,提问作者rfdes
相关产品推荐
相关产品推荐

