보호 모드
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
보호 모드는 x86 아키텍처 프로세서의 작동 모드 중 하나로, 시스템의 안정성과 보안을 향상시키기 위해 설계되었다. 최초의 x86 프로세서인 인텔 8086은 1MB의 메모리에 접근할 수 있었지만, 메모리 가격 하락과 사용량 증가로 인해 1MB 제한은 문제가 되었다. 인텔 80286은 16비트 보호 모드를 도입하여 16MB의 메모리를 사용할 수 있게 했지만, 소프트웨어 호환성 문제와 256KB 메모리 제한 등의 한계가 있었다. 인텔 80386은 32비트 보호 모드를 지원하여 최대 4GB의 메모리에 접근할 수 있게 되었고, 가상 8086 모드를 통해 이전 8086 코드를 실행할 수 있게 되었다. 현재 보호 모드는 마이크로소프트 윈도우, 리눅스 등 x86 아키텍처에서 실행되는 거의 모든 현대 운영 체제에서 사용되고 있으며, 권한 수준, 메모리 보호, 가상 메모리, 멀티태스킹 등의 주요 기능을 제공한다.
더 읽어볼만한 페이지
- X86 운영 모드 - 언리얼 모드
언리얼 모드는 x86 프로세서에서 세그먼트 디스크립터를 수정하여 메모리 접근을 확장하고 16비트 코드가 thunking 없이 실제 모드 코드를 호출하도록 하는 기술이다. - X86 운영 모드 - 리얼 모드
리얼 모드는 x86 아키텍처에서 8086 프로세서의 동작을 에뮬레이트하는 모드로서, 8086/8088 소프트웨어 호환성을 위해 설계되었으며, 최신 CPU에서도 지원되지만 인텔은 향후 CPU에서 제거할 것을 제안했다. - 프로그래밍 언어 구현 - 어셈블리어
어셈블리어는 사람이 이해하기 쉬운 니모닉 기호로 기계어 명령을 표현하는 저수준 프로그래밍 언어로서, 각 프로세서마다 사양이 다른 어셈블리어가 존재하며 하드웨어 직접 제어, 성능 최적화, 저수준 시스템 프로그래밍 등에 활용된다. - 프로그래밍 언어 구현 - 컴파일러
컴파일러는 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 저급 언어로 변환하는 프로그램으로, 어휘 분석, 구문 분석, 의미 분석, 최적화, 코드 생성 등의 단계를 거쳐 목적 코드를 생성하며, 네이티브 컴파일러, 크로스 컴파일러 등으로 분류되어 다양한 분야에서 활용된다. - 컴퓨터에 관한 - 고속 패킷 접속
고속 패킷 접속(HSPA)은 3세대 이동통신(3G)의 데이터 전송 속도를 높이는 기술 집합체로, 고속 하향/상향 패킷 접속(HSDPA/HSUPA)을 통해 속도를 개선하고 다중 안테나, 고차 변조, 다중 주파수 대역 활용 등의 기술로 진화했으나, LTE 및 5G 기술 발전으로 현재는 상용 서비스가 중단되었다. - 컴퓨터에 관한 - 데이터베이스
데이터베이스는 여러 사용자가 공유하고 사용하는 정보의 집합으로, 데이터베이스 관리 시스템을 통해 접근하며, 검색 및 갱신 효율을 높이기 위해 고도로 구조화되어 있고, 관계형, NoSQL, NewSQL 등 다양한 모델로 발전해왔다.
보호 모드 | |
---|---|
일반 정보 | |
명칭 | 보호 모드 |
영어 명칭 | Protected mode |
일본어 명칭 | プロテクトモード (Purotekuto mōdo) |
조선어 명칭 | 보호방식 (보호 방식) |
기술 | |
종류 | x86 CPU의 작동 모드 |
목적 | 시스템 보호 |
특징 | 메모리 보호 멀티태스킹 지원 가상 메모리 지원 |
도입 시기 | 인텔 286 (1982년) |
발전 | 인텔 386에서 더욱 발전 (1985년) |
작동 방식 | |
메모리 관리 | 세그먼트 및 페이지 테이블 사용 |
권한 수준 | 0 ~ 3 (0이 가장 높음, 운영체제 커널은 0에서 실행) |
태스크 전환 | 하드웨어 지원을 통해 효율적인 태스크 전환 가능 |
시스템 보호 | |
역할 | 프로그램 간의 메모리 침범 방지 운영체제 영역 보호 사용자 프로그램의 시스템 자원 접근 제한 |
이점 | 시스템 안정성 향상 및 보안 강화 |
활용 분야 | |
운영체제 | Windows, 리눅스, macOS 등 대부분의 현대 운영체제 |
임베디드 시스템 | 일부 임베디드 시스템에서 메모리 보호 및 멀티태스킹을 위해 사용 |
2. 역사
보호 모드는 인텔 80286 이후 x86 CPU에서 지원하는 명령어 집합 아키텍처의 주요 동작 모드 중 하나이다. 이름 그대로 계층적 특권 관리(링 프로텍션)나 태스크 간 메모리 보호 기능을 수행하는 것이 특징이다.[47][48] 보호 모드를 지원하는 프로세서라도 부팅 시에는 이전 인텔 8086과의 호환성을 위해 리얼 모드로 시작한다.[47][48]
인텔 8086 시절의 1메가바이트(MB) 메모리 제한은[9][53] 당시에는 충분한 용량으로 여겨졌으나,[10][54] 메모리 가격 하락과 프로그램의 메모리 요구량 증가로 점차 큰 제약이 되었다.[11][55] 이러한 문제를 해결하기 위해 인텔은 1982년 80286 프로세서를 출시하며 x86 아키텍처에 처음으로 보호 모드를 도입했다.[50] 80286의 보호 모드는 24비트 주소 지정을 통해 최대 16MB까지 메모리를 확장할 수 있게 했으나,[9] 리얼 모드로의 전환 제약 등 여러 한계점으로 인해 Coherent[12], 마이크로소프트 Xenix[13], Minix[14] 등 일부 운영 체제에서만 제한적으로 사용되는 등 널리 사용되지는 못했다.[11][15]
1985년 출시된 80386 프로세서는 이러한 문제점들을 상당 부분 해결하고 보호 모드를 크게 확장했다.[7][11][51] 386은 32비트 주소 버스와 32비트 세그먼트 오프셋을 도입하여 최대 4기가바이트(GB)의 메모리 공간을 지원했으며,[16][57] 페이징 기능과 가상 8086 모드 등 운영 체제의 보안과 안정성을 높이는 새로운 기능들을 추가했다.[17][19]
이러한 개선 덕분에 보호 모드는 이후 마이크로소프트 윈도우, 리눅스 등 x86 아키텍처 기반의 거의 모든 현대 운영 체제에서 표준 동작 모드로 자리 잡게 되었다.[18][52][59]
2. 1. 8086의 한계와 16비트 보호 모드
최초의 x86 프로세서인 인텔 8086과 그 변종 인텔 8088은 20비트 주소 버스를 가지고 있어 최대 1메가바이트(MB)의 메모리에 접근할 수 있었다.[9][53] 당시 1MB는 비교적 큰 용량으로 여겨졌기에[10][54], IBM PC 설계 당시 초기 640킬로바이트(KB)는 응용 프로그램과 운영 체제용으로, 나머지 384KB는 BIOS 및 주변 기기용으로 할당되었다.[11][55] 8086은 세그먼트 방식 가상 메모리를 염두에 둔 세그먼트 레지스터를 가졌으나, 주소 변환 방식이 단순하고 작업 간 메모리 보호 기능은 없었다.메모리 가격 하락과 사용량 증가로 1MB 제한은 큰 문제점이 되었고, 인텔은 이를 해결하기 위해 80286 프로세서와 함께 보호 모드를 도입했다.[11][55]
80286의 16비트 보호 모드는 24비트 물리 주소 공간(최대 16MB) 접근을 가능하게 했으며,[9][53] 세그먼트 레지스터를 이용한 세그먼트 방식 가상 메모리 환경을 제공했다. 각 세그먼트는 최대 64KB 크기를 가질 수 있었다. 보호 모드는 할당된 메모리 외 접근 시 예외를 발생시켜 시스템을 보호했다. 또한, 세그먼트 디스크립터의 "Present 비트"를 이용한 기본적인 가상 메모리 관리가 가능하여, 디스크로 스왑 아웃된 세그먼트 접근 시 "세그먼트 부재 예외"(INT 11)를 통해 운영 체제가 해당 내용을 다시 메모리로 스왑 인하고 프로그램을 재개할 수 있었다.
하지만 80286의 초기 보호 모드는 여러 한계로 널리 쓰이지 못했다.[11][55] 가장 큰 단점은 프로세서 재설정 없이는 리얼 모드로 돌아갈 수 없어 BIOS나 MS-DOS 호출이 불가능하다는 점이었다.[15][56] 또한, 4개의 세그먼트 레지스터를 통해 동시에 접근 가능한 메모리가 4 × 64KB, 즉 256KB로 제한되었고,[11][55] 보호 모드에서 세그먼트 레지스터 변경 시 메모리에서 6바이트 크기의 디스크립터를 읽어야 해 8086/8088보다 훨씬 느렸다. 이 때문에 128KB 이상 데이터 구조 처리가 비효율적이었다. 메모리 보호 위반 시 발생하는 "일반 보호 예외"(INT 13)는 복구가 불가능하여 해당 프로세스를 종료해야만 했다. 페이지 단위 스왑 기능 부재도 한계였다.
이러한 이유로 80286 보호 모드는 Coherent[12], 마이크로소프트 Xenix[13], Minix[14] 등 일부 운영 체제에서만 제한적으로 사용되었다.
80286은 하위 호환성을 위해 부팅 시 리얼 모드로 시작했다.[4][47] 리얼 모드에서는 8086과 거의 동일하게 동작하여 기존 소프트웨어를 수정 없이 실행할 수 있었다. 확장된 기능(16MB 메모리 접근, 메모리 보호 등)을 사용하려면 운영 체제가 필요한 설정을 마친 후 보호 모드로 전환해야 했다.[9][53] 1MB를 넘는 메모리 영역(HMA 제외)은 리얼 모드에서 접근할 수 없어 실질적으로 보호 모드 전용이었고, 이를 통칭 프로텍트 메모리(Extended Memory)라고 불렀다.
2. 2. 32비트 보호 모드의 등장과 발전

