How Windows 98 Managed PCI IRQ Steering
Microsoft Windows 98 managed hardware resources by implementing PCI IRQ Steering, a feature designed to prevent interrupt request (IRQ) conflicts by dynamically mapping and sharing interrupts among multiple PCI devices. In earlier PC architectures, the system was constrained by a limit of 16 hardware IRQs, which quickly became exhausted as expansion cards multiplied. Through PCI IRQ Steering, Windows 98 allowed multiple PCI devices to reliably share a single physical IRQ line without hardware conflicts, using system routing tables provided by the BIOS and motherboard chipset.
The Problem of IRQ Exhaustion
The legacy IBM PC/AT architecture provided only 16 hardware interrupt lines (IRQ 0 through 15), many of which were reserved for critical system components like the system timer (IRQ 0), keyboard (IRQ 1), and floppy/hard disk controllers (IRQ 6 and 14). With the advent of PCI expansion cards—such as network adapters, sound cards, and 3D accelerators—the demand for interrupts exceeded available slots. Without steering, assigning the same IRQ to multiple devices on an operating system without dynamic interrupt support would cause system freezes, performance drops, or device failure.
The Mechanism of PCI IRQ Steering
PCI devices do not inherently request standard system IRQs directly; instead, they signal interrupts using four dedicated physical pins: INTA, INTB, INTC, and INTD. The motherboard chipset contains an interrupt router that maps these four lines to the standard x86 interrupt lines (typically IRQ 9, 10, 11, or 12).
Windows 98 took control of this chipset router to manage interrupt assignments dynamically:
- Interrupt Sharing: The operating system placed multiple devices on the same hardware IRQ. When an interrupt was triggered, the Windows 98 kernel queried each device driver assigned to that IRQ sequentially until the device that generated the interrupt was serviced.
- Dynamic Reprogramming: If a new Plug and Play device was inserted, Windows 98 could reprogram the chipset's interrupt router to reassign IRQs on the fly, avoiding conflicts with legacy ISA devices that required dedicated, unshared IRQ lines.
BIOS Routing Tables in Windows 98
To assign IRQs accurately, Windows 98 queried the system BIOS to identify how physical PCI slots and onboard devices connected to the chipset router pins. Windows 98 supported four methods for reading these routing tables, prioritized in the following order:
- ACPI BIOS: If Advanced Configuration and Power Interface (ACPI) was supported and enabled, Windows 98 used ACPI tables to determine the board's routing.
- MS Specification Table: A routing table defined by Microsoft's PC 97/PC 98 hardware standards.
- Protected-Mode PCIBIOS 2.1 Call: A 32-bit protected-mode software interface provided by PCI BIOS 2.1 specifications.
- Real-Mode PCIBIOS 2.1 Call: A fallback 16-bit real-mode call used if protected-mode calls failed.
User Configuration via Device Manager
Windows 98 provided direct oversight and control of PCI steering via the Device Manager:
- Navigating to System Devices and opening properties for the PCI Bus revealed the IRQ Steering tab.
- Users could verify the operational status of steering (reported as "IRQ Steering Enabled").
- Users could toggle which BIOS routing tables Windows 98 was permitted to use. If an incompatible or buggy motherboard BIOS caused system instability, disabling specific routing options (or disabling IRQ steering entirely) allowed the system to fall back to the static IRQ assignments set during the initial BIOS POST.