You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。我已成功将中断控制器设置为电平触发,该更改可保留至下次开机。

现需解决两个问题:

  1. 如何强制将IRQ10固定分配至PCI插槽对应的路由B#输入?
  2. 如何调用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功能!$'

使用说明

  1. 用NASM编译:nasm -f bin irq_setup.asm -o irq_setup.com
  2. 在Win98中重启进入纯DOS模式,运行irq_setup.com
  3. 设备号获取方法:在Win98设备管理器中找到网卡,查看其PCI设备位置(如“总线0,设备5,功能0”),计算BL值:(设备号 << 3) | 功能号,转为十六进制即可。

内容的提问来源于stack exchange,提问作者rfdes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:40:04