32비트 보호 모드는 인텔 80386 (이하 386) 프로세서부터 지원되기 시작했다. 1985년에 출시된 386은 이전 80286 보호 모드가 널리 채택되지 못하게 했던 여러 문제점을 해결하고자 했다.[7][11][55] 386은 32비트 주소 버스를 사용하여 최대 232 바이트, 즉 4GB의 메모리 공간에 접근할 수 있게 되었다.[16][57] 또한, 세그먼트 크기도 32비트로 확장되어, 여러 세그먼트를 번거롭게 전환하지 않고도 4GB 전체 주소 공간을 활용할 수 있게 되었다.[16][57]
32비트 보호 모드는 단순히 주소 공간 확장 외에도 여러 중요한 기능을 도입했다. 대표적으로 페이징 기법을 지원하여 가상 메모리를 효율적으로 관리하고, 물리 주소로의 변환을 가능하게 했다. 기본 페이지 크기는 4KB이며, 페이지 테이블 역시 4KB 크기로 1024개의 항목을 저장하여 4GB 논리 공간 전체를 관리할 수 있다. 또한, 이전 리얼 모드와의 호환성을 위해 가상 8086 모드라는 특별한 작업 모드를 제공했다. 386 이후 보호 모드에 추가된 주요 기능은 다음과 같다.[2][45]
기능 | 설명 |
---|---|
페이징 | 가상 메모리 관리 및 물리 주소 변환 지원 |
32비트 물리 및 가상 주소 공간 | 최대 4GB 메모리 접근 가능 (단, 80386SX 등 일부 모델은 32비트 물리 주소 공간 미지원[21][60]) |
32비트 세그먼트 오프셋 | 단일 세그먼트 내에서 4GB까지 접근 가능 |
리얼 모드 복귀 기능 | 시스템 리셋 없이 보호 모드에서 리얼 모드로 전환 가능 |
가상 8086 모드 | 보호 모드 환경 내에서 8086 환경 에뮬레이션 지원 |
보호 모드는 시스템의 안정성과 보안을 개선할 목적으로 운영 체제가 응용 소프트웨어를 더 효과적으로 제어하도록 돕는 여러 새로운 기능을 제공한다.[3][26] 이러한 기능들은 적절한 하드웨어 지원이 있어야 효과적으로 구현될 수 있다.[26]
가상 8086 모드는 멀티유저 DOS 환경을 구현하려 했던 286 보호 모드의 한계를 극복하고, 기존 8086용으로 작성된 프로그램들을 시스템 보안이나 안정성을 해치지 않으면서 다른 작업과 동시에 실행할 수 있도록 설계되었다.[19][34] 하지만 모든 프로그램과의 완벽한 하위 호환성을 보장하지는 못했다. 세그먼트 조작, 특권 명령어 사용, 직접적인 하드웨어 접근, 자기 수정 코드 등을 사용하는 프로그램은 예외 처리를 발생시켰고,[35] 입출력(I/O) 명령어 사용 시 트랩 발생으로 성능 저하를 유발하기도 했다.[36] 이 때문에 일부 레거시 시스템 프로그램은 가상 8086 모드에서 실행될 수 없었으며, 윈도우 NT와 같은 운영체제는 이러한 호환성 문제를 감수하고 시스템 안정성을 우선시하는 방향으로 개발되었다.[37] 보호 모드 자체를 가상화하는 하드웨어 x86 가상화 기술은 386 출시 후 20년이 더 지나서야 등장했다.[20]
초기 운영 체제들은 보호 모드를 다양한 방식으로 활용했다. OS/2 1.x 버전은 보호 모드와 리얼 모드 간 전환을 시도했지만, 이는 느리고 불안정한 방식이었다. 리얼 모드 프로그램이 시스템 전체를 다운시킬 위험이 있었기 때문이다. 윈도우 3.0은 16비트 보호 모드에서 리얼 모드 프로그램을 실행할 수 있도록 했지만, 리얼 모드의 단일 권한 수준 모델을 유지하여 응용 프로그램이 인터럽트 후킹이나 하드웨어 직접 접근을 할 수 있었다. 이러한 방식은 윈도우 9x 시리즈까지 이어졌다. 윈도우 3.1부터는 리얼 모드 지원이 중단되었다.
32비트 보호 모드는 이후 마이크로소프트 윈도우, 리눅스 등 x86 아키텍처 기반의 거의 모든 현대 운영 체제에서 표준으로 사용되고 있다.[18][59] 현대 32비트 운영체제에서는 여전히 가상 8086 모드를 사용하여 DPMI 호환 DOS 확장자 프로그램이나 윈도우 3.x 응용 프로그램 등을 가상 DOS 머신이나 Windows on Windows 같은 서브시스템을 통해 실행하기도 한다. 하지만 롱 모드로 동작하는 64비트 운영체제에서는 가상 8086 모드가 제거되어 더 이상 사용되지 않는다.
3. 주요 기능
보호 모드는 인텔 80286 이후 x86 계열 CPU의 주요 동작 모드로, 그 이름처럼 계층적인 특권 관리(링 프로텍션)나 태스크 간 메모리 보호와 같은 기능을 수행할 수 있다. 80286 프로세서 출시와 함께 1982년 처음 도입되었고[50], 1985년 80386 프로세서에서 기능이 확장되었다.[51] 보호 모드는 이후 x86 아키텍처 발전의 기반이 되었다.[52]
보호 모드의 주요 기능들은 다음과 같다.
386 프로세서에서는 보호 모드에 다음과 같은 중요한 기능들이 추가되었다.[45]
이러한 기능들은 운영 체제가 시스템 자원을 효과적으로 관리하고, 멀티태스킹 환경을 안정적으로 지원하며, 시스템 전체의 보안과 안정성을 향상시키는 기반이 되었다.[46][61] (멀티태스킹 지원에 대한 상세 내용은 멀티태스킹 섹션 참고)
3. 1. 권한 수준 (Privilege Levels)
보호 모드에는 0부터 3까지 네 단계의 권한 수준이 있다. 이 권한 수준은 링(ring)이라고도 부르며, 숫자가 낮을수록 더 높은 권한을 가진다. 즉, 링 0이 가장 높은 권한 수준이고 링 3이 가장 낮은 권한 수준이다.[27][62] 이러한 링 구조는 시스템 소프트웨어가 특정 작업(task)이 데이터에 접근하거나, 콜 게이트를 사용하거나, 특별한 권한이 필요한 명령을 실행하는 것을 제한하기 위해 사용된다.[27][62] 이를 통해 시스템의 안정성과 보안을 높일 수 있다.[46]
대부분의 현대 운영 체제 환경에서는 커널과 중요한 장치 드라이버들이 가장 높은 권한 수준인 링 0에서 실행된다. 반면, 일반적인 응용 프로그램들은 가장 낮은 권한 수준인 링 3에서 실행된다.[27][62] 낮은 권한 수준(예: 링 3)의 코드가 높은 권한 수준(예: 링 0)의 기능을 호출하려면, 정해진 통로인 콜 게이트나 시스템 호출(system call), 예외(exception) 처리 등을 거쳐야 한다.[62]
3. 2. 메모리 보호
보호 모드의 주요 특징 중 하나는 태스크 간의 메모리 보호 기능이다. 이는 운영 체제가 응용 소프트웨어를 더 효과적으로 제어하여 시스템의 안정성과 보안을 높이는 데 기여한다.[46][61]
메모리 보호는 주로 세그먼트 방식을 통해 이루어진다. 보호 모드에서는 메모리 상에 '''글로벌 디스크립터 테이블'''(GDT)과 '''로컬 디스크립터 테이블'''(LDT)이라는 구조체 배열을 관리한다. 각 테이블은 최대 8192개의 디스크립터를 가질 수 있다. 이 디스크립터에는 여러 종류가 있다.
세그먼트 레지스터(CS, DS, SS, ES, FS, GS)는 더 이상 세그먼트의 시작 주소를 직접 담지 않고, '셀렉터'라는 값을 가진다. 이 셀렉터는 GDT 또는 LDT 내에서 특정 세그먼트 디스크립터를 가리키는 인덱스 역할을 한다. CPU는 셀렉터를 통해 해당 디스크립터에 접근하여 메모리 주소 변환 및 접근 권한 검사를 수행한다. 만약 프로그램이 유효하지 않은 디스크립터를 가리키는 셀렉터를 세그먼트 레지스터에 로드하려고 시도하면, CPU는 예외(Exception)를 발생시켜 운영 체제가 이를 처리하도록 한다. 이를 통해 허가되지 않은 메모리 접근을 차단하여 메모리를 보호한다.
또한, 인터럽트 및 예외 처리 방식도 변경되었다. 리얼 모드에서는 인터럽트 벡터 테이블이 메모리의 고정된 낮은 주소에 위치했지만, 보호 모드에서는 '''인터럽트 디스크립터 테이블'''(IDT)이라는 별도의 테이블을 사용한다. IDT는 인터럽트 핸들러 루틴의 주소와 속성을 정의하는 게이트 디스크립터들로 구성된다.
인텔 80286 이후 프로세서에서는 1MB 이상의 물리 메모리(확장 메모리, Extended Memory)를 사용할 수 있게 되었는데, 이 영역은 HMA(High Memory Area)를 제외하고는 기본적으로 보호 모드에서만 접근 가능했다. 이 때문에 확장 메모리는 종종 '''프로텍트 메모리'''라고 불렸다. 보호 모드를 사용함으로써 기본 컨벤셔널 메모리뿐만 아니라 이 확장 메모리 영역까지 활용할 수 있게 되어 사용 가능한 총 메모리 양이 크게 증가했다. 이는 보호 모드를 사용하는 중요한 이점 중 하나이다.[47][48][49]
3. 3. 가상 메모리
386 프로세서부터 보호 모드에 페이징 기능이 추가되었다.[39] 페이징은 운영체제가 메모리 구역인 페이지에 대한 프로그램의 접근을 제한하고 제어할 수 있게 해주는 중요한 기능이다. 많은 운영체제는 페이징을 활용하여 각 프로그램마다 독립적인 가상 주소 공간을 만들어 준다. 이를 통해 한 프로그램이 다른 프로그램의 메모리 영역을 침범하거나 수정하는 것을 막아 시스템 안정성을 높인다.
또한 페이징은 주 기억 장치(RAM)에 있는 페이지를 상대적으로 느리지만 용량이 큰 보조 기억 장치(예: 하드 디스크 드라이브)로 옮기는 기능(스왑)을 가능하게 한다.[40] 이 덕분에 실제 주 기억 장치의 물리적인 용량보다 더 큰 메모리 공간을 프로그램들이 사용할 수 있게 된다.[40]
x86 아키텍처에서는 페이지 디렉터리(Page Directory)와 페이지 테이블(Page Table)이라는 두 가지 배열 자료 구조를 통해 페이징을 관리한다. 초기의 페이지 디렉터리는 4kB 크기의 한 페이지였으며, 1,024개의 페이지 디렉터리 항목(PDE, Page Directory Entry)을 담고 있었다. 이후 x86 아키텍처가 발전하면서 더 큰 페이지 크기도 지원하게 되었다. 각 PDE는 해당 페이지 테이블의 위치를 가리키는 포인터 정보를 담고 있다. 페이지 테이블 역시 원래 4kB 크기였으며, 1,024개의 페이지 테이블 항목(PTE, Page Table Entry)을 포함했다. 각 PTE는 실제 메모리 페이지의 물리적 주소를 가리키는 포인터를 가지고 있으며, 이는 4kB 크기의 페이지를 사용할 때 적용된다. 시스템이 동작하는 동안에는 오직 하나의 페이지 디렉터리만 활성화되어 사용될 수 있다.[41]
3. 4. 멀티태스킹
인텔 80286 프로세서에서 도입된 보호 모드는 링, 호출 게이트, 그리고 태스크 상태 세그먼트(TSS)라는 기능을 통해 x86 아키텍처에서 선점형 멀티태스킹을 지원하게 되었다.
특히 태스크 상태 세그먼트(TSS)는 여러 작업(태스크)이 동시에 실행되는 환경에서 중요한 역할을 한다. TSS를 사용하면 하나의 태스크가 실행되는 동안 사용했던 레지스터 값, 세그먼트 정보, 스택 포인터 등을 저장해 두었다가, 다른 태스크로 전환할 때 해당 태스크의 정보를 불러와 작업을 이어갈 수 있다. 이 과정에서 각 태스크의 정보가 서로 섞이지 않아 독립적인 실행이 보장된다. 또한, TSS는 각 태스크마다 다른 특권 수준과 입출력 포트 접근 권한을 설정할 수 있게 하여 시스템의 안정성과 보안을 높이는 데 기여한다.
하지만 실제 운영 체제에서는 TSS의 모든 기능을 활용하지 않는 경우가 많다.[42][77] 이는 다른 종류의 하드웨어에서도 운영 체제가 잘 동작하도록 만들기 위한 이식성 문제나, 하드웨어 자체의 태스크 전환 기능이 소프트웨어 방식보다 오히려 느릴 수 있는 성능 문제 때문이다.[42][77] 따라서 대부분의 현대 운영 체제는 하드웨어의 지원(TSS 등)과 소프트웨어적인 기법을 함께 사용하여 효율적인 멀티태스킹 환경을 구현하고 있다.[43][78]
4. 세부 기술
보호 모드는 인텔 80286 이후 CPU의 명령 집합 아키텍처에서 지원하는 주요 동작 모드 중 하나이다. 이름에서 알 수 있듯이, 계층적 특권 관리나 태스크 간 메모리 보호 기능을 수행하는 것이 특징이다.
보호 모드를 지원하는 x86 계열 프로세서도 처음 부팅 시에는 리얼 모드로 동작한다[47]. 이는 마치 이전 세대 프로세서(예: 8086)처럼 보이게 하여, 보호 모드를 지원하지 않는 기존 운영체제나 프로그램과의 하위 호환성을 유지하기 위함이다[48]. 보호 모드로 전환하기 위해서는 몇 가지 디스크립터 테이블(GDT, LDT 등)을 메모리에 준비한 후, 컨트롤 레지스터 0 (CR0)의 PE (Protection Enable) 비트를 1로 설정하는 과정이 필요하다[49].
이 모드는 1982년 인텔이 80286 프로세서를 출시하면서 처음 도입되었고[50], 1985년 80386에서 기능이 더욱 확장되었다[51]. 보호 모드가 제공하는 향상된 기능 덕분에 널리 채택되었으며, 이후 x86 아키텍처 발전의 중요한 기반이 되었다[52].
보호 모드에서는 메모리 관리를 위해 글로벌 디스크립터 테이블(GDT)과 로컬 디스크립터 테이블(LDT) 같은 자료 구조를 사용한다. 이 테이블들은 세그먼트의 위치, 크기, 접근 권한 등을 정의하는 '세그먼트 디스크립터', 태스크 상태 정보를 담는 '태스크 디스크립터', LDT 자체를 가리키는 디스크립터, 특권 변경에 사용되는 '게이트 디스크립터' 등을 포함할 수 있다. 세그먼트 레지스터는 직접 주소 대신, GDT나 LDT 내의 특정 디스크립터를 가리키는 '셀렉터'로 사용된다. 유효하지 않은 디스크립터를 로드하려 하면 예외가 발생하여 시스템 안정성을 높인다.
인터럽트나 예외 처리 방식도 변경되어, 고정된 메모리 위치 대신 인터럽트 디스크립터 테이블(IDT)에 정의된 게이트 디스크립터를 통해 해당 처리 루틴으로 연결된다.
80286 이후 프로세서에서는 물리 메모리 용량이 확장되었는데, 1MB를 초과하는 메모리 영역(HMA 제외)은 보호 모드를 사용해야만 접근할 수 있었다. 이 영역은 흔히 '프로텍트 메모리'(Extended Memory)라고 불렸다. 따라서 보호 모드를 사용하면 기본 1MB 메모리(컨벤셔널 메모리) 외에 이 확장된 메모리까지 활용할 수 있어 가용 메모리가 크게 늘어나는 장점이 있다. UNIX나 OS/2 같은 멀티태스킹 운영체제는 보호 모드를 기반으로 설계되었지만, MS-DOS 환경에서도 EMS나 XMS 드라이버, 또는 DOS 확장자 같은 기술을 통해 프로텍트 메모리를 제한적으로나마 활용할 수 있었다.
4. 1. 세그먼트 주소 지정 방식
리얼 모드에서는 각 논리 주소가 물리 메모리 위치를 직접 가리킨다. 모든 논리 주소는 두 개의 16비트 부분, 즉 세그먼트 부분과 오프셋 부분으로 구성된다. 세그먼트 부분은 16바이트 단위로 정렬된 세그먼트의 시작 주소(베이스 주소)를 나타내며, 이는 물리 주소 0, 16, 32, ..., 220 − 16에서 시작할 수 있다. 오프셋 부분은 해당 세그먼트 내에서의 위치를 나타낸다. 따라서 물리 주소는 `physical_address = segment_part × 16 + offset`으로 계산된다[73]. 만약 A20 라인이 비활성화된 상태라면 주소는 220으로 나눈 나머지가 된다 (`(segment_part × 16 + offset) mod 2^20`). 리얼 모드에서 모든 세그먼트의 크기는 64 KB (216 바이트)이다.보호 모드에서는 리얼 모드의 16비트 세그먼트 레지스터 값이 '셀렉터(Selector)'로 사용된다. 셀렉터는 세그먼트의 실제 정보를 담고 있는 '세그먼트 디스크립터(Segment Descriptor)'를 가리키는 역할을 한다. 셀렉터의 구조는 다음과 같다.
- 인덱스 (Index, 비트 3-15): 디스크립터 테이블 내에서 해당 세그먼트 디스크립터의 순번을 나타낸다 (13비트).
- 테이블 지정자 (Table Indicator, TI, 비트 2): 0이면 글로벌 디스크립터 테이블(GDT)을, 1이면 로컬 디스크립터 테이블(LDT)을 사용함을 나타낸다.
- 요청자 권한 수준 (Requester Privilege Level, RPL, 비트 0-1): 해당 세그먼트에 접근하려는 프로그램의 권한 수준을 나타낸다 (0~3, 0이 가장 높음).
세그먼트 디스크립터는 세그먼트의 베이스 주소, 크기(리미트), 접근 권한 등 세그먼트에 대한 상세 정보를 담고 있으며, GDT나 LDT라는 테이블 구조에 저장된다.
=== 80286 세그먼트 디스크립터 ===
인텔 80286 보호 모드의 세그먼트 디스크립터는 64비트(8바이트) 크기이며, 다음과 같은 구조를 가진다.
상위 워드 (Offset +4) | 하위 워드 (Offset +0) | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
63-48 | 47 | 46-45 | 44 | 43 | 42 | 41 | 40 | 39-32 | 31-16 | 15-0 | |||||||||||||||||||||
예약됨 | P | DPL | S | X | C | R | A | Base[23:16] | Base[15:0] | Limit[15:0] | |||||||||||||||||||||
16비트 | 1비트 | 2비트 | 1비트 | 1비트 | 1비트 | 1비트 | 1비트 | 8비트 | 16비트 | 16비트 |
- Base (베이스 주소): 세그먼트의 시작 물리 주소를 나타내는 24비트 값이다. 리얼 모드와 달리 임의의 물리 주소에서 세그먼트를 시작할 수 있다.
- Limit (리미트): 세그먼트의 크기를 나타내는 16비트 값이다. 세그먼트 크기는 1 바이트부터 최대 64 KB (216 바이트)까지 가능하다.
- Access Rights (접근 권한 바이트): 세그먼트의 속성과 접근 권한을 정의하는 8비트 값 (비트 40-47). 하위 비트부터 P, DPL(2비트), S, X, C, R, A 순서이다. (아래 필드 설명 참조)
80286 보호 모드에서 계산된 선형 주소는 물리 메모리 주소와 동일하다. 즉, 페이징 기능이 없다.
=== 80386 세그먼트 디스크립터 ===
인텔 80386 보호 모드에서는 세그먼트 디스크립터가 32비트 주소 공간을 지원하도록 확장되었다. 구조는 다음과 같다.
상위 워드 (Offset +4) | 하위 워드 (Offset +0) | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
63-56 | 55 | 54 | 53 | 52 | 51-48 | 47 | 46-45 | 44 | 43 | 42 | 41 | 40 | 39-32 | 31-16 | 15-0 |
Base[31:24] | G | D | 0 | AVL | Limit[19:16] | P | DPL | S | X | C | R | A | Base[23:16] | Base[15:0] | Limit[15:0] |
8비트 | 1비트 | 1비트 | 1비트 | 1비트 | 4비트 | 1비트 | 2비트 | 1비트 | 1비트 | 1비트 | 1비트 | 1비트 | 8비트 | 16비트 | 16비트 |
- Base (베이스 주소): 세그먼트의 시작 선형 주소를 나타내는 32비트 값으로 확장되었다. (Base[15:0], Base[23:16], Base[31:24] 세 부분으로 나뉘어 저장됨)
- Limit (리미트): 세그먼트의 크기를 나타내는 20비트 값으로 확장되었다. (Limit[15:0], Limit[19:16] 두 부분으로 나뉘어 저장됨)
- G (Granularity, 세분성 비트): 리미트 값의 단위를 결정한다.
- G=0: 리미트 값 단위는 1 바이트. 세그먼트 크기는 1 바이트 ~ 1 MB (220 바이트).
- G=1: 리미트 값 단위는 4 KB. 세그먼트 크기는 4 KB ~ 4 GB (232 바이트).
- D (Default operand size, 기본 피연산자 크기 비트): 코드 세그먼트에서 명령어의 기본 크기를 결정한다.
- D=0: 16비트 명령어 및 주소 사용 (80286 호환).
- D=1: 32비트 명령어 및 주소 사용.
- AVL (Available, 사용 가능 비트): 운영체제가 자유롭게 사용할 수 있는 비트이다.
- Access Rights (접근 권한 바이트): 80286과 동일한 구조를 가지며, P, DPL, S, X, C, R, A 비트를 포함한다.
386 이후 프로세서에서는 페이징 기능을 사용할 수 있으며, 페이징이 활성화된 경우 세그먼테이션을 통해 계산된 선형 주소는 다시 페이징 단위를 통해 물리 주소로 변환된다. 페이징을 사용하지 않으면 선형 주소가 곧 물리 주소가 된다.
=== 주요 디스크립터 필드 설명 ===
- A (Accessed, 접근 비트): 세그먼트가 접근된 적이 있는지 나타낸다. CPU가 자동으로 설정하며, 운영체제가 메모리 관리 등에 활용할 수 있다.
- R (Readable, 읽기 가능 비트): 코드 세그먼트(X=1)의 경우, 해당 세그먼트에서 데이터를 읽을 수 있는지 여부를 나타낸다. 데이터 세그먼트(X=0)에서는 항상 설정되어야 한다.
- C (Conforming/Direction, 준수/방향 비트):[38]
- 코드 세그먼트 (X=1): '준수(Conforming)' 비트. 권한 수준 변경 없이 다른 코드 세그먼트에서 이 세그먼트로 점프할 수 있는 조건을 결정한다.
- C=0: 현재 권한 수준(CPL)이 이 세그먼트의 DPL과 같을 때만 점프 가능.
- C=1: 현재 권한 수준(CPL)이 이 세그먼트의 DPL보다 같거나 높을 때 점프 가능 (권한 수준은 유지됨).
- 데이터 세그먼트 (X=0): '방향(Direction)' 비트. 스택과 같은 데이터 세그먼트의 확장 방향을 결정한다.
- C=0: 위쪽으로 확장 (오프셋 증가 방향). 일반적인 데이터 세그먼트.
- C=1: 아래쪽으로 확장 (오프셋 감소 방향). 스택 세그먼트에 사용.
- X (Executable, 실행 가능 비트):[38]
- X=1: 코드 세그먼트임을 나타낸다.
- X=0: 데이터 세그먼트임을 나타낸다.
- S (Segment type, 세그먼트 유형 비트):
- S=1: 코드 또는 데이터 세그먼트 디스크립터임을 나타낸다.
- S=0: 시스템 세그먼트 디스크립터 (예: TSS, LDT 디스크립터) 또는 게이트 디스크립터임을 나타낸다.
- DPL (Descriptor Privilege Level, 디스크립터 권한 수준): 세그먼트에 접근하기 위해 필요한 최소 권한 수준 (0~3)을 나타낸다. 숫자가 낮을수록 높은 권한이다.
- P (Present, 존재 비트): 해당 세그먼트가 현재 물리 메모리에 있는지 여부를 나타낸다. P=0이면 세그먼트 접근 시 예외가 발생하며, 운영체제는 이를 이용해 가상 메모리(스왑)를 구현할 수 있다.
4. 2. 페이징
386 프로세서가 출시되면서 보호 모드에 페이징 기능이 추가되었다.[39][74] 이는 가상 8086 모드와 함께 도입된 주요 기능 중 하나이다. 페이징은 운영 체제가 메모리를 '페이지'라는 일정한 크기의 블록으로 나누어 관리하고, 각 프로세스가 메모리에 접근하는 것을 페이지 단위로 제한하고 제어할 수 있게 해준다.
많은 현대 운영 체제는 페이징을 사용하여 각 프로세스에 독립적인 가상 주소 공간을 제공한다. 이를 통해 한 프로세스가 다른 프로세스의 메모리 영역을 임의로 접근하거나 수정하는 것을 방지하여 시스템의 안정성과 보안성을 높인다.[40][75] 또한, 페이징은 주 기억 장치(RAM)에 있는 페이지 중 당장 사용되지 않는 페이지를 상대적으로 느리지만 용량이 큰 보조 기억 장치(예: 하드 디스크 드라이브)로 옮기는 스와핑(swapping) 또는 페이징 아웃(paging out)을 가능하게 한다.[40][75] 이 기법(가상 메모리)을 통해 시스템은 실제 물리 메모리 크기보다 더 큰 메모리 공간을 응용 프로그램에게 제공할 수 있다.[40][75]
x86 아키텍처에서 페이징은 기본적으로 페이지 디렉터리(Page Directory)와 페이지 테이블(Page Table)이라는 두 단계의 배열 구조를 통해 선형 주소를 물리 주소로 변환한다.
- 페이지 디렉터리: 크기는 기본적으로 한 페이지인 4 KB이며, 1,024개의 페이지 디렉터리 엔트리(PDE, Page Directory Entry)를 담고 있다. 각 PDE는 특정 페이지 테이블의 시작 주소를 가리키는 포인터 역할을 한다. CPU의 CR3 레지스터가 현재 활성화된 페이지 디렉터리의 물리 주소를 저장하며, 주어진 시점에는 하나의 페이지 디렉터리만 활성화되어 사용된다.[41]
- 페이지 테이블: 페이지 테이블 역시 기본 크기는 4 KB이며, 1,024개의 페이지 테이블 엔트리(PTE, Page Table Entry)로 구성된다. 각 PTE는 실제 메모리에 존재하는 4 KB 크기의 물리 페이지(페이지 프레임)의 시작 주소와 해당 페이지의 속성(존재 여부, 접근 권한 등) 정보를 담고 있다.
이러한 2단계 구조를 통해, 1,024개의 PDE가 각각 1,024개의 PTE를 가리키고, 각 PTE가 4 KB 크기의 페이지를 가리키므로, 총 1024 (PDE) × 1024 (PTE) × 4 KB (페이지 크기) = 4 GB의 선형 주소 공간을 물리 주소 공간으로 매핑할 수 있다.
386 이후 x86 아키텍처는 페이징 관련 기능을 지속적으로 확장해왔다.
- 물리 주소 확장 (PAE, Physical Address Extension): 펜티엄 프로 이후 도입된 기술이다.[76] PAE는 PTE의 크기를 8바이트로 늘리고, 페이지 디렉터리 포인터 테이블(PDPT)이라는 새로운 단계를 추가하여 페이지 테이블 구조를 3단계로 확장했다. 이를 통해 32비트 시스템에서도 4 GB 이상의 물리 메모리(이론적으로 최대 64 GB까지 주소 지정 가능하나, 실제 지원 범위는 CPU 모델과 칩셋에 따라 다름[76])를 사용할 수 있게 되었다. PAE의 페이징 구조는 이후 x64 아키텍처의 롱 모드(Long Mode) 페이징에서도 기본적인 틀로 계승되었다.[76]
- 페이지 크기 확장 (PSE, Page Size Extension): 펜티엄 이후 도입되었으며, 기존의 4 KB 페이지 외에 4 MB 크기의 큰 페이지(PAE 모드에서는 2 MB)를 사용할 수 있게 하는 기능이다. 큰 페이지를 사용하면 페이지 테이블의 단계를 하나 줄일 수 있어 주소 변환에 필요한 메모리 접근 횟수를 줄이고 TLB(Translation Lookaside Buffer)의 효율성을 높일 수 있다. 이는 주로 운영체제 커널이나 데이터베이스 버퍼처럼 큰 연속 메모리 영역을 매핑할 때 유용하다.
- 36비트 PSE (PSE-36): 펜티엄 II 이후에는 PAE를 사용하지 않는 일반적인 32비트 페이징 모드에서도 4 MB 페이지에 한해 최대 36비트(64 GB)의 물리 주소 공간에 접근할 수 있는 기능이 추가되었다. 이는 PAE를 지원하지 않는 운영체제에서도 대용량 메모리를 활용할 수 있도록 지원하기 위해 도입되었다.
4. 3. 보호 모드 전환
80286 프로세서가 처음 등장했을 때는 보호 모드로 진입한 후 다시 리얼 모드로 돌아가는 직접적인 방법이 제공되지 않았다.[56] IBM은 키보드 컨트롤러를 이용해 CPU를 재설정하는 방식으로 이 문제를 해결했다. 재설정 시 필요한 정보(실행 재개 주소, 셧다운 코드 등)를 BIOS 데이터 영역이나 CMOS 메모리에 저장하여, BIOS가 CPU 상태를 복원하고 이전 코드 실행을 이어갈 수 있도록 했다. 이후에는 트리플 폴트를 유발하여 CPU를 재설정하는 더 빠르고 효율적인 방법이 사용되었다. 이 방법은 키보드 컨트롤러 방식보다 빠르고 깨끗하며, 특정 하드웨어에 의존하지 않고 모든 80286 CPU에서 작동했다.리얼 모드에서 보호 모드로 전환리얼 모드에서 보호 모드로 전환하기 위해서는 몇 가지 준비 과정이 필요하다.
1. 전역 디스크립터 테이블 (GDT) 생성: 최소 세 개의 서술자(널 서술자, 코드 세그먼트 서술자, 데이터 세그먼트 서술자)를 포함하는 GDT를 메모리에 만들어야 한다.[49] 이 테이블은 보호 모드에서 메모리 세그먼트를 관리하는 데 사용된다.
2. A20 라인 활성화: IBM PC 호환기종에서는 CPU가 1MB 이상의 메모리에 접근할 수 있도록 21번째 주소선인 A20 라인을 활성화해야 한다. 이는 초기 IBM PC 및 PC/XT용 소프트웨어와의 호환성을 위해 전원 인가 시에는 처음 20개의 주소선만 사용하도록 제한되어 있기 때문이다.[22]
이 두 단계를 마친 후, 제어 레지스터 0 (CR0)의 PE (Protection Enable) 비트를 1로 설정하고, 명령어 프리페치 큐를 비우기 위해 원거리 점프 명령을 실행해야 한다.[23][24] 원거리 점프는 현재 실행 위치와 다른 코드 세그먼트로 이동하는 명령으로, 이 과정을 통해 CPU는 보호 모드용 명령어 해석 방식으로 전환하게 된다.
다음은 보호 모드로 전환하는 과정을 보여주는 어셈블리 코드 예시이다:
; GDT 및 A20 라인 설정 완료된 상태라고 가정
; CR0 레지스터의 PE 비트 설정
mov eax, cr0 ; CR0 레지스터 값을 EAX 레지스터로 복사
or eax, 1 ; EAX 레지스터의 0번 비트(PE 비트)를 1로 설정 (OR 연산)
mov cr0, eax ; 변경된 값을 다시 CR0 레지스터에 저장하여 보호 모드 활성화
; Far jump를 통해 명령어 프리페치 큐를 비우고 보호 모드 코드로 진입
; (여기서 'code_selector'는 GDT에 정의된 보호 모드용 코드 세그먼트 셀렉터)
jmp code_selector:@pm
@pm:
; 이 지점부터 CPU는 보호 모드로 동작함
보호 모드에서 리얼 모드로 전환80286에서는 보호 모드에서 리얼 모드로 돌아가려면 위에서 언급한 CPU 재설정 과정을 거쳐야만 했다. 이는 운영체제 개발이나 특정 작업 수행에 제약을 주었다.
하지만 386 프로세서가 출시되면서 보호 모드에서 리얼 모드로 훨씬 간단하게 전환할 수 있게 되었다.[25] 386 이후의 CPU에서는 다음 단계를 통해 리얼 모드로 돌아갈 수 있다.
1. 세그먼트 레지스터(CS, DS, ES, SS 등)에 리얼 모드에서 사용하던 값(주로 0과 같은 주소)을 로드한다.
2. A20 라인을 비활성화하여 메모리 주소 지정 방식을 리얼 모드와 같이 1MB로 제한한다.
3. CR0 레지스터의 PE 비트를 0으로 클리어하여 보호 모드를 비활성화한다.
이 과정을 거치면 286에서 필요했던 복잡한 초기 설정이나 CPU 재설정 없이 직접 리얼 모드로 전환된다. 이러한 개선 덕분에 386 이후의 프로세서에서는 운영체제가 필요에 따라 두 모드를 더 유연하게 오갈 수 있게 되었다.
5. 응용 및 호환성
인텔 80286 이후의 x86 계열 CPU는 보호 모드를 지원하지만, 전원을 켜면 리얼 모드로 시작한다[47]. 이는 마치 이전 세대 CPU(8086)처럼 동작하여, 보호 모드를 지원하지 않는 기존의 OS나 응용 프로그램을 그대로 사용할 수 있도록 호환성을 제공하기 위함이다[48]. 보호 모드로 전환하기 위해서는 몇 가지 설정이 필요하다[49].
80286 이후 CPU에서는 물리 메모리 용량이 확장되었지만, 1MB 이상의 메모리 영역(확장 메모리)은 HMA를 제외하면 기본적으로 보호 모드에서만 접근할 수 있었다. 이 때문에 1MB 이상의 메모리 영역을 흔히 프로텍트 메모리(Protected Memory) 또는 확장 메모리라고 불렀다. 보호 모드를 사용하면 기본 컨벤셔널 메모리뿐만 아니라 이 프로텍트 메모리까지 활용할 수 있어 사용 가능한 총 메모리 용량이 크게 늘어난다는 장점이 있다.
프로텍트 메모리를 제대로 활용하기 위해서는 본래 UNIX나 OS/2와 같은 멀티태스킹 OS가 필요했지만, MS-DOS 환경에서도 EMS, XMS 드라이버나 DOS 확장자 등을 이용하면 프로텍트 메모리에 접근하여 활용하는 것이 가능했다.
5. 1. 리얼 모드 응용 프로그램 호환성
인텔 80286 프로그래머 레퍼런스 매뉴얼에 따르면, 80286은 대부분의 8086 및 80186 응용 프로그램과 상위 호환성을 유지하며, 대부분의 8086 응용 프로그램은 보호 모드에서 80286용으로 다시 컴파일하거나 어셈블하여 실행할 수 있다고 명시되어 있다.[28][63]응용 프로그램 프로그래머에게 가장 두드러진 변화는 리얼 모드 코드와의 바이너리 호환성, 최대 16MB의 물리 메모리 및 1GB의 가상 메모리 접근 기능이었다.[29][64] 하지만 여기에는 제한이 따랐다. 응용 프로그램이 다음과 같은 특정 기술을 사용하거나 의존하는 경우 보호 모드에서 실행되지 않을 수 있었다.[30][65]
- 세그먼트 산술(Segment arithmetic) 또는 세그먼트 계산
- 권한이 있는 명령어(Privileged instructions) 사용
- 직접 하드웨어 접근(Direct hardware access)
- 코드 세그먼트에 쓰기 또는 수정(Writing to a code segment)
- 데이터 실행(Executing data)
- 세그먼트 오버랩 또는 중첩(Overlapping segments)
- 인텔이 예약한 BIOS 인터럽트를 사용하여 BIOS 기능 사용[31][66]
실제로 거의 모든 MS-DOS 응용 프로그램은 이러한 규칙 중 하나 이상을 위반했다.[32][67] 이러한 제약 때문에 386 프로세서에서는 가상 86 모드가 도입되었다. 이러한 잠재적인 문제에도 불구하고, 윈도우 3.0 및 그 후속 버전들은 리얼 모드와의 바이너리 호환성을 활용하여, 윈도우 2.x(윈도우 2.0 및 윈도우 2.1x)에서 리얼 모드로 실행되던 응용 프로그램들을 보호 모드에서도 실행할 수 있었다.[33][68]
OS/2 1.x와 같은 운영 체제는 프로세서를 보호 모드와 리얼 모드 간에 전환하려고 시도했다. 하지만 이는 느리고 안전하지 않은 방식이었는데, 리얼 모드 프로그램이 컴퓨터를 쉽게 충돌시킬 수 있었기 때문이다. OS/2 1.x는 ''패밀리 API'' 또는 ''바운드''(bound) 프로그램이라는 제한적인 프로그래밍 규칙을 정의하여, 프로그램이 리얼 모드 또는 보호 모드 양쪽에서 실행될 수 있도록 했다.
윈도우 3.0은 16비트 보호 모드에서 리얼 모드 프로그램을 실행할 수 있었다. 보호 모드로 전환할 때, 리얼 모드에서 사용되던 단일 권한 레벨 모델을 유지하기로 결정했기 때문에, 윈도우 응용 프로그램과 DLL이 인터럽트를 후킹하고 직접 하드웨어에 접근하는 것이 가능했다. 이러한 방식은 Windows 9x 시리즈까지 이어졌다. 윈도우 1.x나 윈도우 2.x 프로그램이 세그먼트 산술을 피하도록 잘 작성되었다면, 리얼 모드와 보호 모드 모두에서 동일하게 실행될 수 있었다. 윈도우 프로그램은 일반적으로 세그먼트 산술을 피했는데, 이는 윈도우가 소프트웨어 가상 메모리 체계를 구현하여 프로그램이 실행되지 않을 때 메모리에서 코드와 데이터를 이동시켰기 때문에 절대 주소를 조작하는 것이 위험했기 때문이다. 프로그램은 실행되지 않을 때는 메모리 블록에 대한 핸들만 유지해야 했다. 윈도우 3.0이 보호 모드에서 실행되는 동안 오래된 프로그램을 시작하면, 윈도우를 리얼 모드로 실행하거나 응용 프로그램의 업데이트된 버전을 구하라는 경고 대화 상자가 나타났다. 잘 작동하는 프로그램을 MEMORY 매개변수와 함께 MARK 유틸리티로 업데이트하면 이 대화 상자를 피할 수 있었다. 16비트 보호 모드에서 실행되는 GUI 프로그램과 리얼 모드에서 실행되는 다른 GUI 프로그램을 동시에 가질 수는 없었다. 윈도우 3.1에서는 리얼 모드가 더 이상 지원되지 않았다.
현대의 32비트 운영 체제에서는 가상 86 모드가 여전히 특정 응용 프로그램 실행에 사용된다. 예를 들어, DPMI 호환 DOS 확장자 프로그램(가상 DOS 머신을 통해)이나 윈도우 3.x 응용 프로그램(Windows on Windows 서브시스템을 통해), 그리고 특정 클래스의 장치 드라이버(예: BIOS 기능을 사용하여 화면 해상도를 변경하는 경우)가 OS/2 2.0(및 이후 버전) 및 32비트 Windows NT에서 모두 32비트 커널의 제어 하에 실행된다. 그러나 64비트 운영 체제(롱 모드에서 실행)는 가상 86 모드가 롱 모드에서 제거되었기 때문에 더 이상 이를 사용하지 않는다.
5. 2. 가상 86 모드
386 프로세서가 1985년에 출시되면서, 보호 모드에 추가된 중요한 기능 중 하나가 가상 86 모드(가상 8086 모드, Virtual 8086 mode)이다.[7][2] 이 모드는 기존의 8086 프로세서용으로 작성된 소프트웨어 코드를 수정하지 않고도, 보호 모드를 사용하는 현대 운영 체제(OS) 환경에서 다른 작업들과 동시에 안전하게 실행할 수 있도록 설계되었다.[34][69] 즉, 보호 모드 OS 상에서 여러 개의 가상화된 8086 프로세서를 에뮬레이션하여[19] 과거 프로그램과의 호환성을 높이려는 목적을 가졌다.하지만 가상 86 모드가 모든 8086 프로그램과의 완벽한 하위 호환성을 보장하는 것은 아니었다. 몇 가지 중요한 한계점이 존재했다.[70]
- 제한된 명령어 사용: 프로그램이 세그먼트 조작, 특권 명령어 사용, 하드웨어에 직접 접근 시도, 자기 수정 코드 사용 등 보호 모드의 규칙에 어긋나는 작업을 수행하면 예외가 발생한다. 이 예외는 운영체제가 감지하고 적절히 처리해야만 프로그램 실행이 가능하다.[35][70]
- 성능 저하: 가상 86 모드에서 실행되는 프로그램이 입출력(I/O) 관련 명령어를 사용하면, 시스템 보안 유지를 위해 트랩(trap)이 발생한다. 이 트랩 처리 과정 때문에 실제 하드웨어에 직접 접근하는 것보다 성능이 느려지는 문제가 있었다.[36][71]
이러한 제약 때문에 일부 8086용 프로그램들은 가상 86 모드에서 정상적으로 작동하지 못했다. 결국 시스템 소프트웨어 개발자들은 오래된 프로그램 지원 시 시스템 보안을 우선할 것인지, 아니면 호환성을 더 중요하게 생각할 것인지 선택해야 하는 상황에 놓였다. 대표적인 예로, 마이크로소프트의 윈도우 NT는 시스템 안정성과 보안을 중시하여, 문제가 발생할 소지가 있는 일부 오래된 DOS 애플리케이션에 대한 호환성 지원을 포기하는 결정을 내렸다.[37][72]
그럼에도 불구하고 가상 86 모드는 32비트 운영체제 시대에 널리 활용되었다. 예를 들어, OS/2 2.0 이상 버전이나 32비트 윈도우 NT 계열 운영체제에서는 가상 도스 머신(Virtual DOS Machine) 환경을 통해 DPMI 호환 DOS 확장자 프로그램을 실행하거나, WoW(Windows on Windows) 서브시스템을 통해 Windows 3.x 애플리케이션을 구동하는 데 가상 86 모드를 사용했다. 특정 장치 드라이버가 BIOS 기능을 이용해 화면 해상도를 변경하는 등의 작업을 수행할 때도 이 모드가 활용되었다.
그러나 64비트 컴퓨팅 시대가 도래하면서 상황은 다시 변했다. AMD64 아키텍처 기반의 롱 모드(Long mode)에서는 가상 86 모드가 더 이상 지원되지 않게 되어, 현대 64비트 운영체제에서는 이 기능을 사용하지 않는다.
6. 한국에서의 보호 모드 활용과 발전
OS/2 1.x와 같은 초기 운영 체제는 프로세서를 보호 모드와 리얼 모드 간에 전환하려고 시도했다. 이는 느리고 안전하지 않았는데, 리얼 모드 프로그램이 컴퓨터를 쉽게 충돌시킬 수 있었기 때문이다. OS/2 1.x는 제한적인 프로그래밍 규칙을 정의하여 ''패밀리 API'' 또는 ''바운드'' 프로그램이 리얼 모드 또는 보호 모드에서 실행될 수 있도록 했다. 초기 유닉스 운영 체제, OS/2 1.x 및 초기 Windows 버전들이 이 모드를 사용했다.
Windows 3.0은 16비트 보호 모드에서 리얼 모드 프로그램을 실행할 수 있었다. 보호 모드로 전환할 때, 리얼 모드에서 사용되었던 단일 권한 레벨 모델을 유지하기로 결정했기 때문에 Windows 응용 프로그램과 DLL이 인터럽트를 후킹하고 직접 하드웨어에 접근할 수 있었다. 이는 Windows 9x 시리즈까지 지속되었다. Windows 1.x 또는 Windows 2.x 프로그램이 올바르게 작성되었고 세그먼트 산술(segment arithmetic)을 피했다면, 리얼 모드와 보호 모드 모두에서 동일하게 실행되었다. Windows 프로그램은 일반적으로 세그먼트 산술을 피했는데, Windows가 소프트웨어 가상 메모리 체계를 구현하여 프로그램이 실행되지 않을 때 메모리에서 프로그램 코드와 데이터를 이동시키므로 절대 주소를 조작하는 것은 위험했기 때문이다. 프로그램은 실행되지 않을 때는 메모리 블록에 대한 핸들만 유지해야 했다. Windows 3.0이 보호 모드에서 실행되는 동안 이전 프로그램을 시작하면 경고 대화 상자가 나타나 Windows를 리얼 모드로 실행하거나 응용 프로그램의 업데이트 버전을 얻도록 제안했다. MEMORY 매개변수를 사용하여 MARK 유틸리티로 잘 작동하는 프로그램을 업데이트하면 이 대화 상자를 피할 수 있었다. 16비트 보호 모드에서 실행되는 일부 GUI 프로그램과 리얼 모드에서 실행되는 다른 GUI 프로그램을 동시에 가질 수는 없었다. Windows 3.1에서는 리얼 모드가 더 이상 지원되지 않았고 접근할 수 없었다.
현대 32비트 운영 체제에서는 가상 8086 모드가 여전히 응용 프로그램 실행에 사용된다. 예를 들어, DPMI 호환 DOS 확장자 프로그램(가상 DOS 머신을 통해) 또는 Windows 3.x 응용 프로그램(Windows on Windows 서브시스템을 통해), 그리고 특정 클래스의 장치 드라이버(예: BIOS 기능을 사용하여 화면 해상도를 변경하는 경우)가 OS/2 2.0 (및 이후 OS/2) 및 32비트 Windows NT에서 모두 32비트 커널의 제어 하에 실행된다. 그러나 64비트 운영 체제(롱 모드에서 실행)는 가상 8086 모드가 롱 모드에서 제거되었으므로 더 이상 사용하지 않는다.
참조
[1]
웹사이트
Memory access control method and system for realizing the same
http://www.patentsto[...]
2007-07-14
[2]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[3]
웹사이트
Guide: What does protected mode mean?
http://www.delorie.c[...]
Delorie Software
2007-07-14
[4]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[5]
웹사이트
Protected Mode Basics
ftp://ftp.utcluj.ro/[...]
ftp.utcluj.ro
2009-07-31
[6]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[7]
웹사이트
Intel Global Citizenship Report 2003
http://www.intel.com[...]
2007-07-14
[8]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[9]
웹사이트
A+ - Hardware
http://www.brainbell[...]
BrainBell.com
2007-07-24
[10]
웹사이트
A CPU History
http://www.pcmech.co[...]
PCMechanic
2007-07-24
[11]
웹사이트
Introduction to Protected-Mode
http://www.internals[...]
Internals.com
2007-07-24
[12]
웹사이트
General Information FAQ for the Coherent Operating System
http://textfiles.com[...]
1993-01-23
[13]
간행물
Microsoft XENIX 286 Press Release
http://www.tenox.net[...]
Microsoft
2015-08-17
[14]
웹사이트
MINIX Information Sheet
http://minix.net/min[...]
[15]
서적
Upgrading and Repairing PCs, 17th Edition
https://archive.org/[...]
Que
2017-07-11
[16]
서적
80386 Programmer's Reference Manual
http://bitsavers.org[...]
Intel
1986
[17]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[18]
서적
Write Great Code
O'Reilly
2004-11
[19]
뉴스
Intel's 32-bit Wonder: The 80386 Microprocessor
PC Magazine
1986-11-25
[20]
웹사이트
Sending software to do hardware's job
http://www.infoworld[...]
2014-11-24
[21]
웹사이트
Intel 80386 processor family
http://www.cpu-world[...]
2007-07-24
[22]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
[23]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
[24]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
[25]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
[26]
서적
Intel 80386 Programmer's Reference Manual 1986
http://bitsavers.org[...]
Intel
1986
[27]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture
https://software.int[...]
Intel
2019-05
[28]
서적
80286 and 80287 Programmer's Reference Manual
http://bitsavers.org[...]
Intel
1987
[29]
서적
80286 and 80287 Programmer's Reference Manual
http://bitsavers.org[...]
Intel
1987
[30]
서적
80286 and 80287 Programmer's Reference Manual
http://bitsavers.org[...]
Intel
1987
[31]
웹사이트
Memory access control method and system for realizing the same
http://www.freepaten[...]
2007-07-25
[32]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2007-07-25
[33]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2007-07-25
[34]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
2019-05
[35]
서적
Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 3A, 3B, 3C, and 3D: System Programming Guide
https://software.int[...]
Intel
2019-05
[36]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2007-07-25
[37]
서적
Undocumented Windows NT
Hungry Minds
1999-10
[38]
웹사이트
Global Descriptor table - OSDev Wiki
https://wiki.osdev.o[...]
[39]
웹사이트
ProtectedMode overview [deinmeister.de]
http://www.deinmeist[...]
2007-07-29
[40]
웹사이트
What Is PAE X86?
http://technet2.micr[...]
Microsoft TechNet
2007-07-29
[41]
웹사이트
Advanced Embedded x86 Programming: Paging
http://www.embedded.[...]
Embedded.com
2007-07-29
[42]
웹사이트
news: Multitasking for x86 explained #1
http://neworder.box.[...]
NewOrder
2007-07-29
[43]
웹사이트
news: Multitasking for x86 explained #1
http://neworder.box.[...]
NewOrder
2007-07-29
[44]
특허
Memory access control method and system for realizing the same
http://www.patentsto[...]
2007-07-14
[45]
간행물
2007
[46]
웹사이트
Guide: What does protected mode mean?
http://www.delorie.c[...]
Delorie software
2007-07-14
[47]
간행물
2007
[48]
문서
ただしこれは以前の話で、UEFIでは(正確にはUEFI Class 3では)、ブートローダーに制御が移る時点でプロテクトモードに移行している。
[49]
웹사이트
Protected Mode Basics
ftp://ftp.utcluj.ro/[...]
ftp.utcluj.ro
2009-07-31
[50]
간행물
2007
[51]
웹사이트
Intel Global Citizenship Report 2003
http://www.intel.com[...]
2007-07-14
[52]
간행물
2007
[53]
웹사이트
A+ - Hardware
http://www.brainbell[...]
BrainBell.com
2007-07-24
[54]
웹사이트
A CPU History
http://www.pcmech.co[...]
PCMechanic
2007-07-24
[55]
웹사이트
Introduction to Protected-Mode
http://www.internals[...]
Internals.com
2007-07-24
[56]
서적
Upgrading and Repairing PCs, 17th Edition
http://www.informit.[...]
Que
2006-03-24
[57]
서적
Intel 80386 Programmer's Reference Manual 1986
Intel
[58]
간행물
2007
[59]
서적
Write Great Code
O'Reilly
[60]
웹사이트
Intel 80386 processor family
http://www.cpu-world[...]
2007-07-24
[61]
서적
Intel 80386 Programmer's Reference Manual 1986
Intel
[62]
간행물
2007
[63]
간행물
1987
[64]
간행물
1987
[65]
간행물
1987
[66]
웹사이트
Memory access control method and system for realizing the same
http://www.freepaten[...]
2007-07-25
[67]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2007-07-25
[68]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2007-07-25
[69]
간행물
2007
[70]
간행물
2007
[71]
웹사이트
Virtual 8086 Mode
http://osdev.berlios[...]
berliOS
2002-08-26
[72]
서적
Undocumented Windows NT
Hungry Minds
[73]
문서
A20線がディセーブル状態なら (segment_part × 16 + offset) mod 220 となる
[74]
웹사이트
ProtectedMode overview [deinmeister.de]
http://www.deinmeist[...]
[75]
웹사이트
What Is PAE X86?
http://technet.micro[...]
Microsoft TechNet
2003-05-28
[76]
문서
当初の上限は36ビット、x64命令セットをサポートしている場合は52ビット。x64命令セットではページテーブルの最上位ビットを[[NXビット]]に利用しているため、将来の拡張で残りを全部物理アドレスにしたとしても63ビットである
[77]
웹사이트
news: Multitasking for x86 explained #1
http://neworder.box.[...]
NewOrder
2004-05-02
[78]
웹사이트
news: Multitasking for x86 explained #1
http://neworder.box.[...]
NewOrder
2004-05-02
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com