맨위로가기

도스 확장자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

DOS 익스텐더는 보호 모드에서 실행되는 프로그램이 DOS API와 호환되도록 DOS를 확장하는 프로그램이다. 이는 DOS가 16비트 주소 지정을 사용하고 보호 모드가 다른 주소 지정 방식을 사용하기 때문에 필요했다. DOS 익스텐더는 실제 모드와 보호 모드 간의 전환을 관리하며, DOS 인터럽트를 가로채어 미니 운영 체제처럼 작동한다. DOS 익스텐더는 DOS/4GW와 같은 다양한 형태로 존재하며, 초창기에는 메모리 집약적인 비즈니스 응용 프로그램에 사용되었지만, PC 게임에서 널리 사용되었다. DOS 익스텐더는 가상 제어 프로그램 인터페이스(VCPI)와 DOS 보호 모드 인터페이스(DPMI)를 제공하여 리얼 모드 소프트웨어와 인터페이스하고 메모리를 할당하며 인터럽트를 처리할 수 있게 했다. DOS 익스텐더는 CPU의 리얼 모드와 보호 모드 전환, 메모리 확보, A20 제어, 인터럽트 재배치, 가상 메모리 지원 등 기종에 따라 다른 기술적 특징을 가진다.

2. DOS 익스텐더의 작동 원리

DOS 확장자는 MS-DOS 환경에서 x86 CPU의 보호 모드 기능을 활용하기 위해 개발된 프로그램이다. 일반적으로 MS-DOS 상에서 먼저 실행되어, 해당 DOS 확장자 전용으로 만들어진 애플리케이션 소프트웨어를 구동시키는 역할을 한다. MS-DOS는 기본적으로 메모리 주소를 1MB 이내로 제한하고 CPU 명령어 또한 16비트용만 사용할 수 있었기 때문에, 386 이후의 32비트 CPU가 탑재된 컴퓨터에서도 그 성능을 온전히 활용하기 어려웠다.

DOS 확장자는 이러한 한계를 극복하기 위해 등장했다. 32비트 명령어와 확장된 메모리 주소 공간을 사용할 수 있도록 지원함으로써, MS-DOS 환경에서도 32비트 애플리케이션을 실행하고 성능을 크게 향상시키는 것이 가능해졌다. 예를 들어, Phar Lap의 386|DOS-Extender와 같은 프로그램을 사용하면 MS-DOS를 기반으로 하면서도 32비트 환경을 구축할 수 있었다.

또한 DOS 확장자는 개발 측면에서도 이점을 제공했다. 기존 MS-DOS 프로그래밍에서는 인텔 8086 아키텍처의 제약으로 인해 복잡한 메모리 모델(세그먼트 관리 등)과 C 언어에서의 까다로운 포인터 제어가 필수적이었다. 하지만 DOS 확장자를 사용하면 이러한 제약에서 벗어나 더 넓은 연속 메모리 공간(리니어 메모리)을 활용할 수 있게 되어 개발 효율성이 높아지고 프로그램 실행 속도도 개선되었다.

작동 원리의 핵심은 보호 모드에서 실행되는 애플리케이션과 리얼 모드 기반의 DOS API 사이를 중개하는 것이다. 이 과정에서 보호 모드와 리얼 모드 간의 전환, 데이터 전송을 위한 버퍼 관리, 운영 체제 기능 처리를 위한 인터럽트 가로채기 등 복잡한 작업을 내부적으로 처리한다. 이러한 특성 때문에 DOS 확장자는 기본적인 운영 체제의 기능을 상당 부분 대신 수행하는 '미니 운영 체제'에 비유되기도 한다.

하지만 DOS 확장자를 사용하기 위해서는 애플리케이션을 해당 확장자 전용으로 컴파일해야 했으며, 확장자마다 실행 가능한 프로그램 형식이 달라 호환성 문제가 발생했다. 예를 들어, Phar Lap의 RUN386용 프로그램과 DJGPP의 GO32용 프로그램은 서로 호환되지 않았다. 이러한 점은 DOS 확장자의 유용성에도 불구하고 널리 보급되는 데 제약 요인이 되었다.

한편, Windows의 초기 버전인 Microsoft Windows 3.x 및 Microsoft Windows 9x 계열 운영 체제들도 기술적으로는 MS-DOS 위에서 실행되어 보호 모드를 활용하는 DOS 확장자의 한 형태로 볼 수 있다. 이후 Windows 운영 체제가 널리 보급되면서 DOS 확장자는 점차 그 역할을 잃게 되었다.

2. 1. 리얼 모드와 보호 모드 간 전환

DOS 확장자는 보호 모드에서 실행되는 프로그램이 리얼 모드 기반의 DOS API와 원활하게 상호작용할 수 있도록 DOS를 확장하는 프로그램이다. DOS의 많은 기능은 기존 메모리(처음 640KB 메모리) 내의 특정 위치를 가리키는 16비트 세그먼트 및 오프셋 주소를 사용한다. 반면, 보호 모드는 세그먼트 레지스터(선택자)를 사용하여 글로벌 디스크립터 테이블(GDT)의 항목을 참조하는 방식으로 메모리 주소를 지정하며, 이는 리얼 모드 방식과 호환되지 않는다. 따라서 보호 모드 프로그램이 DOS 기능을 사용하려면 리얼 모드나 가상 8086 모드(V86 모드)로 전환해야 하며, 이 과정은 시스템 자원을 소모하는 작업이다.

