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:
- 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. - 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=UMBorDOS=HIGH,UMBinCONFIG.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.SYSto 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.BATto 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:For Novell ODI networks, these settings reside in[ELNK3] DriverName = ELNK3$ IOADDRESS = 0x300 INTERRUPT = 10 MAXTRANSMITS = 12NET.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.