How Windows 95 Solved PCI and ISA IRQ Conflicts

During the mid-1990s personal computer transition, Windows 95 solved interrupt request (IRQ) conflicts between legacy Industry Standard Architecture (ISA) cards and modern Peripheral Component Interconnect (PCI) cards through hardware arbitration, the Plug and Play (PnP) Configuration Manager, and PCI IRQ Steering. By prioritizing non-negotiable ISA resources, utilizing motherboard routing tables, and enabling interrupt sharing on the PCI bus, the operating system automated what was previously a manual, error-prone configuration process.

The x86 PC architecture was historically limited to 16 IRQ lines (IRQs 0–15), with over half permanently reserved for core system functions like the system timer, keyboard, real-time clock, and floppy controller. Legacy ISA expansion cards were edge-triggered and generally incapable of sharing interrupts. They required exclusive IRQ lines, which users had to configure manually using physical jumpers or DIP switches. When the faster PCI bus entered the market, it allowed systems to house both ISA and PCI cards simultaneously, quickly leading to resource exhaustion and hardware collisions.

Windows 95 introduced the Plug and Play architecture, centered around an internal component called the Configuration Manager. During the boot sequence, the Configuration Manager coordinated with the system BIOS to enumerate all connected devices and construct an internal hardware tree. Because legacy ISA cards could not communicate their resource needs, Windows 95 relied on the user or the BIOS to declare these devices. Users could mark specific IRQs as "Reserved" within the Windows 95 Device Manager, forcing the operating system to treat those lines as unavailable to any other hardware.

After fixed ISA resources were locked down, Windows 95 addressed the remaining PCI devices using PCI IRQ Steering, a feature introduced and refined throughout the Windows 95 release cycle, particularly in OEM Service Release 2 (OSR2). PCI cards connect to the bus using four internal interrupt lines: INTA#, INTB#, INTC#, and INTD#. Through an onboard hardware component known as the PCI interrupt router, the operating system used the PCI BIOS or the PCI Interrupt Routing Table ($PIR table) to map these four internal lines to whatever standard ISA-compatible IRQs were left unoccupied.

Crucially, PCI interrupts are level-triggered rather than edge-triggered, making them electronically capable of sharing a single IRQ line among multiple PCI devices. When multiple PCI cards were assigned to the same IRQ, Windows 95 created an interrupt service routine (ISR) chain. When an interrupt fired on a shared line, Windows 95 polled each registered PCI device in sequence to determine which card requested attention.

By prioritizing fixed ISA interrupts first, dynamically rerouting PCI interrupts around them, and chaining shared PCI devices onto remaining lines, Windows 95 allowed legacy hardware to function alongside newer components without hardware deadlocks.