DOS 확장기는 이러한 모드 전환을 관리하며, 리얼 모드와 보호 모드 간의 데이터 전송을 위해 1MB 이하의 메모리 영역(기존 메모리)에 버퍼를 할당하는 변환 계층을 제공한다. 이 버퍼는 보호 모드 메모리에 직접 접근할 수 없는 MS-DOS와 보호 모드 프로그램 간의 데이터 교환에 필수적이다.

모드 전환에는 비교적 많은 시간이 소요되므로, DOS 확장기는 자체 보호 모드 환경 내에서 많은 리얼 모드 작업의 기능을 직접 구현하여 전환 횟수를 최소화하려고 시도한다. 예를 들어, DOS는 운영 체제와 사용자 프로그램 간의 통신에 인터럽트를 광범위하게 사용하는데, 확장기는 실시간 시계, 키보드 컨트롤러와 같은 하드웨어 인터럽트나 DOS 자체 기능, 마우스 API와 같은 소프트웨어 인터럽트를 가로채 보호 모드에서 직접 처리한다. 일부 확장기는 비디오 BIOS 루틴과 같은 다른 일반적인 인터럽트 기능도 처리하기도 한다. 본질적으로 DOS 확장기는 기본 운영 체제의 여러 기능을 대신 수행하는 작은 운영 체제처럼 작동한다.

보호 모드 애플리케이션이 파일 접근과 같은 함수 호출을 DOS 확장기에 요청하면 다음과 같은 과정이 일어난다.

# DOS 확장기는 CPU를 리얼 모드 또는 가상 86 모드로 전환한다.

# 확장기는 애플리케이션의 요청을 MS-DOS가 이해할 수 있는 함수 호출로 변환하여 MS-DOS를 호출한다.

# 파일 읽기와 같이 데이터 전송이 필요한 경우, MS-DOS는 데이터를 기존 메모리에 마련된 통신 버퍼로 읽어들인다.

# 데이터 로딩 후, 확장기는 CPU를 다시 보호 모드로 전환한다.

# 통신 버퍼에 있는 데이터를 보호 모드 메모리 영역으로 복사하여 애플리케이션에 전달한다.

만약 전송할 데이터의 크기가 커서 통신 버퍼에 한 번에 담을 수 없다면, 위 과정을 여러 번 반복하여 모든 데이터를 보호 메모리로 옮긴다. 이처럼 애플리케이션 실행 중에 보호 모드와 리얼 모드 간의 전환이 빈번하게 발생하는 것이 DOS 확장기의 특징 중 하나이다.

DOS 확장자가 시작될 때 보호 모드 애플리케이션 자체를 메모리에 로드하는 과정도 위와 유사한 방식으로 진행된다. 애플리케이션 코드를 보호 메모리에 모두 읽어들인 후, 확장기는 CPU를 보호 모드로 전환하여 애플리케이션 실행을 시작한다.

애플리케이션 실행이 종료되면, DOS 확장기는 확보했던 보호 메모리를 모두 해제하고 CPU를 다시 리얼 모드로 전환한 뒤, MS-DOS 애플리케이션으로서 자신의 실행을 종료한다.

3. DOS 익스텐더의 개발 역사

텐베리 소프트웨어(Tenberry Software)의 DOS/4G 제품 로고


