How Windows 98 Managed PCI IRQ Sharing
Microsoft Windows 98 resolved hardware interrupt resource shortages by implementing PCI Bus IRQ Steering, an operating system-level mechanism that allowed multiple PCI devices to safely share a single interrupt request (IRQ) line. Prior to this, the standard PC architecture was constrained to 16 ISA interrupts, leading to frequent device conflicts as add-in cards proliferated. By working alongside the motherboard chipset and system BIOS, Windows 98 dynamically mapped PCI interrupt pins to available system IRQs, verified routing tables, and maintained interrupt service chains to ensure stable, conflict-free hardware performance.
The Problem with Legacy IRQ Architecture
In legacy x86 architecture, the Intel 8259 Programmable Interrupt Controller (PIC) provided only 16 hardware interrupts (IRQ 0 through IRQ 15), many of which were permanently reserved for system devices like the system timer, keyboard, floppy drive, and real-time clock. Legacy ISA cards required dedicated, edge-triggered interrupts, meaning no two devices could reliably share the same IRQ line without causing system freezes.
The PCI standard introduced level-triggered interrupts across four physical lines (INTA#, INTB#, INTC#, and INTD#), which made IRQ sharing electrically viable. However, these PCI lines still needed to map back to the computer's 16 system IRQs, requiring an intelligent management system at both the hardware and software layers.
Introduction of PCI Bus IRQ Steering
Windows 98 addressed this bottleneck through PCI Bus IRQ Steering. Instead of relying solely on a static BIOS assignment at boot, Windows 98 took control of remapping and assigning interrupts. If multiple PCI cards or integrated motherboard controllers (such as audio, USB, and network adapters) required resources, Windows 98 could allocate several devices to the same ISA-compatible IRQ—for example, placing a sound card, USB host controller, and network card all on IRQ 11.
BIOS Routing Tables and the $PIR Specification
To steer interrupts without causing hardware conflicts, Windows 98 needed an accurate physical map of how the motherboard’s PCI slots and integrated chips were wired to the interrupt router. The operating system achieved this by reading specific BIOS tables:
- ACPI Tables: In systems with early ACPI support, Windows 98 queried ACPI BIOS tables to determine interrupt routing.
- **\(PIR Table (Microsoft PCI IRQ Routing Table):** For non-ACPI systems, Windows 98 read the `\)PIR` table embedded in the BIOS memory, which described the motherboard's wiring matrix and available interrupt router links.
- PCI BIOS 2.1 Calls: If table-reading methods failed, Windows fell back to real-mode or protected-mode BIOS interrupt interface calls.
Once Windows 98 read the hardware routing map, it programmed the motherboard’s PCI interrupt router (typically integrated into the southbridge) to bind specific PCI interrupt lines to chosen system IRQs.
Handling the Interrupt Chain
When multiple PCI devices share an IRQ, triggering that line generates a single interrupt event for the CPU. Windows 98 handled this using an interrupt chain:
- The operating system registered the device drivers of all components sharing the IRQ in a sequential list.
- When an interrupt occurred, Windows 98 invoked the interrupt service routine (ISR) of each driver down the chain.
- Each driver polled its respective hardware to check if it had asserted the interrupt.
- If the hardware triggered the signal, the driver serviced the request and cleared the device's interrupt status bit; if not, the driver passed execution to the next device in the chain.
Because PCI interrupts are level-triggered, the line remained asserted until the responsible device cleared it, eliminating the risk of dropped signals common in older edge-triggered systems.
Troubleshooting and Configuration in Windows 98
Windows 98 exposed IRQ steering controls inside the Device Manager. Users could inspect and configure the feature by opening the properties of the PCI bus system device under the IRQ Steering tab:
- Use IRQ Steering: A master checkbox allowing users to enable or disable OS-level routing.
- Routing Table Selection: Options to prioritize
ACPI, the MS Specification Table, or standard BIOS calls. If a
motherboard possessed a buggy or corrupted
$PIRtable, disabling specific lookup methods forced Windows 98 to rely on safer fallbacks.
If IRQ Steering was disabled or unsupported by the motherboard chipset, Windows 98 defaulted to the static interrupt assignments provided by the BIOS POST routine, significantly increasing the likelihood of resource conflicts.