EMM386.EXE
개요
EMM386.EXE는 80386 이상의 CPU에서 동작하는 MS-DOS용 확장 메모리 관리자이다. 확장 메모리(XMS)를 기반으로 EMS(Expanded Memory)를 에뮬레이트하고, 상위 메모리 영역(UMA)에 존재하는 빈 공간을 스캔하여 UMB(Upper Memory Block)를 제공한다.
이 구조를 통해 도스 응용 프로그램이 사용할 수 있는 기본 메모리(Conventional Memory, 640KB)를 최대한 확보할 수 있다.
EMM386은 CPU의 가상 8086 모드와 MMU(Page Table)를 이용해 물리 주소 1MB 이상(XMS 영역)을 UMA로 "매핑"하여 사용하는 방식으로 동작하며, EMM386 로딩 전에는 반드시 HIMEM.SYS가 먼저 로드되어 있어야 한다.
MS-DOS 5.0부터 EXE 형태로 제공되었으며 Windows/386 · Windows 3.x의 ‘386 향상 모드’ 환경에서도 사용되었다.
역사
초기
- 1986년 Compaq Deskpro 386용 OEM DOS에 포함된 CEMM이 기술적 기반.
- 1987년 Windows/386 2.0에서 Microsoft 버전 EMS 관리자가 등장.
- 1988년 MS-DOS 4.0에서 EMM386.SYS로 제공.
MS-DOS 5.0 이후
1991년 MS-DOS 5.0에서 EMM386.EXE로 재구성되며 다음 기능을 제공:
- EMS 지원
- UMB 지원
- XMS ↔ EMS 동적 변환
- v8086 기반 메모리 가상화
- 세밀한 메모리 영역 제어 옵션 지원
이후 DOS 6.x 및 Windows 3.x/9x와 함께 지속적으로 개선되었다.
버전 기록
| 함께 제공된 제품 | 날짜 | 파일명 | 버전 |
|---|---|---|---|
| MS-DOS 4.01 | 1988-11 | EMM386.SYS | 4.00 |
| Windows 3.0 | 1990-05 | EMM386.SYS | 4.10.0419 |
| MS-DOS 5.0 / PC DOS 5.0 | 1991-06 | EMM386.EXE | 4.20.06x |
| PC DOS 5.02 / MS-DOS 5.00a | 1992-09 | EMM386.EXE | 4.33 |
| Windows 3.1 / WfW 3.1 | 1992 | EMM386.EXE | 4.44 |
| MS-DOS 6.0 / PC DOS 6.1 | 1993 | EMM386.EXE | 4.45 |
| MS-DOS 6.2 / 6.21 / PC DOS 6.3 / WfW 3.11 | 1993~1994 | EMM386.EXE | 4.48 |
| MS-DOS 6.22 | 1994-06 | EMM386.EXE | 4.49 |
| IBM PC DOS 7.0 / PC DOS 2000 | 1995~1998 | EMM386.EXE | 4.50 |
| Windows 95 / 98 | 1995~1998 | EMM386.EXE | 4.95 |
작동 원리
가상 8086 모드
EMM386은 CPU의 가상 8086 모드를 사용하여 도스 프로그램의 메모리 접근을 MMU(Page Table)를 통해 제어한다. 이를 통해 1MB 이상의 실제 물리 주소(XMS 영역)를 상위 메모리 영역처럼 보이도록 매핑할 수 있다.
HIMEM.SYS와의 관계
HIMEM.SYS가 XMS의 기본 관리 역할을 담당하고, EMM386.EXE는 HIMEM.SYS가 제공하는 XMS를 기반으로
- EMS 생성
- UMB 생성
- 페이지 프레임 관리
등을 수행한다.
EMS/XMS 동적 전환
공식 HELP 문서의 핵심 설명에 따르면:
- MIN=값 : 항상 확보해둘 EMS 용량
- MEMORY=값 : 필요 시 XMS를 EMS로 변환해 최대 제공할 수 있는 용량
- EMS 필요 프로그램 실행 시
→ EMM386은 즉시 XMS 일부를 EMS로 변환하여 제공
- 프로그램 종료 시
→ 다시 EMS를 해제하여 XMS로 반환
즉, EMS는 “항상 고정된 크기”가 아니라 XMS와 동적으로 전환되며 작동한다.
MIN=0 동작
MIN=0 설정 시,
- EMS는 “상시 예약되지 않음”
- 프로그램이 EMS 요청 시에만 XMS를 EMS로 변환
- 하지만 이미 XMS가 모두 사용 중이면 EMS 생성 실패 가능
이 내용은 DOS 메모리 최적화에서 매우 중요한 포인트다.
Windows와의 관계
386 향상 모드
Windows 3.x/9x의 Enhanced Mode가 시작되면 Windows의 보호 모드 VMM이 EMM386 기능을 인계받으며, EMM386.EXE는 일시 중단된다.
GEMMIS API
Windows는 EMM386과 상호작용하기 위해 GEMMIS(Global EMM Import Specification)를 사용한다.
이를 지원하는 EMS 관리자는:
- Microsoft EMM386
- Quarterdeck QEMM
- Qualitas 386MAX
- Helix Netroom
FreeDOS의 JEMM386/JEMMEX는 GEMMIS를 지원하지 않으며 Windows 3.x Enhanced Mode 실행이 불가능하다.
SYSTEM.INI 우선순위
공식 HELP 문서에 따르면:
- EMM386의 옵션(I, X, FRAME 등)은
**SYSTEM.INI의 EMMINCLUDE / EMMEXCLUDE / EMMPAGEFRAME보다 우선한다.**
즉, Windows 측 설정으로는 EMM386의 CONFIG.SYS 설정을 덮어쓰기할 수 없다.
SCSI/ESDI 및 /DOUBLE_BUFFER =
SCSI·ESDI HDD를 사용하는 경우 UMB/EMS 사용 시 DMA 주소 문제 때문에 SMARTDRV /DOUBLE_BUFFER 옵션이 필요할 수 있다.
이는 데이터 전송을 안정시키기 위한 필수 설정일 수 있으며 특히 1990년대 SCSI 카드 사용자 환경에서 널리 사용되었다.
EMM386.EXE의 주요 옵션
ON / OFF / AUTO
ON: EMS·UMB 활성 OFF: 비활성 AUTO: 프로그램 요청 시에만 EMS/UMB 활성
memory
EMS/VCPI 최대 제공량(KB). NOEMS 사용 시 기본값 0.
MIN=size
고정적으로 예약할 EMS 최소 크기.
NOEMS
EMS 비활성화. UMB는 제공되며 상위 메모리를 최대 확보할 때 많이 사용된다. 단, EMS 기반 프로그램은 동작하지 않을 수 있다.
RAM
EMS 제공 + UMB 제공 단, 페이지 프레임을 확보해야 하므로 NOEMS보다 UMB가 적게 확보된다.
FRAME / Mx / Pn
EMS 페이지 프레임 주소 또는 개별 페이지 주소 지정.
공식 HELP 예제:
device=emm386.exe 512 p0=d000 p1=d400 p2=d800 p3=dc00
X=mmmm-nnnn / I=mmmm-nnnn
상위 메모리 사용/제외 범위 지정.
HIGHSCAN
EMA/UMB 추가 스캔 실시. 하지만 잘못된 영역을 사용 가능하다고 판단하여 시스템이 멈출 위험이 있으므로 고급 사용자 전용 옵션이다.
NOHI
EMM386 일부를 UMB에 올리지 않음. → 기본 메모리 감소 → UMB 확보 증가
ROM=range
Shadow RAM 구성.
NOVCPI
VCPI 비활성(반드시 NOEMS와 함께).
WIN=range
Windows에서 사용할 UMA 영역 예약.
NOMOVEXBDA
EBDA를 UMB로 이동시키지 않음. 특정 VGA BIOS, 네트워크 ROM과의 충돌을 방지할 때 사용.
ALTBOOT
CTRL+ALT+DEL 재부팅 시 대체 핸들러 사용. 재부팅 루틴이 불안정한 일부 386 보드에서 사용되었다.
사용 예시
EMS 미사용, UMB 최대 확보
DEVICE=C:\DOS\HIMEM.SYS DEVICE=C:\DOS\EMM386.EXE NOEMS DOS=HIGH,UMB
EMS 활성화
DEVICE=C:\DOS\HIMEM.SYS DEVICE=C:\DOS\EMM386.EXE RAM DOS=HIGH,UMB
EMS 페이지 프레임 수동 지정
device=emm386.exe 512 frame=d000
HIGHSCAN
device=emm386.exe NOEMS HIGHSCAN