DOS 익스텐더는 파 라프 사(Phar Lap)가 처음 개발한 것으로 알려져 있으나, 보호 모드 DOS 프로그램을 대중 시장에 널리 알린 것은 텐베리 소프트웨어(구 Rational Systems)의 386 익스텐더인 DOS/4GW였다. 이 익스텐더는 왓콤의 386급 프로세서용 C, C++, 포트란 컴파일러에 포함되어, id Software의 성공적인 게임 ''''과 같은 PC 응용 프로그램 및 게임에서 널리 사용되며 주류 기술로 자리 잡았다.

초기 DOS 익스텐더 개발은 메모리를 많이 사용하는 비즈니스 응용 프로그램의 요구에 의해 주도되었지만, 실제로 DOS 익스텐더가 큰 주목을 받게 된 계기는 PC 게임의 등장이었다. DOS 익스텐더 개발 과정에서 기존의 다양한 메모리 관리 방식 간의 잠재적 충돌 문제를 해결하고, 클라이언트 프로그램에 일관된 인터페이스를 제공하기 위해 두 가지 새로운 소프트웨어 인터페이스가 등장했다.

첫 번째 인터페이스는 가상 제어 프로그램 인터페이스(VCPI)였으나, Windows 3.0 개발 과정에서 나온 DOS 보호 모드 인터페이스(DPMI) 사양으로 인해 빠르게 대체되었다.[1] DPMI는 확장된 프로그램이 리얼 모드 소프트웨어와 상호 작용하고, 메모리를 할당하며, 인터럽트 서비스를 처리할 수 있는 API를 제공했다. 또한, 보호 모드로 쉽게 전환할 수 있는 방법을 제공하고 여러 보호 모드 프로그램이 동시에 실행될 수 있도록 지원했다.

DOS 익스텐더는 응용 소프트웨어가 MS-DOS 환경에서 x86 CPU의 보호 모드를 활용할 수 있게 해주는 프로그램이다. 일반적으로 MS-DOS에서 시작되어 DOS 익스텐더 전용 응용 소프트웨어의 실행을 가능하게 한다. 그 외에도 MS-DOS용 프로그램을 멀티태스킹으로 작동시키거나 그래픽 사용자 인터페이스(GUI)를 제공하는 등, 익스텐더와 그 위에서 실행되는 프로그램의 종류에 따라 다양한 기능이 제공되었다.

MS-DOS 환경에서는 일반적으로 메모리 주소가 1 메비바이트(MiB) 이내로 제한되고 CPU 명령어도 16비트용만 사용할 수 있어, 32비트 CPU를 사용하더라도 실제로는 고속 16비트 CPU로만 작동하는 한계가 있었다. 그러나 386|DOS-Extender와 같이 32비트 명령과 메모리 주소를 지원하는 DOS 익스텐더를 사용함으로써, MS-DOS를 통해 32비트 환경을 구축하는 것이 가능해졌다. 여러 제약 속에서도 16비트 환경에 비해 응용 프로그램의 성능이 크게 향상되었다.

부가적으로, 기존 MS-DOS 프로그램 개발 시 거의 필수였던 인텔 8086 유래의 제한으로 인한 복잡한 메모리 모델이나 C 언어에서의 포인터 제어, 세그먼트 전환 등의 필요성이 크게 줄어들었다. 이는 개발 효율성을 높이고 속도 면에서도 우위를 확보하는 데 기여했다. 기존 MS-DOS 환경에서는 연속적으로 처리할 수 있는 메모리 영역(리니어 메모리)이 64 키비바이트(KiB) 또는 1 메비바이트(MiB)에 불과했기 때문이다. Microsoft Windows 3.x 이전 버전 및 Microsoft Windows 9x 계열의 Windows 역시 기술적으로는 DOS에서 시작되어 보호 모드로 작동하는 DOS 익스텐더의 일종이거나, 일체화된 DOS 익스텐더 위에서 작동하는 데스크톱 환경으로 볼 수 있다.

보호 모드에서 작동하는 응용 프로그램은 일반적인 EXE 포맷의 프로그램이 아니라, 해당 DOS 익스텐더 전용으로 컴파일된 프로그램이어야 실행할 수 있었다. 또한, DOS 익스텐더마다 실행 가능한 프로그램 형식이 달랐기 때문에, 예를 들어 RUN386용으로 컴파일된 프로그램을 GO32에서 실행할 수는 없었다. 이러한 호환성 문제는 DOS 익스텐더의 유용성에도 불구하고 널리 보급되는 데 한계로 작용했다.

대표적인 DOS 익스텐더로는 DESQview나 PharLap Software가 개발한 386|DOS-Extender (RUN386) 등이 있다. RUN386은 PC/AT 호환기용, PC-9800 시리즈용, FMR 시리즈용, FM TOWNS용 등 다양한 기종을 지원했으며, 기종 의존적인 BIOS 등을 직접 사용하지 않는 한 여러 기종에서 동일한 프로그램을 실행할 수 있었다. RUN386용 실행 프로그램의 확장자는 .EXP였다.

Windows가 널리 보급되면서 DOS 익스텐더는 점차 그 역할을 잃어갔다.

주요 DOS 익스텐더 목록
제품명개발사/관련 정보
DOS/4G, DOS/4GW, DOS/16M텐베리 소프트웨어
DOS Extender, 386|DOS Extender파 라프 사(Phar Lap)
PROTAl Williams
PMODE, PMODE/W
Ergo OS/286, OS/386 확장자, DPM/16, DPM/32 서버Ergo Computing
마이크로소프트 윈도우 (도스 기반 버전)마이크로소프트 (DPMI 서버와 도스 확장자 포함)
HX 도스 확장자제한된 Win32 지원 제공
DosWin32제한된 Win32 지원 제공
CWSDPMICharles W. Sandmann (DJGPP와 함께 사용)
GO32DJGPP의 일부
DBOS
DOS/32


4. DOS 익스텐더의 종류


  • DOS/4G, DOS/4GW, DOS/16M: Tenberry Software (구 Rational Systems)에서 개발한 DOS 확장자이다.
  • 286|DOS Extender (RUN286), 386|DOS Extender (RUN386): Phar Lap Software에서 개발했으며, 이후 TNT Dos Extender로 대체되었다. PC/AT 호환기, PC-9800 시리즈, FMR 시리즈, FM TOWNS 등 다양한 기종을 지원했으며, 특히 FM TOWNS에서는 운영체제 구동에 사용될 정도로 널리 쓰였다. 실행 파일 확장자는 .EXP이다.
  • TNT|DOS-Extender: Phar Lap Software에서 개발한 후기 버전의 DOS 확장자이다.
  • PROT: Al Williams가 개발하여 Dr. Dobb's Journal[2][3]과 저서[4][5]를 통해 공개한 32비트 DOS 확장자이다. 실제 모드로 다시 전환하는 대신 에뮬레이션 모드에서 DOS 및 BIOS 호출을 실행하는 특징이 있다.
  • PMODE, PMODE/W: PMODE/W는 Watcom C/C++ 컴파일러용 32비트 보호 모드 DOS 확장자로, 2023년 7월부터 오픈 소스로 공개되었다.[9]
  • OS/286, OS/386: Ergo (구 Eclipse, A. I. Architects)에서 개발한 확장자 및 DPM16, DPM32 서버이다.
  • Microsoft Windows (도스 기반 버전): Windows 3.x 및 Windows 9x 계열과 같이 MS-DOS를 기반으로 부팅되던 초기 버전의 윈도우는 DPMI 서버와 DOS 확장자 기능을 내장하고 있었다.[6] NT 계열은 해당되지 않는다.
  • HX 도스 확장자: 제한적인 Win32 지원을 제공하여 Far Manager와 같은 Windows 콘솔 애플리케이션이나 일부 Win32 GUI 애플리케이션을 DOS 환경에서 실행할 수 있게 한다. 보호 모드 DOS 프로그램을 위한 16비트 및 32비트 DPMI 서버(HDPMI16/HDPMI32)를 포함한다.[7]
  • DosWin32: 제한적인 Win32 지원을 제공한다.
  • WDosX: Michael Tippach가 제작한 확장자로, TMT Pascal 컴파일러에서 사용된 초기 Win32 API 에뮬레이션 구현 중 하나이다. 2005년까지 개발이 이루어졌다.
  • CauseWay: 한때 독점 소프트웨어였으며 DOS/4G와 경쟁했다. Watcom C/C++ 컴파일러에 포함되었으며, Daggerfall과 같은 일부 게임에서 사용되었다. 2000년경 오픈 소스로 공개되었다.
  • CWSDPMI: Charles W. Sandmann가 개발한 DPMI 서버로, 주로 32비트 보호 모드 DOS DJGPP 프로그램과 함께 사용된다.
  • GO32: DJGPP의 초기 버전(v2 이전)과 Free Pascal에서 사용된 확장자이다. 프리웨어이다.
  • DBOS: Salford Software에서 개발한 32비트 보호 모드 DOS 확장자로, 주로 FTN77 Fortran 컴파일러와 함께 사용되었다.[8]
  • DOS/32: Narech K.가 개발한 DOS/4G의 대안 확장자이다.
  • 386Power: 32비트 어셈블리 애플리케이션을 위한 확장자이며, 소스 코드가 포함되어 있다.
  • Borland Power Pack: 일부 볼랜드 개발 도구에 포함되어 제한적인 Win32 API 접근 기능을 제공했다.
  • TASM: 볼랜드에서 제공한 어셈블러로, DPMI32VM 및 DPMI16BI를 갖춘 32RTM과 RTM이라는 두 개의 DPMI 호스트를 포함했다.
  • QDPMI: Quarterdeck Office Systems에서 개발했으며, 메모리 관리자인 QEMM에 포함된 DPMI 호스트이다.
  • D3X: 어셈블리로 완전히 작성된 DPMI 서버이다. 알파 상태에서 개발이 중단되었다.
  • DPMIONE: 볼랜드 C++ 및 Delphi로 생성된 32비트 프로그램을 위해 개발된 DPMI 서버이다.
  • X32, X32VM: FlashTek에서 개발했으며, Digital Mars 컴파일러에서 지원된다.
  • BLINKER: Blink Inc에서 개발한 확장자로, 버전 3 이상부터 286 DOS 확장자 기능을 제공했다. CA-Clipper, Microsoft C/C++, PASCAL, FORTRAN, 볼랜드 C/C++ 등 다양한 16비트 DOS 컴파일러를 지원했으며, 실행 환경에 따라 실제 모드 또는 보호 모드에서 실행될 수 있는 독특한 '듀얼 모드' 실행 파일을 생성할 수 있었다.
  • EMX: OS/2 및 DOS 환경을 위한 프로그래밍 환경 및 확장자이다.
  • NDP-RUN: MicroWay사에서 개발했으며, NDP 컴파일러 시리즈(Ver.4 이후)에 번들되었다. Ergo의 OS/386을 기반으로 하며, .LTL이라는 독자적인 파일 포맷을 지원했다.
  • EXE286, EXE386: 교토 마이크로 컴퓨터에서 개발한 확장자로, 판매용 버전과 비영리 버전이 존재했다. PC-9800 시리즈, PC/AT 호환기, FMR 시리즈, FM TOWNS용 버전이 있었으며, Phar Lap의 286/386|DOS-Extender와 호환되었다.

5. 주요 32비트 DOS 익스텐더 대응 개발 도구

wikitext

개발 도구개발사 / 특징
DOS/4G, DOS/4GW, DOS/16M텐베리 소프트웨어 (Tenberry Software)
286|DOS Extender, 386|DOS ExtenderPhar Lap
PROTAl Williams
PMODE, PMODE/W
Ergo OS/286, OS/386 확장자, DPM/16, DPM/32 서버Ergo Computing
마이크로소프트 윈도우 (도스 기반 버전)마이크로소프트. DPMI 서버와 도스 확장자 포함.
HX 도스 확장자제한된 Win32 지원 제공
DosWin32제한된 Win32 지원 제공
CWSDPMI
GO32
DBOS
DOS/32
386ASM/386LINKPhar Lap Software사. FM TOWNS용 외에는 386|DOS-Extender SDK (일본 내에서는 386TOOLBOX라는 상품명으로 판매)에 번들됨.
386|VMMPhar Lap Software사. 386|DOS-Extender 또는 TNT|DOS-Extender (Ver.6 이후)의 옵션 툴. 이 DOS 익스텐더와 함께 사용함으로써 MS-DOS 상에서 32비트 가상 기억 환경을 구축하는 가상 기억 관리자.
HIGH-C386, HIGH C/C++MetaWare사. FM TOWNS의 표준 C 컴파일러로, 후지쯔에서 다양한 라이브러리가 제공됨.
WATCOM CWATCOM사.
NDP-Fortran386, NDP-C/C++, NDP-PASCALMicroWay사.
Lahey FortranLahey사.
WIN32 SDK C 컴파일러마이크로소프트사. WIN32 SDK에 부속된 32비트 C 컴파일러 (MS-C Ver.8.0 32비트판에 상당). PharLap사의 TNT|DOS-Extender를 사용함으로써, TNT|DOS-Extender용 애플리케이션 개발 가능.
SoftProbe 386XSSI사. HIGH C386 대응의 소스 코드 디버거. PC-9800 시리즈판이 존재. PC/AT 호환기종 대응판은 MetaWare사에 OEM 공급되어, MetaWare Debugger라는 명칭으로 HIGH C 컴파일러에 번들됨.
djgppGO32 상에서 동작하는 GCC. 386|DOS-Extender・EXE386에도 이식됨.
Rapid Deployment Software Euphoria Version 3.1멀티 플랫폼 스크립트 언어. DOS 익스텐더로서 CauseWay를 사용. C 언어 소스도 출력 가능.
XSCompiler


6. DOS 익스텐더와 호환/구동되는 주요 프로그램

DOS 익스텐더는 MS-DOS 환경의 기본 메모리 제한(640KB)을 넘어 확장 메모리에 직접 접근하여 더 많은 메모리를 사용할 수 있게 해주는 기술이다. 다양한 DOS 익스텐더가 개발되었으며, 많은 소프트웨어와 게임에서 이를 활용했다.
주요 DOS 익스텐더:


  • DOS/4G, DOS/4GW, DOS/16M (텐베리 소프트웨어, 이후 Rational Systems에서 개발)
  • 286|DOS Extender, 386|DOS Extender, TNT|DOS-Extender (Phar Lap)
  • PROT (Al Williams)
  • PMODE, PMODE/W
  • Ergo OS/286, OS/386 확장자, DPM/16, DPM/32 서버
  • 마이크로소프트 윈도우 (도스 기반 버전): DPMI 서버와 도스 확장자 포함
  • HX 도스 확장자 (제한된 Win32 지원 제공)
  • DosWin32 (제한된 Win32 지원 제공)
  • CWSDPMI
  • GO32 (프리웨어)
  • DBOS
  • DOS/32
  • NDP-RUN (MicroWay사, NDP 컴파일러 시리즈 Ver.4 이후 번들, ERGO OS/386 기반)
  • CauseWay (Watcom C/C++ 부속, 현재 PDS)
  • WDOSX (Michael Tippach 제작, Win32 API 에뮬레이션 기능 탑재, 2005년까지 개발)
  • EXE286, EXE386 (교토 마이크로 컴퓨터 개발, PC-9800 시리즈, PC/AT 호환기, FMR 시리즈·FM TOWNS용 존재, 286·386|DOS-Extender 호환)

주요 호환/구동 프로그램:

  • 그래픽스 및 오피스 소프트웨어:
  • ATT 그래픽스 소프트웨어 랩스(ATT Graphics Software Labs) 'RIO': 해상도 독립 객체 그래픽스 소프트웨어
  • 어도비 아크로뱃 리더 1.0: 초기 버전에서 DOS/4GW 프로페셔널 사용
  • AutoCAD 11: PharLap 386 사용
  • 로터스 1-2-3 릴리스 3: Rational Systems DOS/16M 사용
  • 오라클 프로페셔널
  • IBM Interleaf
  • 쿼터덱(Quarterdeck) DESQview 및 DESQview/X: 멀티태스킹 소프트웨어
  • 개발 도구:
  • Watcom C, C++, Fortran 컴파일러 for the x86
  • 통신:
  • Major BBS: 1980년대 BBS 소프트웨어 패키지로 Phar Lap DOS 익스텐더 활용
  • 게임 (주로 DOS/4GW 사용):
  • id 소프트웨어의 ''둠'', ''퀘이크'' (DJGPP로 제작)
  • 룩킹 글래스 스튜디오의 ''System Shock''
  • 패럴랙스 소프트웨어의 ''Descent''
  • 크랙 닷 컴의 ''Abuse''
  • 블리자드 엔터테인먼트의 ''워크래프트: 오크&휴먼'', ''워크래프트 2: 어둠의 물결''
  • 3D 렐름스의 ''듀크 뉴켐 3D''
  • 미드웨이의 ''모탈 컴뱃''
  • 웨스트우드 스튜디오의 ''커맨드 & 컨커'', ''커맨드 & 컨커: 레드 얼럿''
  • DMA 디자인 (현 Rockstar North)의 ''그랜드 테프트 오토'' (후속 버전은 윈도우로 포팅됨)
  • 특수 메모리 관리자 사용 게임:
  • ''코만치: 맥시멈 오버킬'' (NovaLogic 제작): 80386 프로세서 필요, 메모리 관리자 및 가상 DOS 박스와 호환되지 않는 사용자 정의 언리얼 모드 메모리 관리자 사용. CONFIG.SYS에서 복잡한 부팅 메뉴 설정 필요. 후속 버전에서 DOS 익스텐더 포함하여 문제 해결.
  • 오리진 시스템의 ''울티마 VII'', ''울티마 VII 파트 2: 뱀섬'': Voodoo Memory Manager라는 사용자 정의 언리얼 모드 메모리 관리자 사용. EMS 메모리 및 EMM386과 같은 메모리 관리자와 호환되지 않음.

일본 환경에서의 활용:

  • FM TOWNS는 MS-DOS 상에서 Phar Lap의 RUN386을 통해 운영체제가 동작했으며, 후지쯔에서 제공하는 개발 도구 역시 익스텐더용 애플리케이션 개발을 지원했다. 이로 인해 시판 애플리케이션과 프리 소프트웨어 다수가 익스텐더용 프로그램으로 개발되었다.
  • 교토 마이크로 컴퓨터가 개발한 EXE286, EXE386 등 286·386|DOS-Extender 호환 익스텐더도 존재했다.

7. DOS 익스텐더의 기술적 특징과 기종 의존성

MS-DOS 환경에서 x86 CPU의 보호 모드를 활용하기 위한 프로그램인 도스 확장자는 여러 기술적 특징과 함께 특정 컴퓨터 기종에 의존하는 문제를 안고 있었다.

도스 확장자는 기본적으로 보호 모드에서 실행되면서도 프로그램이 기존의 DOS API와 원활히 통신하도록 MS-DOS의 기능을 "확장"하는 역할을 했다. 이는 MS-DOS의 많은 기능이 기존 메모리인 1MB 미만 메모리 주소를 사용하는 16비트 방식(세그먼트:오프셋)에 의존하는 반면, 보호 모드는 글로벌 디스크립터 테이블(GDT)을 이용하는 다른 주소 지정 방식을 사용하기 때문에 필수적이었다. 도스 확장자는 이 두 방식 간의 전환을 관리하고, 보호 모드 프로그램과 리얼 모드 운영체제 간의 데이터 전송을 위해 1MB 미만 메모리 영역에 버퍼를 할당하는 변환 계층을 제공했다.

또한, 리얼 모드보호 모드 간의 전환은 CPU에 상당한 부담을 주는 작업이므로, 도스 확장자는 인터럽트 처리를 통해 이러한 전환 횟수를 최소화하려고 시도했다. MS-DOS는 운영체제와 프로그램 간 통신에 인터럽트를 광범위하게 사용하는데, 도스 확장자는 실시간 시계, 키보드 컨트롤러, 마우스 API, 심지어 비디오 BIOS 루틴과 같은 일반적인 하드웨어 및 소프트웨어 인터럽트를 직접 가로채 보호 모드 환경 내에서 처리했다. 이처럼 도스 확장자는 마치 MS-DOS 위에 동작하는 작은 운영체제와 같이 작동하며, 메모리 관리, 인터럽트 처리 등 핵심적인 시스템 기능을 상당 부분 담당했다.

하지만 도스 확장자는 CPU의 모드를 전환하고 메모리 및 하드웨어를 직접 제어하는 과정에서 필연적으로 특정 컴퓨터 기종의 하드웨어 구조에 의존하게 되었다. CPU를 리얼 모드에서 보호 모드로 전환하는 것 자체는 CPU의 기능이지만, 실제 도스 확장자를 구현하고 실행하는 데 필요한 세부적인 처리, 예를 들어 보호 메모리 확보 방식, A20 라인 제어, 인터럽트 재배치, 가상 메모리 지원 방식, CPU 리셋 회로 제어(특히 80286 기반 16비트 확장자의 경우) 등은 컴퓨터 기종마다 달랐다.

이러한 기종 의존성은 도스 확장자의 호환성 문제를 야기했다. 예를 들어, PharLap Software가 개발한 386|DOS-Extender (RUN386)는 PC/AT 호환기용, PC-9800 시리즈용, FMR 시리즈용, FM TOWNS용 등 기종별 버전이 존재했다. 비록 BIOS 등을 직접 이용하지 않는 한 여러 기종에서 동일한 프로그램을 실행할 수도 있었지만, 이는 도스 확장자 내부에 각 기종에 맞는 코드가 포함되었기 때문이었다.

더욱이, 도스 확장자마다 사용하는 실행 파일 형식이 달라 서로 호환되지 않는 경우가 많았다. 예를 들어, RUN386용으로 컴파일된 프로그램(.EXP)은 GO32용 도스 확장자에서 실행할 수 없었다. 이러한 실행 파일 형식의 비호환성과 기종 의존성은 도스 확장자가 가진 유용성에도 불구하고 널리 보급되는 데 장애물로 작용했다. 이후 윈도우가 보급되면서 도스 확장자는 점차 그 역할을 잃어갔다.

7. 1. 보호 메모리 확보

MS-DOS는 본래 리얼 모드용 운영체제였기 때문에, 직접 보호 모드 메모리를 관리하는 기능을 갖추고 있지 않다. 하지만 도스 확장자는 보호 모드에서 실행되므로, 부팅 시 해당 하드웨어에서 사용 가능한 보호 모드 메모리를 확보해야 한다.

도스 확장자가 보호 모드 메모리를 확보하는 방법으로는 보호 모드 메모리 관리를 위한 별도의 장치 드라이버를 사용하거나, 보호 모드 메모리 BIOS 또는 MS-DOS의 확장 기능으로 제조사가 제공하는 고유한 펑션 콜을 직접 호출하는 방식이 있다.

그러나 보호 모드 메모리 BIOS나 제조사 고유의 펑션 콜은 하드웨어마다 사양이 다르다. 따라서 도스 확장자가 이를 직접 호출하는 방식은 특정 하드웨어에 종속되는 문제를 일으킬 수 있다.

7. 2. 어드레스 라인 20 (A20) 제어

80286 이상의 CPU를 탑재한 PC/AT 호환기나 PC-9800 시리즈와 같은 컴퓨터는 구형 기종과의 호환성을 위해 부팅 직후에는 어드레스 라인 20(A20)을 강제로 0으로 설정한다. 이는 8086이나 8088 CPU를 사용하던 이전 컴퓨터들의 작동 방식을 모방하기 위함이다.

하지만 보호 모드 메모리를 이용하기 위해서는 이 어드레스 라인 20을 CPU에서 출력되는 실제 주소로 전환하는 제어(A20 On)를 수행해야 한다. 문제는 A20 라인을 켜기 위한 I/O 포트 주소 등이 컴퓨터 기종마다 다르다는 점이다. 이 때문에 DOS 확장기를 포함하여 보호 모드 메모리를 사용하는 소프트웨어는 특정 하드웨어에 의존하게 되는 기종 종속성을 가지게 된다.

7. 3. 인터럽트 재배치

x86 계열 CPU는 초기의 8086 출시 당시 인터럽트 벡터 0부터 0x1F까지를 CPU 예외 처리용으로 예약했다. 그러나 IBM PCPC-9800 시리즈 같은 초기 개인용 컴퓨터는 이 예약된 영역의 일부를 BIOS나 하드웨어 인터럽트 처리에 할당하여 사용했다. 이후 80286 CPU가 개발되면서 새로운 예외들이 추가되었는데, 이로 인해 CPU 예외 처리와 BIOS 또는 하드웨어 인터럽트 처리에 사용되는 인터럽트 벡터가 서로 충돌하는 문제가 발생했다.[1]

80286 이후 CPU에서 추가된 예외들은 대부분 프로텍트 모드와 관련된 것이었다. 따라서 리얼 모드에서 작동할 때는 이러한 충돌이 큰 문제가 되지 않았지만, 프로텍트 모드에서는 인터럽트 벡터 충돌이 심각한 문제가 될 수 있었다. 이 문제를 해결하고 프로텍트 모드에서 하드웨어 인터럽트를 효율적으로 처리하기 위해, 인터럽트 컨트롤러(PIC)의 설정을 변경하여 하드웨어 인터럽트가 사용하는 인터럽트 벡터를 다른 번호로 옮기는 방법이 사용되었다. 이러한 인터럽트 벡터 변경 처리를 인터럽트 재배치(Interrupt Relocation)라고 부른다. BIOS 역시 프로텍트 모드에서 사용하려면 인터럽트 벡터 재배치가 필요할 수 있지만, 프로텍트 모드에서는 BIOS를 직접 호출하지 않는 방식으로 충돌을 피하기도 한다.[1]

PC/AT 호환기종, PC-9800 시리즈, FMR 시리즈 등 여러 기종에서 인터럽트 컨트롤러로 8259 칩을 사용했지만, 각 기종마다 컨트롤러가 연결된 I/O 주소가 달랐다. 이 때문에 인터럽트 벡터 재배치 처리 방식은 기종마다 달랐다. 따라서 프로텍트 모드를 사용하기 위해 인터럽트 재배치가 필요한 경우, 도스 확장자는 해당 기종에 맞는 방식으로 이를 처리해야 했다. 다만, FMR 시리즈나 FM TOWNS 시리즈의 경우, 설계 단계에서부터 인터럽트 벡터가 충돌하지 않도록 인터럽트 컨트롤러와 BIOS의 인터럽트 벡터가 할당되어 있었기 때문에 별도의 인터럽트 재배치가 필요하지 않았다.[1]

인터럽트 재배치는 반드시 필요한 것은 아니며, 하드웨어 인터럽트를 효율적으로 처리하기 위한 여러 방법 중 하나이다. 실제로 인터럽트를 관리하는 8259 컨트롤러에 인터럽트 발생 원인을 확인하는 명령(폴 워드 읽기)을 보내는 방식으로, 하드웨어 인터럽트 벡터를 재배치하지 않고도 인터럽트 핸들러가 현재 발생한 인터럽트가 하드웨어 인터럽트인지, 아니면 소프트웨어 인터럽트(폴트 및 트랩)인지 구분할 수 있다.[1]

7. 4. 가상 메모리 지원

32비트 도스 확장자는 IA-32 아키텍처의 페이징 기능을 활용하여 가상 메모리를 지원하는 경우가 많다. 이를 통해 프로그램은 실제 설치된 물리적 메모리의 크기보다 더 큰 메모리 공간을 사용할 수 있게 된다.

가상 메모리 시스템은 필요한 데이터가 물리적 메모리에 없을 때(페이지 부재) 디스크에서 해당 데이터를 불러온다. 동시에, 당장 사용되지 않는 데이터를 디스크 공간(스왑 공간)으로 내보내(스왑 아웃) 물리적 메모리 공간을 확보한다. 어떤 데이터를 디스크로 내보낼지 결정하기 위해, 시스템은 각 메모리 페이지의 사용 빈도와 같은 통계 정보를 지속적으로 추적해야 한다.

이러한 페이지 관리 및 통계 수집 과정에는 주기적으로 인터럽트를 발생시키는 인터벌 타이머와 이를 처리하는 인터럽트 핸들러가 필요하다. 그런데 인터럽트 핸들러는 하드웨어의 I/O 주소를 직접 제어해야 하는데, 이 주소는 컴퓨터 기종마다 다를 수 있다. 따라서 인터럽트 컨트롤러를 제어하는 프로그램 코드는 특정 하드웨어에 맞춰 작성되어야 하므로, 가상 메모리를 지원하는 도스 확장자는 필연적으로 특정 컴퓨터 기종에 종속되는 경향이 있다.

7. 5. CPU 리셋 회로 (16비트 DOS 익스텐더의 경우)

DOS 익스텐더는 리얼 모드와 프로텍트 모드를 번갈아 전환하며 동작한다. 그러나 80286 CPU는 프로텍트 모드에서 리얼 모드로 전환하는 유일한 방법이 CPU를 리셋하는 것뿐이었다.[10] 이 때문에 프로텍트 모드에서 리얼 모드로의 전환이 필요한 프로그램을 지원하기 위해, PC/AT 호환기종과 PC-9800 시리즈는 CPU만 리셋하는 별도의 회로를 갖추고 있었다.

이 CPU 리셋 회로는 기종마다 구현 방식이 달랐다. 따라서 80286 CPU를 사용하는 16비트 DOS 익스텐더처럼 프로텍트 모드에서 리얼 모드로 전환해야 하는 프로그램은 필연적으로 특정 기종에 의존하게 되었다. 또한, 80286을 리셋하면 CPU는 메모리 주소 0FFFFF0h로 점프하게 되는데, 리얼 모드로 전환된 후 다시 DOS 익스텐더로 제어를 넘기기 위해서는 해당 메모리 영역에 위치한 프로그램(일종의 프로텍트 모드 BIOS)의 도움이 필요했다. 이 BIOS의 사양 역시 기종마다 달랐기 때문에 호환성 문제가 발생했다.

결과적으로, 32비트 DOS 익스텐더보다 16비트 DOS 익스텐더를 다른 기종으로 이식하는 작업이 훨씬 복잡했다. 이러한 이식 작업의 어려움을 줄이기 위해, 일부 개발자들은 PC/AT 호환기종용 16비트 DOS 익스텐더를 PC-9800 시리즈 등으로 이식할 때 지원하는 CPU를 386 이상으로 한정하기도 했다. 이를 통해 CPU 리셋 회로 제어나 CPU 리셋 관련 BIOS 이식 문제를 회피할 수 있었다.

참조

[1] 서적 Extending DOS: A Programmer's Guide to Protected-Mode DOS Addison-Wesley Publishing Company, Inc.
[2] 간행물 Roll your own DOS extender: Part I CMP Technology 1990-10
[3] 간행물 Roll Your Own DOS Extender: Part II CMP Technology 1990-11
[4] 서적 DOS 5: A Developer's Guide https://archive.org/[...] Markt&Technik 1991
[5] 서적 DOS 6: A Developer's Guide Markt&Technik 1993
[6] 서적 DOS and Windows Protected Mode: Programming with DOS Extenders in C Addison-Wesley
[7] 웹사이트 HX DOS Extender https://www.japheth.[...]
[8] 웹사이트 FTN77 Fortran Compiler http://www.silverfro[...]
[9] 웹사이트 PMODE/W http://www.sid6581.n[...] 2023-12-13
[10] 문서 80286에서는, 비공개의LOADALL명령을 사용해도, 프로텍트모드에서 리얼모드에 돌아갈 수 없다.



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com