EMM386.EXE: 두 판 사이의 차이

도스박물관
둘러보기로 이동검색으로 이동
편집 요약 없음
편집 요약 없음
 
1번째 줄: 1번째 줄:
= EMM386.EXE =
= 개요 =
'''EMM386.EXE'''는 80386 이상의 CPU에서 동작하는 MS-DOS용 확장 메모리 관리자이다. 
확장 메모리(XMS)를 기반으로 '''EMS(Expanded Memory)'''를 에뮬레이트하고, 
상위 메모리 영역(UMA)에 존재하는 빈 공간을 스캔하여 '''UMB(Upper Memory Block)'''를 제공한다.


'''EMM386.EXE'''는 MS-DOS 5.0 이상에서 제공되는 80386 이상 CPU 전용
이 구조를 통해 도스 응용 프로그램이 사용할 수 있는 
EMS(Expanded Memory Specification) 에뮬레이터이자 UMB(Upper Memory Block) 생성기이다.
'''기본 메모리(Conventional Memory, 640KB)'''를 최대한 확보할 수 있다.


EMM386은 페이지프레임 및 가상 8086 모드를 활용하여 EMS 메모리를 제공하며,
EMM386은 CPU의 '''가상 8086 모드'''와 MMU(Page Table)를 이용해 
HIMEM.SYS와 함께 동작하여 DOS 메모리 구조의 효율을 극대화한다.
물리 주소 1MB 이상(XMS 영역)을 UMA로 "매핑"하여 사용하는 방식으로 동작하며,
EMM386 로딩 전에는 반드시 '''HIMEM.SYS'''가 먼저 로드되어 있어야 한다.


== 개요 ==
MS-DOS 5.0부터 EXE 형태로 제공되었으며 
; 종류 : 메모리 관리자 / 장치 드라이버
Windows/386 · Windows 3.x의 ‘386 향상 모드’ 환경에서도 사용되었다.
; 필요 CPU : 80386 이상 (286에서는 동작 불가)
; 기능 :
* EMS 4.0 호환 메모리 제공 (EMM 에뮬레이션)
* UMB(Upper Memory Block) 생성
* VCPI(가상 제어 프로그램 인터페이스) 제공
* VGA/BIOS ROM Shadow 영역 관리
* 메모리 맵 조정(Exclude / Include)


== 역할 ==
= 역사 =
* '''EMM386 ≠ HIMEM'''
== 초기 ==
** HIMEM = XMS/HMA 관리 + A20 라인 제어 
* 1986년 Compaq Deskpro 386용 OEM DOS에 포함된 '''CEMM'''이 기술적 기반.
** EMM386 = EMS/UMB/VCPI 제공
* 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와 함께 지속적으로 개선되었다.
<pre>
DEVICE=HIMEM.SYS
DEVICE=EMM386.EXE NOEMS
DOS=HIGH,UMB
</pre>


