MS-DOS 6.22 Network Driver Resource Allocation

MS-DOS 6.22 manages system resources for resident network drivers primarily through real-mode memory management tools, configuration files, and static hardware assignments. Because the operating system lacks native dynamic resource arbitration and protected-mode virtualization, network drivers—such as those adhering to NDIS (Network Driver Interface Specification) or ODI (Open Data-Link Interface) standards—must be carefully allocated memory within conventional or upper memory blocks using HIMEM.SYS, EMM386.EXE, and the built-in optimization utility MEMMAKER.

Memory Architecture and the 640 KB Barrier

MS-DOS operates in 16-bit real mode, limiting the directly addressable workspace to 1 MB of memory. The lower 640 KB (conventional memory) is reserved for running applications and resident software, while the 384 KB area between 640 KB and 1 MB is known as the Upper Memory Area (UMA), typically reserved for video RAM, system BIOS, and adapter ROMs.

Network stacks present a distinct challenge because they consist of multiple layers:

  • The network interface card (NIC) hardware driver (e.g., an NDIS or packet driver).
  • Protocol manager software (e.g., PROTMAN.DOS).
  • Transport protocols (such as TCP/IP, IPX/SPX, or NetBEUI).
  • Resident redirectors or client software (e.g., Microsoft Network Client NET.EXE).

Loaded together, these components can consume anywhere from 50 KB to over 150 KB of RAM. If loaded into conventional memory, they severely limit the RAM available for user applications.

Upper Memory Allocation via HIMEM.SYS and EMM386.EXE

To preserve conventional memory, MS-DOS 6.22 reclaims unused regions in the UMA:

  1. HIMEM.SYS: Extends addressability beyond 1 MB (Extended Memory or XMS) and enables access to the High Memory Area (HMA)—the first 64 KB of extended memory where the MS-DOS kernel itself can be loaded via DOS=HIGH.
  2. EMM386.EXE: Scans the UMA on 80386 and later processors, identifies unused memory gaps, and maps extended memory into these gaps to create Upper Memory Blocks (UMBs). This requires DOS=UMB or DOS=HIGH,UMB in CONFIG.SYS.

Loading Drivers: DEVICEHIGH and LOADHIGH

Network components are loaded either as low-level device drivers via CONFIG.SYS or as Terminate-and-Stay-Resident (TSR) programs via AUTOEXEC.BAT.

  • DEVICEHIGH: Used in CONFIG.SYS to place initial network drivers into UMBs. For example:
    DEVICEHIGH=C:\NET\PROTMAN.DOS /I:C:\NET
    DEVICEHIGH=C:\NET\ELNK3.DOS
  • LOADHIGH (LH): Used in AUTOEXEC.BAT to launch TSR network services into UMBs:
    LH C:\NET\NET START

If an allocated UMB is too small to fit the driver during initialization, MS-DOS 6.22 automatically falls back and loads the driver into conventional memory. EMM386 supports region-specific loading (e.g., DEVICEHIGH /L:1,size), allowing administrators to target specific memory blocks based on the driver's transient initialization size versus its final resident size.

Automated Allocation with MemMaker

MS-DOS 6.22 includes MEMMAKER.EXE, an automated optimization utility. MemMaker analyzes the system's CONFIG.SYS and AUTOEXEC.BAT, tracks the resident memory footprint and temporary initialization memory required by each network driver, and computes the mathematical best-fit arrangement across available UMBs. It then rewrites the configuration files with explicit /L parameters to ensure maximum conventional memory remains free.

Hardware Resource Mapping (IRQs, I/O, and DMA)

MS-DOS 6.22 does not manage hardware resources such as Interrupt Requests (IRQs), Input/Output (I/O) base addresses, or Direct Memory Access (DMA) channels dynamically. Hardware allocation for network adapters is handled statically:

  • Hardware Configuration: Network cards are configured manually via jumpers, DIP switches, or EEPROM setup disks prior to booting DOS.
  • Driver Configuration Files: Drivers obtain hardware parameters through dedicated configuration files. For NDIS drivers, these parameters are defined in PROTOCOL.INI:
    [ELNK3]
      DriverName = ELNK3$
      IOADDRESS = 0x300
      INTERRUPT = 10
      MAXTRANSMITS = 12
    For Novell ODI networks, these settings reside in NET.CFG.

The network driver communicates directly with the designated I/O ports and hooks into the processor's interrupt vector table (IVT) in real mode, completely bypassing any dynamic arbitration from the operating system itself.