DOS 메모리 구조
DOS 메모리 구조
본 문서는 IBM PC 호환기종(DOS 1.0~MS-DOS 6.22 기준)의 Real Mode 메모리 구조를 정리한 기술 문서이다. 80286/80386/80486/Pentium DOS 환경에서 메모리가 어떻게 배치되고, HIMEM.SYS 및 EMM386.EXE가 어떤 식으로 이를 확장하는지 설명한다.
개요
- CPU : Real Mode(8088~386) 기준 20비트 주소공간 = 최대 1MB
- DOS의 근본적 한계 = 640KB 장벽
- 메모리 종류 :
- {{{1}}} Conventional Memory (0~640KB)
- {{{2}}} Upper Memory Area (640KB~1MB)
- {{{3}}} High Memory Area (HMA, 64KB-16 bytes)
- {{{4}}} XMS (확장 메모리, 1MB 이상)
- {{{5}}} EMS (EMS 4.0 방식의 배널버퍼 메모리)
DOS 환경은 위 메모리 구조를 조합하여 프로그램과 드라이버를 적재한다.
1MB 주소공간 개요 (Real Mode)
| 주소 범위 | 크기 | 용도 |
|---|---|---|
| 00000h ~ 9FFFFh | 640KB | Conventional Memory |
| A0000h ~ BFFFFh | 128KB | VGA/Video RAM |
| C0000h ~ C7FFFh | 32KB | VGA BIOS |
| C8000h ~ DFFFFh | 약 96KB | Option ROM / 가능 시 UMB |
| E0000h ~ EFFFFh | 64KB | System BIOS(일부 시스템) |
| F0000h ~ FFFFFh | 64KB | System BIOS (표준 ROM) |
Conventional Memory (0~640KB)
IBM PC의 설계에서 가장 핵심적이며, DOS 프로그램이 실행되는 기본 메모리이다.
- 구성 요소
- DOS 커널 (IO.SYS / MSDOS.SYS)
- COMMAND.COM
- 장치 드라이버 (ANSI.SYS, HIMEM.SYS 등)
- TSR 프로그램
- 실행 중인 EXE/COM
- 특징
- 대부분의 DOS 프로그램은 이 영역만 사용 가능
- 640KB가 부족하면 UMB/HMA/XMS/EMS를 활용해 확장
Upper Memory Area (640KB~1MB)
BIOS, 영상 메모리, Option ROM 등이 배치된 예약 영역.
| 범위 | 구조 |
|---|---|
| A0000h~AFFFFh | VGA Video RAM |
| B0000h~B7FFFh | MDA/Monochrome RAM |
| B8000h~BFFFFh | CGA Text RAM |
| C0000h~C7FFFh | VGA BIOS |
| C8000h~DFFFFh | Option ROM / UMB 가능 영역 |
| E0000h~FFFFFh | System BIOS |
EMM386.EXE는 C8000h~DFFFFh 같은 빈 공간을 스캔하여 UMB(Upper Memory Block)을 생성한다.
LOADHIGH(LH), DEVICEHIGH 사용 시 이 UMB에 적재된다.
High Memory Area (HMA)
- 주소: 1MB + 0B ~ 1MB + FFFFh
- 크기: 64KB - 16 bytes
- 접근: A20 라인 ON일 때만 가능
HIMEM.SYS가 제공하며 DOS=HIGH로 커널을 HMA로 이동할 수 있다. 약 45KB의 Conventional Memory 절약 효과가 있다.
XMS (확장 메모리, 1MB 이상)
XMS는 HIMEM.SYS가 제공하는 확장 메모리 규격이다.
- 주소는 1MB 이상의 RAM
- 구조상 Linear RAM
- 프로텍티드 모드 기반 접근
- DOS 프로그램은 XMS API(INT 2Fh, AX=4310h)로 접근
EMS (Expanded Memory Specification)
EMS 4.0 방식의 “페이지프레임 기반 뱅크 스위칭 메모리”.
EMM386.EXE가 XMS를 EMS로 변환하여 제공한다.
- 구조
- EMS 메모리는 실제로 고메모리에 있음(XMS 기반)
- 64KB 페이지프레임을 Conventional 영역에 매핑
- 구형 프로그램(1980~90년대) 호환용
- EMS 활성화 방법
DEVICE=HIMEM.SYS DEVICE=EMM386.EXE RAM
UMB 생성 구조
EMM386.EXE는 386 CPU의 가상 8086(V86) 모드를 이용하여 BIOS ROM 사이의 빈 메모리 구간을 UMB로 변환한다.
예:
/X=C800-CBFF ; 충돌 방지용 제외 /I=D000-D3FF ; 직접 포함 지정
DOS 6.x 표준 CONFIG.SYS 구성
UMB만 생성 (최고 호환성)
DEVICE=HIMEM.SYS DEVICE=EMM386.EXE NOEMS DOS=HIGH,UMB
EMS + UMB 활성화
DEVICE=HIMEM.SYS DEVICE=EMM386.EXE RAM DOS=HIGH,UMB
HMA만 사용 (EMM386 사용 안 함)
(286 또는 최소 환경)
DEVICE=HIMEM.SYS DOS=HIGH
메모리 구조 다이어그램
1MB 아래 영역
+-------------------------------+ F0000h (BIOS ROM) | System BIOS | +-------------------------------+ E0000h | Option ROM / Empty (UMB가능) | +-------------------------------+ D0000h | Option ROM / Empty (UMB가능) | +-------------------------------+ C8000h | VGA BIOS | +-------------------------------+ C0000h | Video RAM (VGA/MDA/CGA) | +-------------------------------+ A0000h | Conventional (640KB) | | 0 ~ 640KB | +-------------------------------+ 00000h
1MB 위 영역
[HMA] 64KB-16 bytes ----------------------------- [XMS] 확장 메모리 (1MB 이상) -----------------------------
메모리 관리자 관계
| 구성 요소 | 역할 |
|---|---|
| HIMEM.SYS | XMS / HMA / A20 / XMS 핸들 관리 |
| EMM386.EXE | EMS / UMB / VCPI / 페이지프레임 |
| DOS(커널) | Conventional Memory 관리 |