== 명령 형식 ==
= 버전 기록 =
<pre>
{| class="wikitable"
DEVICE=[drive:][path]EMM386.EXE [RAM|NOEMS]
! 함께 제공된 제품 !! 날짜 !! 파일명 !! 버전
                              [/FRAME=xxxx]
|-
                              [/I=range]
| MS-DOS 4.01 || 1988-11 || EMM386.SYS || 4.00
                              [/X=range]
|-
                              [/HIGHSCAN]
| Windows 3.0 || 1990-05 || EMM386.SYS || 4.10.0419
                              [/NOVCPI]
|-
                              [/AUTO]
| MS-DOS 5.0 / PC DOS 5.0 || 1991-06 || EMM386.EXE || 4.20.06x
                              [/VERBOSE]
|-
                              [/TEST]
| PC DOS 5.02 / MS-DOS 5.00a || 1992-09 || EMM386.EXE || 4.33
</pre>
|-
| 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 메모리 최적화에서 매우 중요한 포인트다.
=== RAM ===
EMS 메모리를 생성한다. 
UMB도 자동 활성화된다.


ex:
= Windows와의 관계 =
<pre>
== 386 향상 모드 ==
DEVICE=EMM386.EXE RAM
Windows 3.x/9x의 Enhanced Mode가 시작되면 
</pre>
Windows의 보호 모드 VMM이 EMM386 기능을 인계받으며, 
EMM386.EXE는 일시 중단된다.


=== NOEMS ===
== GEMMIS API ==
EMS 메모리를 생성하지 않고,  
Windows는 EMM386과 상호작용하기 위해  
'''UMB만 제공'''한다. 
'''GEMMIS(Global EMM Import Specification)'''를 사용한다.
DOS 6.x 최적화에서 가장 널리 쓰인다.


ex:
이를 지원하는 EMS 관리자는:
<pre>
* Microsoft EMM386 
DEVICE=EMM386.EXE NOEMS
* Quarterdeck QEMM 
DOS=HIGH,UMB
* Qualitas 386MAX 
</pre>
* Helix Netroom 


== 스위치 상세 ==
FreeDOS의 JEMM386/JEMMEX는 GEMMIS를 지원하지 않으며 
Windows 3.x Enhanced Mode 실행이 불가능하다.


=== /FRAME=xxxx ===
== SYSTEM.INI 우선순위 ==
EMS 페이지프레임 주소(16KB x 4 = 64KB)를 지정한다. 
공식 HELP 문서에 따르면:
기본 위치는 A000~BFFF 사이의 빈 영역.


예:
* EMM386의 옵션(I, X, FRAME 등)은 
<pre>
  **SYSTEM.INI의 EMMINCLUDE / EMMEXCLUDE / EMMPAGEFRAME보다 우선한다.**
/FRAME=D000
</pre>


=== /I=range (Include) ===
즉, Windows 측 설정으로는 EMM386의 CONFIG.SYS 설정을 덮어쓰기할 수 없다.
지정 영역을 UMB 스캔 대상에 포함.


예:
= SCSI/ESDI 및 /DOUBLE_BUFFER ==
<pre>
SCSI·ESDI HDD를 사용하는 경우 
/I=D000-D3FF
UMB/EMS 사용 시 DMA 주소 문제 때문에 
</pre>
'''SMARTDRV /DOUBLE_BUFFER''' 옵션이 필요할 수 있다.


=== /X=range (Exclude) ===
이는 데이터 전송을 안정시키기 위한 필수 설정일 수 있으며  
지정 영역을 스캔에서 제외.  
특히 1990년대 SCSI 카드 사용자 환경에서 널리 사용되었다.
사운드 카드, SCSI BIOS, VGA BIOS 등과 충돌 방지용.


예:
= EMM386.EXE의 주요 옵션 =
<pre>
== ON / OFF / AUTO ==
/X=C800-CBFF
ON: EMS·UMB 활성 
/X=D000-D7FF
OFF: 비활성 
</pre>
AUTO: 프로그램 요청 시에만 EMS/UMB 활성


=== /HIGHSCAN ===
== memory ==
더 공격적인 UMB 검사 수행. 
EMS/VCPI 최대 제공량(KB).   
일부 시스템에서 더 많은 UMB 확보 가능.   
NOEMS 사용 시 기본값 0.
단, 불안정성이 증가할 수 있다.


=== /NOVCPI ===
== MIN=size ==
VCPI 인터페이스 제공 금지. 
고정적으로 예약할 EMS 최소 크기.
일부 DPMI 프로그램과 충돌할 때 사용.


=== /AUTO ===
== NOEMS ==
ROM/RAM 자동 매핑 최적화.   
EMS 비활성화. 
대부분의 시스템에서 기본적으로 권장.
UMB는 제공되며 
'''상위 메모리를 최대 확보'''할 때 많이 사용된다.   
단, EMS 기반 프로그램은 동작하지 않을 수 있다.


=== /VERBOSE ===
== RAM ==
로드 시 상세 메시지 출력.
EMS 제공 + UMB 제공 
단, 페이지 프레임을 확보해야 하므로 
'''NOEMS보다 UMB가 적게 확보된다.'''


=== /TEST ===
== FRAME / Mx / Pn ==
디버그용 메모리 테스트 수행.
EMS 페이지 프레임 주소 또는 개별 페이지 주소 지정.


== 메모리 구조에서의 역할 ==
공식 HELP 예제:
EMM386은 386 CPU의 가상 8086 모드를 활용하여 확장 메모리를 “EMS 4.0 방식”으로 변환하고,
device=emm386.exe 512 p0=d000 p1=d400 p2=d800 p3=dc00
다음의 기능을 제공한다.


=== 1) EMS 에뮬레이션 ===
== X=mmmm-nnnn / I=mmmm-nnnn ==
* Lotus-Intel-Microsoft LIM EMS 4.0 호환
상위 메모리 사용/제외 범위 지정.
* 64KB 페이지프레임 구성
* 대부분의 1980~90년대 구형 프로그램 실행 지원


