도스 API
1. 개요
도스 API는 86-DOS 및 MS-DOS 운영체제에서 사용된 시스템 호출 집합으로, CP/M과의 호환성을 위해 설계되었다. MS-DOS 2.0에서 유닉스 개념을 도입하여 확장되었으며, MS-DOS 5 이후 변경 사항 없이 유지되었다. 윈도우 9x는 부트로더로 도스를 사용하고, 윈도우 NT 계열 운영체제는 가상 머신을 통해 도스 API를 지원한다. DOS API는 인터럽트 벡터와 INT 21h 서비스를 통해 다양한 기능을 제공하며, MS-DOS 및 호환 운영체제에서 지원된다.
-
운영 체제 API -
GEM (소프트웨어)
GEM은 Digital Research가 개발한 GUI로, MS-DOS 환경에서 매킨토시와 유사한 경험을 제공하려 했으나, 애플과의 소송과 오픈 소스화 이후 FreeGEM, OpenGEM 등의 파생 프로젝트로 개발이 이어졌다. -
운영 체제 API -
IBM 탑뷰
IBM TopView는 1985년 IBM이 출시한 MS-DOS 기반 멀티태스킹 운영 환경으로, 프로그램 동시 실행 기능과 PIF 파일 형식을 제공했으나, 메모리 문제, 호환성 문제, 사용자 인터페이스 문제 등으로 경쟁력을 잃어 단종되었고, 이후 MS-DOS와 윈도우 개발에 영향을 미쳤다. -
X86 아키텍처 -
물리 주소 확장
물리 주소 확장(PAE)은 x86 아키텍처에서 32비트 주소를 36비트 이상으로 확장하여 CPU가 4GB 초과 물리 메모리에 접근하도록 하는 기술로, 페이지 테이블 확장 및 추가 페이지 테이블을 통해 최대 64GB 메모리를 지원하며 AMD64 아키텍처에서 가상 주소 공간 확장에 사용되고 운영 체제, 칩셋, 마더보드의 지원이 필요하며 CPUID 플래그로 지원 여부를 확인한다. -
X86 아키텍처 -
X86 가상화
X86 가상화는 x86 아키텍처 기반 시스템에서 가상 머신을 구현하는 기술로, 소프트웨어 기반 가상화와 하드웨어 지원 가상화로 나뉘며, CPU 제조사의 가상화 확장 기술을 활용하여 가상 머신의 성능을 향상시킨다. -
인터럽트 -
프로그래머블 인터럽트 컨트롤러
프로그래머블 인터럽트 컨트롤러(PIC)는 컴퓨터 시스템에서 인터럽트 요청을 관리하며, 인터럽트 요청 레지스터 등을 사용하여 인터럽트를 처리하고 다양한 우선순위 체계를 지원하며, x86 아키텍처에서는 인텔 8259가 널리 사용되었다. -
인터럽트 -
인텔 8259
인텔 8259는 하드웨어 장치의 인터럽트 요청을 관리하여 CPU에 전달하는 인터럽트 컨트롤러이며, 최대 64개의 IRQ를 제공하기 위해 캐스케이딩될 수 있고, DOS 및 Windows와의 호환성을 위해 다양한 작동 모드를 지원한다.
2. 역사
DOS API는 1981년 MS-DOS 1.0과 함께 처음 등장하여 1990년대 중반까지 발전했다. 초기에는 CP/M과의 호환성을 위해 설계되었으며, 파일 제어 블록(FCB)을 이용하여 파일에 접근했다. 이후 MS-DOS 2.0에서 파일 핸들, 계층 디렉터리, 장치 입출력 제어와 같은 유닉스 개념이 도입되면서 크게 확장되었다. MS-DOS 3.1에서는 네트워크 리다이렉터 지원이, MS-DOS 3.31에서는 32MB 이상의 하드 디스크 지원이 추가되었다. MS-DOS 5에서는 상위 메모리 블록(UMB) 사용 지원이 추가되었고, 이후 DOS API에는 큰 변화가 없었다.
2.1. 초기 (MS-DOS 1.x ~ 2.x)
86-DOS와 MS-DOS 1.0의 초기 DOS API는 CP/M과 기능적으로 호환되도록 설계되었다. 파일은 파일 제어 블록(FCB)을 사용하여 접근했다. DOS API는 MS-DOS 2.0에서 파일 핸들을 사용한 파일 접근, 계층적 디렉터리, 장치 입출력 제어 등 유닉스의 여러 개념을 포함하여 크게 확장되었다.
2.2. 발전 (MS-DOS 3.x ~ 6.x)
MS-DOS 2.0에서는 파일 핸들을 사용한 파일 접근, 계층적 디렉터리, 장치 입출력 제어 등 유닉스의 여러 개념을 도입하여 도스 API가 크게 확장되었다. DOS 3.1에서는 네트워크 리디렉터 지원이 추가되었다. MS-DOS 3.31에서는 32MB보다 큰 하드 디스크를 지원하도록 INT 25h/26h 함수가 개선되었다. MS-DOS 5에서는 상위 메모리 블록(UMB) 사용 지원이 추가되었다. 이후 독립적인 DOS 운영 체제 개발이 중단되면서 MS-DOS 5 이후 DOS API는 변경되지 않았다.
2.3. 윈도우와의 통합 (MS-DOS 7.x ~ 8.0)
윈도우 9x에서 도스는 보호 모드 운영 체제와 그래픽 셸(GUI)을 불러들이는 부트로더로 사용되었다. 가상 도스 머신(VDM)을 통해 접근할 수 있었으나, 윈도우를 로드하지 않고 리얼 모드 MS-DOS 7.0으로 직접 시동할 수도 있었다. 도스 API는 강화된 국제화 지원 및 긴 파일 이름 지원으로 강화되었는데, 긴 파일 이름 지원은 VDM을 통해서만 이용할 수 있었다. 윈도우 95 OSR2부터는 도스가 7.1로 업데이트되면서 FAT32 지원이 추가되었으며, DOS API가 이를 지원하는 기능이 추가되었다. 윈도우 98 및 윈도우 미 또한 MS-DOS 7.1 API를 포함하고 있었지만, MS-DOS 8.0을 표방했다.
MS-DOS 버전과 윈도우 버전은 다음과 같다.
3. 윈도우 NT와 DOS API
윈도우 NT 계열 운영 체제(윈도우 XP, 윈도우 비스타, 윈도우 7, 윈도우 8 등)는 MS-DOS 기반은 아니지만 가상 머신 NTVDM을 사용하여 도스 API를 처리한다. NTVDM은 가상 8086 모드(80386 이상의 프로세서에서 이용할 수 있는 보호 모드 안의 리얼 모드의 에뮬레이션)에서 도스 프로그램을 실행함으로써 동작하며, 도스 5.0 API를 지원한다. 리눅스용 DOSEMU는 비슷한 접근 방식을 사용한다.
4. DOS API의 구성
DOS API는 인터럽트 벡터를 통해 호출되는 함수들의 집합으로 구성된다. 각 함수는 특정 인터럽트 벡터에 연결되어 있으며, 해당 인터럽트를 호출하면 연결된 함수가 실행된다. 주요 인터럽트 벡터와 INT 21h 서비스에 대한 자세한 내용은 하위 섹션에서 확인할 수 있다.
4.1. 인터럽트 벡터
인터럽트 벡터는 특정 기능을 수행하는 도스 API 함수의 주소를 가리키는 포인터이다. 주요 인터럽트 벡터는 다음과 같다.
| 인터럽트 벡터 | 설명 | 버전 | 비고 |
|---|---|---|---|
20h | 프로그램 끝내기 | 1.0 이상 | 도스 커널에 추가됨 |
21h | 주요 도스 API | 1.0 이상 | 도스 커널에 추가됨 |
22h | 프로그램 끝내기 주소 | 1.0 이상 | 프로그램 호출 시 주소 반환 |
23h | Control-C 핸들러 주소 | 1.0 이상 | 기본 핸들러는 도스 셸(일반적으로 COMMAND.COM)에 있음 |
24h | 심각한 오류 핸들러 주소 | 1.0 이상 | 기본 핸들러는 도스 셸(일반적으로 COMMAND.COM)에 있음 |
25h | 절대 디스크 읽기 | 1.0 이상 | 도스 커널에 추가됨, 도스 3.31에서 강화되어 최대 2GB 파티션 지원 |
26h | 절대 디스크 쓰기 | 1.0 이상 | 도스 커널에 추가됨, 도스 3.31에서 강화되어 최대 2GB 파티션 지원 |
27h | 종료 후 상주 | 1.0 이상 | 도스 1.0 및 도스 2.0 이상의 도스 커널에서 COMMAND.COM에 추가됨 |
28h | 유휴 호출 | 2.0 이상 | 입력을 기다릴 때 도스 커널이 호출함 |
29h | 고속 콘솔 출력 | 2.0 이상 | 내장 콘솔 장치 드라이버나, ANSI.SYS와 같은 대안 드라이버에 의해 추가됨 |
2Ah | 네트워크 및 중요 섹션 | 3.0 이상 | 네트워크 소프트웨어와의 상호 작용을 목적으로 도스 커널이 호출함 |
2Bh | 사용 안 함 | ||
2Ch | 사용 안 함 | ||
2Dh | 사용 안 함 | ||
2Eh | 임시 항목 다시 불러오기(Reload transient) | 2.0 이상 | COMMAND.COM에 추가됨 |
2Fh | 다중 송신 | 3.0 이상 | 하부 함수 번호에 따라 도스 커널 및 다양한 프로그램(PRINT, MSCDEX, DOSKEY, APPEND 등)에 추가됨 |
4.2. INT 21h 서비스
`INT 21h`는 도스 API의 핵심적인 인터럽트이며, 다양한 기능을 제공하는 함수들을 호출하는 데 사용된다. `INT 21h`를 호출할 때, AH 레지스터에 기능 번호를 설정하고, 필요한 경우 다른 레지스터에 추가적인 매개변수를 설정한다.
다음은 `INT 21h`를 통해 제공되는 주요 기능들이다.
| AH 값 | 설명 | 버전 |
|---|---|---|
| 00h | 프로그램 끝내기 | 1.0 이상 |
| 01h | 문자 입력 | 1.0 이상 |
| 02h | 문자 출력 | 1.0 이상 |
| 03h | 보조 입력 | 1.0 이상 |
| 04h | 보조 출력 | 1.0 이상 |
| 05h | 프린터 출력 | 1.0 이상 |
| 06h | 직접 콘솔 입출력 | 1.0 이상 |
| 07h | echo 없이 직접 콘솔 입력 | 1.0 이상 |
| 08h | echo 없이 콘솔 입력 | 1.0 이상 |
| 09h | 문자열 표시 | 1.0 이상 |
| 0Ah | 버퍼 처리된 키보드 입력 | 1.0 이상 |
| 0Bh | 입력 상태 가져오기 | 1.0 이상 |
| 0Ch | 입력 버퍼 및 입력 플러시(flush) 처리 | 1.0 이상 |
| 0Dh | 디스크 초기화 | 1.0 이상 |
| 0Eh | 기본 드라이브 설정 | 1.0 이상 |
| 0Fh | 파일 열기 | 1.0 이상 |
| 10h | 파일 닫기 | 1.0 이상 |
| 11h | 첫 번째 파일 찾기 | 1.0 이상 |
| 12h | 다음 파일 찾기 | 1.0 이상 |
| 13h | 파일 삭제 | 1.0 이상 |
| 14h | 연속 읽기 | 1.0 이상 |
| 15h | 연속 쓰기 | 1.0 이상 |
| 16h | 파일 만들기/끊기 | 1.0 이상 |
| 17h | 파일 이름 변경 | 1.0 이상 |
| 19h | 기본 드라이브 가져오기 | 1.0 이상 |
| 1Ah | 디스크 전송 주소 설정 | 1.0 이상 |
| 1Bh | 기본 드라이브에 대한 할당 정보 가져오기 | 1.0 이상 |
| 1Ch | 지정된 드라이브에 대한 할당 정보 가져오기 | 1.0 이상 |
| 1Fh | 기본 드라이브에 대한 디스크 변수 블록 가져오기 | 1.0 이상 |
| 21h | 랜덤 읽기 | 1.0 이상 |
| 22h | 랜덤 쓰기 | 1.0 이상 |
| 23h | 레코드의 파일 크기 가져오기 | 1.0 이상 |
| 24h | 랜덤 레코드 번호 설정 | 1.0 이상 |
| 25h | 인터럽트 벡터 설정 | 1.0 이상 |
| 26h | PSP 만들기 | 1.0 이상 |
| 27h | 랜덤 블록 읽기 | 1.0 이상 |
| 28h | 랜덤 블록 쓰기 | 1.0 이상 |
| 29h | 파일 이름 분석(Parse) | 1.0 이상 |
| 2Ah | 날짜 가져오기 | 1.0 이상 |
| 2Bh | 날짜 설정 | 1.0 이상 |
| 2Ch | 시간 가져오기 | 1.0 이상 |
| 2Dh | 시간 설정 | 1.0 이상 |
| 2Eh | 유효 플래그 설정 | 1.0 이상 |
| 2Fh | 디스크 전송 주소 가져오기 | 2.0 이상 |
| 30h | 도스 버전 가져오기 | 2.0 이상 |
| 31h | 종료 후 상주 | 2.0 이상 |
| 32h | 지정된 드라이브에 대한 디스크 변수 블록 가져오기 | 2.0 이상 |
| 33h | Ctrl-Break 가져오기 또는 설정 | 2.0 이상 |
| 34h | InDOS 플래그 포인터 가져오기 | 2.0 이상 |
| 35h | 인터럽트 벡터 가져오기 | 2.0 이상 |
| 36h | 디스크 남은 공간 가져오기 | 2.0 이상 |
| 37h | 스위치 문자 가져오기 또는 설정 | 2.0 이상 |
| 38h | 국가 정보 가져오기 또는 설정 | 2.0 이상 |
| 39h | 하위 디렉터리 만들기 | 2.0 이상 |
| 3Ah | 하위 디렉터리 제거 | 2.0 이상 |
| 3Bh | 현재 디렉터리 변경 | 2.0 이상 |
| 3Ch | 파일 만들기 또는 끊기 | 2.0 이상 |
| 3Dh | 파일 열기 | 2.0 이상 |
| 3Eh | 파일 닫기 | 2.0 이상 |
| 3Fh | 파일 또는 장치 읽기 | 2.0 이상 |
| 40h | 파일 또는 장치 쓰기 | 2.0 이상 |
| 41h | 파일 삭제 | 2.0 이상 |
| 42h | 파일 포인터 이동 | 2.0 이상 |
| 43h | 파일 특성 가져오기 또는 설정 | 2.0 이상 |
| 44h | 장치에 대한 입출력 제어 | 2.0 이상 |
| 45h | 핸들 복제 | 2.0 이상 |
| 46h | 핸들 우회 | 2.0 이상 |
| 47h | 현재 디렉터리 가져오기 | 2.0 이상 |
| 48h | 메모리 할당 | 2.0 이상 |
| 49h | 메모리 해제 | 2.0 이상 |
| 4Ah | 메모리 다시 할당 | 2.0 이상 |
| 4Bh | 프로그램 실행 | 2.0 이상 |
| 4Ch | 반환 코드로 끝내기 | 2.0 이상 |
| 4Dh | 프로그램 반환 코드 가져오기 | 2.0 이상 |
| 4Eh | 첫 번째 파일 찾기 | 2.0 이상 |
| 4Fh | 다음 파일 찾기 | 2.0 이상 |
| 50h | 현재의 PSP 설정 | 2.0 이상 |
| 51h | 현재의 PSP 가져오기 | 2.0 이상 |
| 52h | 도스 내부 포인터 가져오기 (SYSVARS) | 2.0 이상 |
| 53h | 디스크 변수 블록 만들기 | 2.0 이상 |
| 54h | 유효 플래그 가져오기 | 2.0 이상 |
| 55h | 프로그램 PSP 만들기 | 2.0 이상 |
| 56h | 파일 이름 변경 | 2.0 이상 |
| 57h | 파일 날짜 및 시간 가져오기 또는 설정 | 2.0 이상 |
| 58h | 할당 전략 가져오기 또는 설정 | 2.11 이상 |
| 59h | 확장 오류 정보 가져오기 | 3.0 이상 |
| 5Ah | 고유 파일 만들기 | 3.0 이상 |
| 5Bh | 파일 새로 만들기 | 3.0 이상 |
| 5Ch | 파일 잠금 / 잠금 해제 | 3.0 이상 |
| 5Dh | 파일 공유 기능 | 3.0 이상 |
| 5Eh | 네트워크 기능 | 3.0 이상 |
| 5Fh | 네트워크 우회 기능 | 3.0 이상 |
| 60h | 파일 이름 제한 | 3.0 이상 |
| 62h | 현재의 PSP 가져오기 | 3.0 이상 |
| 63h | DBCS 리드 바이트 테이블 포인터(lead byte table pointer) 가져오기 | 3.0 이상 |
| 64h | 외부 이벤트 플래그 대기 설정 | 3.2 이상 |
| 65h | 확장 국가 정보 가져오기 | 3.3 이상 |
| 66h | 코드 페이지 가져오기 또는 설정 | 3.3 이상 |
| 67h | 핸들 수 설정 | 3.3 이상 |
| 68h | 파일 위탁(commit) | 3.3 이상 |
| 69h | 미디어 ID 가져오기 또는 설정 | 4.0 이상 |
| 6Ah | 파일 위탁(commit) | 4.0 이상 |
| 6Ch | 파일 확장 열기/만들기 | 4.0 이상 |
5. DOS API 지원 운영체제
다음은 DOS API를 지원하는 운영 체제 목록이다.
* MS-DOS: 가장 널리 사용되는 도스 API 구현체이다.
* IBM PC DOS: IBM의 MS-DOS OEM 버전이다.
* DR-DOS: Novell DOS, PalmDOS, OpenDOS 등을 포함하는 Digital Research DOS 제품군이다.
* PTS-DOS: PhysTechSoft 및 Paragon DOS 복제본으로, S/DOS를 포함한다.
* ROM-DOS: Datalight ROM DOS 버전이다.
* FreeDOS: 자유 오픈 소스 DOS 복제본이다.
* ReactOS (IA-32 및 x86-64 버전)
* 윈도우 95: MS-DOS 7.0을 포함한다.
* 윈도우 98: MS-DOS 7.1을 포함한다.
* 윈도우 98 SE: MS-DOS 7.1을 포함한다.
* 윈도우 미: MS-DOS 8.0을 포함한다.
* 윈도우 NT (64비트 버전을 제외한 모든 버전): NTVDM을 이용하여 DOS API를 처리한다. NTVDM은 DOS 5.0 API를 지원한다.
윈도우 9x에서는 DOS가 프로텍트 모드 시스템과 GUI 셸을 로드하는 부트 로더로 사용되었다. DOS는 일반적으로 VDM에서 액세스되었지만, 윈도우를 로드하지 않고 리얼 모드 MS-DOS 7.0으로 부팅하는 것도 가능했다. DOS API는 확장 국제화 지원과 LFN 지원으로 확장되었지만, LFN은 VDM에서만 이용 가능했다. 윈도우 95 OSR2에서는 DOS가 7.1로 업데이트되어 FAT32 지원이 추가되었으며, DOS API에 기능이 추가되었다.
6. 평가 및 영향
DOS API는 초기 86-DOS 및 MS-DOS 1.0에서 CP/M과 호환되도록 설계되었다. 파일은 파일 제어 블록(FCB)을 사용하여 접근했다. MS-DOS 2.0에서는 유닉스의 여러 개념을 도입하여 크게 확장되었는데, 파일 핸들을 사용한 파일 접근, 계층적 디렉터리, 장치 입출력(I/O) 제어 등이 추가되었다. DOS 3.1에서는 네트워크 리디렉터 지원이 추가되었고, MS-DOS 3.31에서는 INT 25h/26h 함수가 개선되어 32MB보다 큰 하드 디스크를 지원하게 되었다. MS-DOS 5는 상위 메모리 블록(UMB) 사용을 지원했다. MS-DOS 5 이후 DOS API는 후속 DOS 단독 릴리스에서 변경되지 않았다.