=== 2) UMB(Upper Memory Block) 생성 ===
== HIGHSCAN ==
F000~A000 사이의 빈 영역을 스캔하여  
EMA/UMB 추가 스캔 실시. 
장치 드라이버 / TSR을 상위 메모리에 적재 가능.
하지만 잘못된 영역을 사용 가능하다고 판단하여  
'''시스템이 멈출 위험'''이 있으므로 고급 사용자 전용 옵션이다.


LOADHIGH(LH), DEVICEHIGH와 함께 사용.
== NOHI ==
EMM386 일부를 UMB에 올리지 않음.
→ 기본 메모리 감소 
→ UMB 확보 증가


=== 3) VCPI 제공 ===
== ROM=range ==
DOS 확장기(Phar Lap, DOS/4GW 초기 버전 등)에 필요한 인터페이스 제공.
Shadow RAM 구성.


(DPMI 기반 Win3.x/Win9x의 경우 VCPI는 부차적 역할)
== NOVCPI ==
VCPI 비활성(반드시 NOEMS와 함께).


== 추천 CONFIG.SYS / AUTOEXEC.BAT 조합 ==
== WIN=range ==
Windows에서 사용할 UMA 영역 예약.


=== 386/486 DOS 6.22 최적화(일반용) ===
== NOMOVEXBDA ==
<pre>
EBDA를 UMB로 이동시키지 않음.
DEVICE=HIMEM.SYS
특정 VGA BIOS, 네트워크 ROM과의 충돌을 방지할 때 사용.
DEVICE=EMM386.EXE NOEMS
DOS=HIGH,UMB
</pre>


=== EMS 필요한 옛 프로그램(예: Wing Commander) ===
== ALTBOOT ==
<pre>
CTRL+ALT+DEL 재부팅 시 대체 핸들러 사용.
DEVICE=HIMEM.SYS
재부팅 루틴이 불안정한 일부 386 보드에서 사용되었다.
DEVICE=EMM386.EXE RAM
DOS=HIGH,UMB
</pre>


=== 최대 UMB 확보(위험성 있음) ===
= 사용 예시 =
<pre>
== EMS 미사용, UMB 최대 확보 ==
DEVICE=HIMEM.SYS
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=EMM386.EXE NOEMS HIGHSCAN
DEVICE=C:\DOS\EMM386.EXE NOEMS
DOS=HIGH,UMB
DOS=HIGH,UMB
</pre>


=== 하드웨어 충돌 있을 때 ===
== EMS 활성화 ==
<pre>
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=EMM386.EXE NOEMS X=C800-CFFF X=D000-D7FF
DEVICE=C:\DOS\EMM386.EXE RAM
</pre>
DOS=HIGH,UMB


== 주의 사항 ==
== EMS 페이지 프레임 수동 지정 ==
* 286에서는 절대 동작하지 않음 (386 전용 V86 모드 필요)
device=emm386.exe 512 frame=d000
* EMS=RAM 모드는 일부 Protected Mode 프로그램과 충돌 가능
* Win3.x Enhanced Mode에서 EMM386은 필수 구성 요소


== HIMEM과의 관계 ==
== HIGHSCAN ==
{| class="wikitable"
device=emm386.exe NOEMS HIGHSCAN
! 구성 요소 !! 기능
|-
| HIMEM.SYS || XMS / A20 / HMA
|-
| EMM386.EXE || EMS / UMB / VCPI / 페이지프레임
|}


== 같이 보기 ==
= 관련 문서 =
* [[HIMEM.SYS]]
* [[HIMEM.SYS]]
* [[MEM.EXE]]
* [[CONFIG.SYS]]
* [[CONFIG.SYS]]
* [[DOS 메모리 구조]]
* [[DOS 메모리 구조]]
* [[EMS]]
* [[QEMM]]
* [[XMS]]
* [[386MAX]]
* [[UMB]]
 
= 분류 =
[[Category:MS-DOS 명령어]]
[[Category:DOS 구성요소]]
[[Category:메모리 관리자]]

2025년 11월 28일 (금) 21:08 기준 최신판

개요

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

관련 문서

분류