Windows 32 어셈블리 노트(1): 기본 지식
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. 80x86 프로세서의 작동 모드
1.1 리얼 모드
리얼 모드 개요
리얼 모드는 80x86 프로세서가 지원하는 최초의 작업 모드이자 가장 기본적인 작업 모드이기도 합니다. 리얼 모드는 주로 초기 MS-DOS 운영 체제 및 기타 간단한 운영 환경에서 사용됩니다. 리얼 모드에서 프로세서는 1MB의 물리적 메모리 공간에 직접 액세스할 수 있습니다. 이 모드는 8086 프로세서의 작동 방식과 완벽하게 호환되므로 "리얼 모드"라는 이름이 붙었습니다.
리얼 모드 기능
-
주소 공간 제한
- 리얼 모드에서 프로세서는 1MB의 메모리 공간(0x00000에서 0xFFFFF까지)에만 액세스할 수 있습니다.
- 메모리 공간은 20비트 주소 버스에 의해 제한됩니다.
-
세그먼트 주소 및 오프셋 주소
- 리얼 모드는 메모리 주소 지정을 위해 세그먼트:오프셋(세그먼트) 방법을 사용합니다.
- 세그먼트 주소에 16을 곱하고(즉, 왼쪽으로 4비트 이동) 오프셋 주소에 추가하여 20비트 물리적 주소를 구성합니다.
- 예를 들어 세그먼트 주소가 0x1234이고 오프셋 주소가 0x5678인 경우 물리 주소는 다음과 같습니다. 물리 주소 = (0x1234×16) + 0x5678 = 0x12340 + 0x5678 = 0x179B8text{물리 주소} = (0x1234 곱하기 16) + 0x5678 = 0x12340 + 0x5678 = 0x179B8 물리적 주소=(0x1234×16)+0x5678=0x12340+0x5678=0x179B8
-
메모리 보호 없음
- 리얼 모드에는 메모리 보호 메커니즘이 없으며 프로그램은 운영 체제 영역과 다른 프로그램 영역을 포함하여 전체 1MB 메모리 공간에 임의로 액세스할 수 있습니다.
- 이로 인해 프로그램이 서로 간섭하고 쉽게 시스템 충돌이 발생할 수 있습니다.
-
직접 하드웨어 액세스
- 리얼 모드에서는 하드웨어 장치 및 I/O 포트에 직접 액세스할 수 있습니다.
- 리얼 모드에서 프로그램은 IN 및 OUT과 같은 I/O 명령어를 사용하여 하드웨어 장치와 직접 상호 작용할 수 있습니다.
-
인터럽트 및 프로세서 초기화
- 리얼 모드는 IVT(인터럽트 벡터 테이블)를 사용하여 관리되는 하드웨어 인터럽트와 소프트웨어 인터럽트를 지원합니다.
- 인터럽트 벡터 테이블은 메모리의 최하위 1KB 영역(0x00000 ~ 0x003FF)에 저장됩니다.
- 프로세서의 전원이 켜지거나 재설정되면 자동으로 리얼 모드로 들어가고 주소 0xFFFF0에서 코드 실행이 시작됩니다.
-
실행 가능한 코드에 대한 제한 사항
- 리얼 모드에서 실행 가능한 코드 세그먼트의 크기는 제한되어 있으며 일반적으로 코드 세그먼트는 최대 64KB(0x0000 ~ 0xFFFF)입니다.
리얼 모드 메모리 레이아웃
리얼 모드에서 메모리 레이아웃에는 일반적으로 다음 부분이 포함됩니다.
-
BIOS 영역
- 고급 메모리(0xF0000 ~ 0xFFFFF)는 일반적으로 BIOS 코드 및 데이터를 저장하는 데 사용됩니다.
- 전원을 켜거나 재설정하면 프로세서는 0xFFFF0에서 BIOS 코드 실행을 시작합니다.
-
인터럽트 벡터 테이블
- 메모리의 최하위 1KB 영역(0x00000 ~ 0x003FF)에는 인터럽트 벡터 테이블이 저장됩니다.
- 각 인터럽트 벡터는 4바이트(2바이트 세그먼트 주소 및 2바이트 오프셋 주소)를 차지합니다.
-
운영 체제 및 애플리케이션
- 나머지 메모리 영역은 운영 체제 코드, 애플리케이션 코드 및 데이터에 사용됩니다.
1.2 보호 모드
개요
보호 모드는 80x86 프로세서에 도입된 고급 작업 모드로, 리얼 모드에 비해 더욱 강력한 메모리 관리 및 보호 기능을 제공합니다. 보호 모드는 80286 프로세서에서 처음 도입되었으며 80386 및 이후 프로세서에서 더욱 확장되고 향상되었습니다.
보호 모드의 특징
-
확장된 메모리 주소 공간
- 보호 모드는 24비트 또는 32비트 주소 버스를 지원하며 4GB의 물리적 메모리 공간에 액세스할 수 있습니다(80386 이상).
- 세그먼트 선택기와 세그먼트 설명자는 메모리 관리에 사용되므로 보다 복잡한 메모리 레이아웃 및 관리가 가능합니다.
-
메모리 보호
- 보호 모드는 세그먼트 설명자와 페이지 테이블을 통해 메모리 보호를 구현하여 프로그램이 다른 프로그램이나 운영 체제의 메모리에 불법적으로 액세스하는 것을 방지할 수 있습니다.
- 사용자 모드와 커널 모드 간의 격리를 달성하기 위해 다양한 권한 수준(레벨 0~레벨 3)의 코드 및 데이터 세그먼트를 지원합니다.
-
페이징 메커니즘
- 페이징 메커니즘을 지원하고 페이지 테이블을 통해 가상 주소를 물리적 주소에 매핑하여 메모리 관리 기능을 더욱 향상시킵니다.
- 페이지 크기는 일반적으로 4KB이지만 대형 페이지(예: 4MB)도 지원됩니다.
-
하드웨어 지원 멀티태스킹
- TSS(작업 상태 세그먼트) 및 작업 레지스터(Task Register)를 포함하여 하드웨어 지원 다중 작업 전환을 제공합니다.
- 작업 간 전환 및 보호를 위한 작업 게이트를 지원합니다.
-
향상된 인터럽트 및 예외 처리
- 보호 모드에서는 IDT(Interrupt Descriptor Table)가 인터럽트 및 예외 처리를 관리하는 데 사용됩니다.
- IDT는 인터럽트 게이트, 트랩 게이트 및 작업 게이트를 포함한 게이트 설명자(Gate Descriptor)를 지원합니다.
-
가상 메모리
- 가상 메모리를 지원하고 페이징 메커니즘을 통해 가상 주소 공간을 구현하여 프로그램이 실제 물리적 메모리보다 더 큰 주소 공간을 사용할 수 있도록 합니다.
보호 모드 메모리 관리
-
세그먼트 선택자 및 세그먼트 설명자
- 각 세그먼트 선택기는 세그먼트 기본 주소, 세그먼트 제한 및 세그먼트 속성(예: 권한 및 유형)이 포함된 세그먼트 설명자를 가리킵니다.
- 세그먼트 선택자와 세그먼트 설명자는 GDT(Global Descriptor Table) 및 LDT(Local Descriptor Table)에 의해 관리됩니다.
-
페이징 메커니즘
- 페이징 메커니즘은 가상 주소를 페이지 디렉터리(Page Directory), 페이지 테이블(Page Table) 및 페이지 프레임(Page Frame)으로 나눕니다.
- 페이지 디렉터리와 페이지 테이블을 통해 가상 주소가 물리적 주소에 매핑되어 메모리 보호 및 관리가 이루어집니다.
보호 모드 적용
보호 모드는 Windows, Linux, Unix 등과 같은 최신 운영 체제에서 널리 사용됩니다. 보호 모드의 특성을 사용하여 멀티 태스킹, 다중 사용자 및 메모리 보호와 같은 고급 기능을 구현합니다. 보호 모드를 통해 운영 체제는 하드웨어 자원을 효과적으로 관리하고 안정적이고 안전한 운영 환경을 제공할 수 있습니다.
보호 모드는 최신 운영 체제 및 애플리케이션의 기초로서 80x86 프로세서의 고급 기능을 최대한 활용하여 시스템 안정성과 보안을 향상시킵니다.
1.3 가상 8086 모드
가상 8086 모드 개요
가상 8086 모드(Virtual 8086 Mode)는 보호 모드에서 80x86 프로세서가 제공하는 특수 모드로, 프로세서가 마치 리얼 모드에서 실행되는 것처럼 8086 프로그램을 실행할 수 있도록 해줍니다. 이 모드는 주로 이전 버전과의 호환성을 위해 사용되며, 이전 버전의 DOS 프로그램이 보호 모드를 종료하지 않고도 Windows 및 Linux와 같은 최신 운영 체제에서 실행될 수 있도록 합니다.
가상 8086 모드의 특징
-
리얼 모드 호환성
- 가상 8086 모드를 사용하면 프로세서가 실제 모드에서 운영 환경을 시뮬레이션할 수 있으며 8086 명령어 세트 및 주소 공간을 지원합니다.
- 프로세서는 보호 모드의 기능과 이점을 유지하면서 보호 모드에서 8086개의 프로그램을 실행할 수 있습니다.
-
페이징 및 보호 메커니즘
- 가상 8086 모드에서도 프로세서는 보호 모드 페이징 메커니즘을 사용하여 가상 메모리 및 메모리 보호를 구현할 수 있습니다.
- 페이지 테이블을 통해 가상 8086 모드의 주소 공간을 물리적 메모리에 매핑하여 메모리 격리 및 보호를 제공할 수 있습니다.
-
인터럽트 및 예외 처리
- 가상 8086 모드는 보호 모드 IDT(인터럽트 설명자 테이블)를 통해 관리할 수 있는 인터럽트 및 예외 처리를 지원합니다.
- 인터럽트 및 예외는 가상 8086 모니터(일반적으로 운영 체제 커널)에 의해 처리될 수 있으므로 시스템 안정성과 보안이 보장됩니다.
-
하드웨어 가상화 지원
- 일부 최신 프로세서는 가상 8086 모드를 보다 효율적으로 구현할 수 있는 하드웨어 지원 가상화 기술을 제공합니다.
- 예를 들어 Intel의 VT-x 및 AMD의 AMD-V 기술은 하드웨어 가속 가상화 지원을 제공하고 성능을 향상시킬 수 있습니다.
가상 8086 모드의 메모리 관리
-
세그먼트:오프셋 주소 지정
- 가상 8086 모드에서는 메모리 주소 지정 방법이 리얼 모드와 동일하며 세그먼트:오프셋(세그먼트) 모드를 사용합니다.
- 세그먼트 주소와 오프셋 주소는 함께 20비트 물리적 주소를 형성하며 최대 1MB의 메모리 공간에 액세스할 수 있습니다.
-
페이징 메커니즘
- 가상 8086 모드는 20비트 리얼 모드 주소를 보호 모드의 가상 주소 공간에 매핑할 수 있는 페이징 메커니즘을 지원합니다.
- 페이지 테이블을 통해 메모리 보호 및 격리를 달성하여 가상 8086 모드의 프로그램이 다른 메모리 영역에 불법적으로 액세스하는 것을 방지할 수 있습니다.
가상 8086 모드 적용
-
이전 DOS 프로그램 실행
- 가상 8086 모드는 주로 이전 버전의 DOS 프로그램 및 응용 프로그램을 실행하는 데 사용되며 이전 버전과의 호환성을 제공합니다.
- 최신 운영 체제에서 가상 8086 모드를 사용하면 리얼 모드에서 실행해야 하는 일부 이전 프로그램을 실행할 수 있습니다.
-
가상 머신 및 에뮬레이터
- 일부 가상 머신 및 에뮬레이터는 가상 8086 모드를 활용하여 이전 운영 체제 및 소프트웨어를 지원합니다.
- 예를 들어, DOSBox와 같은 에뮬레이터는 가상 8086 모드를 통해 DOS 환경을 시뮬레이션하여 사용자가 고전적인 DOS 게임과 응용 프로그램을 실행할 수 있도록 합니다.
가상 8086 모드의 제한 사항
-
메모리 주소 공간
- 가상 8086 모드에서 프로그램은 리얼 모드에서 제한되는 1MB의 메모리 주소 공간에만 액세스할 수 있습니다.
-
성능 오버헤드
- 가상 8086 모드를 구현하려면 보호 모드 지원이 필요하며 이로 인해 특정 성능 오버헤드가 발생할 수 있습니다.
- 인터럽트 및 예외 처리에는 가상 8086 모니터(운영 체제 커널)의 개입이 필요하므로 처리 복잡성이 증가합니다.
-
하드웨어 제한
- 모든 하드웨어가 가상 8086 모드를 완전히 지원하는 것은 아니며 일부 하드웨어 기능은 가상 8086 모드에서 사용하지 못할 수도 있습니다.
요약하다
가상 8086 모드는 보호 모드에서 80x86 프로세서가 제공하는 특수 모드로, 주로 이전 버전의 DOS 프로그램과의 호환성을 위해 제공됩니다. 가상 8086 모드를 사용하면 프로세서는 보호 모드의 기능과 장점을 유지하면서 보호 모드에서 리얼 모드 운영 환경을 시뮬레이션할 수 있습니다. 이 모드는 레거시 소프트웨어, 가상 머신 및 에뮬레이터를 실행하는 데 널리 사용됩니다.
2. Windows 메모리 관리
2.1 DOS 운영체제의 메모리 배열
DOS(디스크 운영 체제) 운영 체제의 메모리 관리는 주로 8086/8088 프로세서의 리얼 모드 메모리 모델을 기반으로 합니다. 리얼 모드의 메모리 주소 공간은 0x00000부터 0xFFFFF까지 1MB입니다. 이 1MB 주소 공간은 각각 특정 목적을 가진 여러 주요 영역으로 구분됩니다. 다음은 DOS 운영체제의 메모리 배열에 대해 자세히 소개합니다.
리얼 모드 메모리 모델
리얼 모드에서는 세그먼트 주소와 오프셋 주소를 20비트 물리적 주소로 결합하여 메모리 주소에 액세스합니다. 세그먼트 주소는 4비트 왼쪽으로 이동하고 오프셋 주소가 추가되어 실제 물리적 주소를 형성합니다.
메모리 레이아웃
리얼 모드에서 1MB 메모리 공간의 레이아웃은 대략 다음과 같습니다.
-
인터럽트 벡터 테이블(IVT): 0x00000 - 0x003FF
- 1KB를 차지합니다(256개의 벡터, 각각 4바이트).
- 인터럽트 서비스 루틴의 진입 주소와 관련 정보를 저장한다.
-
BIOS 데이터 영역(BDA): 0x00400 - 0x004FF
- 약 256바이트.
- 하드 디스크, 직렬 포트, 병렬 포트 등과 같은 시스템 및 하드웨어 장치 매개변수 정보를 저장합니다.
-
레거시 메모리(기존 메모리): 0x00500 - 0x9FFFF
- 640KB, 주로 DOS 운영 체제, DOS 응용 프로그램 및 상주 메모리 프로그램(TSR)에 사용됩니다.
- 프로그램 코드, 데이터, 스택 등으로 사용할 수 있습니다.
-
디스플레이 버퍼: 0xA0000 - 0xBFFFF
- 디스플레이 어댑터가 사용하는 메모리 영역입니다.
- 0xA0000 - 0xAFFFF: 64KB, 일반적으로 EGA/VGA 그래픽 카드의 그래픽 모드에서 사용됩니다.
- 0xB0000 - 0xB7FFF: 32KB, 일반적으로 MDA(단색 디스플레이 어댑터)에 사용됩니다.
- 0xB8000 - 0xBFFFF: 32KB, 일반적으로 컬러 텍스트 표시(CGA, EGA, VGA 텍스트 모드)에 사용됩니다.
-
확장 BIOS 데이터 영역(EBDA): 0xC0000 - 0xC7FFF
- 일부 확장 BIOS 데이터 및 어댑터 BIOS 코드를 저장하는 약 32KB.
-
BIOS 확장 영역: 0xC8000 - 0xEFFFF
- 주로 BIOS 및 확장 카드 드라이버(예: 네트워크 어댑터, SCSI 컨트롤러 등)에 사용됩니다.
-
시스템 BIOS: 0xF0000 - 0xFFFFF
- 64KB, 시스템 BIOS 코드를 저장합니다.
- 기본적인 시스템 초기화, 인터럽트 서비스 루틴, 하드웨어 제어 및 기타 기능을 제공합니다.
2.2 80386 메모리 주소 지정 메커니즘
Intel 80386 프로세서는 더욱 발전된 메모리 주소 지정 메커니즘을 도입하여 이전 제품보다 더욱 강력한 메모리 관리 및 보호 기능을 제공합니다. 80386은 두 가지 주 메모리 주소 지정 모드를 지원합니다.리얼 모드그리고보호 모드 . 보호 모드에서는 메모리 관리 기능을 더욱 향상시키기 위해 페이징 메커니즘도 도입되었습니다. 자세한 소개는 다음과 같습니다.
1. 리얼모드
리얼 모드에서 80386 프로세서는 8086/8088과 동일한 메모리 주소 지정 방법을 사용하며 20비트 주소 버스를 사용하고 1MB의 메모리 공간에 액세스할 수 있습니다. 주소는 세그먼트 주소와 오프셋 주소로부터 계산됩니다.
- 세그먼트 주소: 왼쪽으로 4비트 이동합니다.
- 오프셋 주소: 세그먼트 주소의 왼쪽 쉬프트 결과에 더해 20비트의 물리 주소를 얻습니다.
物理地址 = (段地址 << 4) + 偏移地址
2. 보호 모드
보호 모드는 향상된 메모리 보호 및 관리 기능을 제공하는 80386 프로세서의 주요 작업 모드입니다. 보호 모드의 메모리 주소 지정에는 두 가지 메커니즘 계층이 포함됩니다.분할 메커니즘그리고페이징 메커니즘。
2.1 분할 메커니즘
보호 모드에서 80386 프로세서는 세그먼트 선택기와 세그먼트 설명자를 사용하여 세그먼트를 관리합니다. 세그먼트 설명자는 전역 설명자 테이블(GDT) 또는 로컬 설명자 테이블(LDT)에 저장됩니다.
-
세그먼트 선택기: 16비트, 3개 필드 포함:
- 색인: 13비트, GDT 또는 LDT에서 세그먼트 설명자의 위치를 지정합니다.
- TI(테이블 인디케이터): 1비트, GDT(0) 또는 LDT(1)를 사용할지 여부를 나타냅니다.
- RPL(요청된 권한 수준): 2비트, 요청된 권한 수준을 지정합니다.
-
세그먼트 설명자: 8바이트, 다음 필드 포함:
- 기본 주소: 32비트, 세그먼트의 시작 주소입니다.
- 세그먼트 제한(Limit): 20비트, 세그먼트 크기.
- 액세스 권한 및 속성: 12비트, 세그먼트 유형, 권한 수준 등을 설명합니다.
분할 메커니즘에 따른 선형 주소 계산은 다음과 같습니다.
线性地址 = 段基址 + 偏移地址
2.2 페이징 메커니즘
페이징 메커니즘은 80386 프로세서가 보호 모드에서 제공하는 또 다른 메모리 관리 방법으로 선형 주소를 물리적 주소로 변환하여 메모리 가상화 및 보호를 실현합니다. 페이징 메커니즘에는 페이지 디렉토리, 페이지 테이블 및 페이지 프레임이 포함됩니다.
- 페이지 디렉토리: 페이지 디렉토리 항목(PDE)을 포함하며, 각 PDE는 페이지 테이블을 가리킵니다.
- 페이지 테이블: 페이지 테이블 항목(PTE)을 포함하며 각 PTE는 페이지 프레임을 가리킵니다.
- 페이지 프레임: 실제 물리적 메모리 블록으로, 일반적으로 4KB입니다.
페이징 메커니즘의 주소 변환은 다음과 같습니다.
- 선형 주소는 디렉터리, 테이블, 페이지 내 오프셋의 세 부분으로 나뉩니다.
- 디렉토리 섹션은 페이지 디렉토리를 색인화하여 해당 PDE를 찾습니다.
- 테이블 섹션은 페이지 테이블을 인덱싱하여 해당 PTE를 찾습니다.
- 페이지 내 오프셋은 페이지 프레임 기본 주소에 추가되어 물리적 주소를 얻습니다.
物理地址 = 页帧基址 + 页内偏移
페이징 메커니즘의 개략도:
+----------------+----------------+----------------+
| 页目录(10位) | 页表(10位) | 页内偏移(12位)|
+----------------+----------------+----------------+
3. 80386 메모리 관리 장치(MMU)
80386의 MMU(Memory Management Unit)는 분할 및 페이징 주소 변환을 담당하며 메모리 보호를 구현합니다.
-
CR0 레지스터: 보호 모드 및 페이징 활성화/비활성화를 위한 제어 레지스터입니다.
- PE 비트(보호 활성화): 보호 모드를 활성화합니다.
- PG 비트(페이징 활성화): 페이징을 활성화합니다.
-
CR3 레지스터: 저장소 페이지 디렉터리의 기본 주소입니다.
-
CR2 레지스터: 마지막 페이지 폴트의 선형 주소를 저장합니다.
4. 보호 메커니즘
보호 모드에서 80386 프로세서는 메모리와 시스템의 보안을 보장하기 위해 다양한 보호 메커니즘을 제공합니다.
- 권한 수준 : 0부터 3까지 총 4개의 레벨이 있으며, 0레벨이 가장 높습니다. 코드 및 데이터에 대한 액세스를 제어합니다.
- 세그먼트 보호: 세그먼트 설명자의 속성 필드를 통해 세그먼트 경계 확인 및 액세스 제어를 구현합니다.
- 페이지 보호: PTE의 속성 필드를 통해 페이지의 읽기, 쓰기, 실행 권한 제어가 구현됩니다.
2.3 Windows 메모리 배열
1. 가상 메모리
Windows 운영 체제는 하드 디스크의 물리적 메모리(RAM)와 가상 메모리 파일(페이지 파일)을 결합하여 각 프로세스에 독립적인 가상 주소 공간을 제공하는 가상 메모리 관리를 사용합니다. 각 프로세스에는 일반적으로 4GB의 가상 주소 공간(32비트 시스템)이 있으며, 그 중 2GB는 사용자 모드 프로그램에서 사용되고 2GB는 커널 모드에서 사용됩니다. 64비트 시스템은 더 큰 가상 주소 공간을 갖습니다.
2. 가상 주소 공간 레이아웃
가상 주소 공간은 사용자 모드와 커널 모드 영역으로 구분됩니다.
사용자 모드 주소 공간
- 0x00000000 - 0x7FFFFFFF: 애플리케이션에서 사용하기 위한 사용자 모드 주소 공간입니다.
- 더미: 동적 메모리 할당 영역, 애플리케이션은 런타임에 메모리를 할당하고 해제합니다.
- 스택: 각 스레드에는 함수 호출 및 지역 변수에 대한 자체 스택이 있습니다.
- 공유 메모리: 서로 다른 프로세스 간에 공유되는 데이터 세그먼트입니다.
커널 모드 주소 공간
- 0x80000000 - 0xFFFFFFFF: 운영 체제 커널 및 드라이버에서 사용되는 커널 모드 주소 공간입니다.
- 커널 코드 및 데이터: 운영 체제 커널의 코드 및 전역 데이터입니다.
- 시스템 캐시: 파일 액세스 성능을 향상시키기 위해 파일 시스템 캐싱에 사용됩니다.
- 장치 드라이버: 드라이버 코드 및 데이터.
3. 메모리 페이징
Windows는 페이징 메커니즘을 사용하여 메모리를 관리하고 가상 주소를 실제 주소로 변환합니다. 페이징의 기본 단위는 페이지이며 일반적으로 4KB입니다.
페이지 테이블 구조
- 페이지 디렉토리: 페이지 테이블을 가리키는 페이지 디렉토리 항목(PDE)을 포함합니다.
- 페이지 테이블: 실제 물리적 메모리 페이지를 가리키는 PTE(페이지 테이블 항목)를 포함합니다.
4. 메모리 관리 장치(MMU)
프로세서의 메모리 관리 장치(MMU)는 가상 주소를 물리적 주소로 변환하고 페이지 교체 및 메모리 보호를 수행합니다. Windows 운영 체제는 MMU를 통해 다음 기능을 구현합니다.
- 주소 번역: 가상 주소를 실제 주소로 매핑합니다.
- 메모리 보호: 페이지 액세스 권한(읽기, 쓰기, 실행)을 제어합니다.
- 페이지 교체: 자주 사용하지 않는 페이지를 하드 디스크의 페이지 파일로 교체하여 물리적 메모리를 확보합니다.
5. 메모리 보호
Windows 운영 체제는 다음 메커니즘을 통해 메모리를 보호합니다.
- 권한 수준: 사용자 모드 프로그램이 커널 모드 메모리에 직접 액세스할 수 없도록 합니다.
- 페이지 권한: 각 페이지의 접근 유형(읽기, 쓰기, 실행)을 제어합니다.
- 액세스 제어: 운영체제 커널은 무단 메모리 접근을 방지하기 위해 접근 권한을 설정합니다.
6. 메모리 할당
Windows는 메모리 할당을 위해 여러 가지 전략과 데이터 구조를 사용합니다.
- 페이징 할당자: 페이징 할당 및 가상 메모리 해제를 관리합니다.
- 힙 관리자: 애플리케이션에 효율적인 메모리 할당 및 할당 해제를 제공합니다.
- 커널 메모리 할당자: 풀 할당자 및 비페이징 풀을 포함하여 커널 모드 메모리를 관리합니다.
7. 메모리 관리 API
Windows는 애플리케이션과 시스템에서 사용할 수 있는 메모리 관리 API 세트를 제공합니다.
- VirtualAlloc/VirtualFree: 가상 메모리를 할당하고 해제합니다.
- 힙할당/힙프리: 힙에 메모리를 할당하고 해제합니다.
- 글로벌할당/글로벌프리: 전역 메모리 블록을 할당하고 해제합니다.
- 로컬 할당/로컬 프리: 로컬 메모리 블록을 할당하고 해제합니다.
8. 페이지 파일
Windows에서는 페이지 파일(Pagefile.sys)을 가상 메모리의 일부로 사용합니다. 실제 메모리가 부족하면 자주 사용되지 않는 페이지가 페이지 파일로 스왑됩니다. 페이지 파일의 위치와 크기는 사용자가 구성할 수 있습니다.
3. Windows 권한 보호
3.1 80386 인터럽트 및 예외
1. 인터럽트와 예외의 분류
인터럽트와 예외는 다음 범주로 나눌 수 있습니다.
- 하드웨어 인터럽트: 키보드, 마우스, 하드디스크 등 외부기기로 전송됩니다.
- 소프트웨어 인터럽트: 소프트웨어에 의해 전달됨
INT
명령이 트리거됩니다. - 예외: 0으로 나누기 오류, 페이지 오류 등과 같이 프로세서에서 감지한 오류 또는 특수 조건에 의해 트리거됩니다.
2. 인터럽트 벡터 테이블(IVT)
80386 프로세서는 인터럽트 벡터 테이블을 사용하여 인터럽트와 예외를 관리합니다. IVT는 256개의 항목으로 구성된 테이블로, 각 항목은 4바이트를 차지하며 인터럽트 또는 예외 처리기의 주소를 저장합니다. IVT의 기본 주소는 IDTR(Interrupt Descriptor Table Register)에 저장됩니다.
3. IDT(인터럽트 설명자 테이블)
보호 모드에서 80386 프로세서는 인터럽트 설명자 테이블(IDT)을 사용하여 인터럽트 및 예외 핸들러를 저장합니다. IDT에는 인터럽트 게이트, 트랩 게이트 및 작업 게이트 설명자가 포함되어 있으며 각 설명자는 8바이트를 차지합니다.
- 인터럽트 게이트: 하드웨어 및 소프트웨어 인터럽트에 사용되며 IF(인터럽트 플래그)를 자동으로 삭제합니다.
- 트랩 게이트: 예외 처리에 사용되며 IF는 지워지지 않습니다.
- 태스크 게이트: 작업을 전환하는 데 사용됩니다.
IDT의 기본 주소와 경계는 IDTR에 저장됩니다.
4. 인터럽트 처리 흐름
인터럽트나 예외가 발생하면 80386 프로세서는 다음 단계를 수행합니다.
- 컨텍스트 저장: 현재 CS(Code Segment Register), EIP(Instruction Pointer Register), EFLAGS(Flags Register)를 스택에 저장합니다.
- IDT 찾기: 인터럽트 또는 예외 번호를 기반으로 IDT에서 해당 설명자를 찾습니다.
- 권한 확인: 현재 권한 수준(CPL)과 대상 권한 수준(DPL)을 확인하여 적법한 권한 전환을 보장합니다.
- 핸들러로 점프: 새로운 CS 및 EIP를 로드하고, 인터럽트 또는 예외 처리기로 점프합니다.
- 인터럽트 또는 예외 처리: 핸들러 코드를 실행합니다.
- 컨텍스트 복원:통과하다
IRET
명령어는 CS, EIP 및 EFLAGS를 복원하고 인터럽트 또는 예외가 발생하기 전의 상태로 돌아갑니다.
5. 예외 유형
80386 프로세서는 여러 예외를 지원하며 각 예외에는 서로 다른 오류 코드와 처리 방법이 있습니다.
- 결함: 복구 가능한 예외입니다. 핸들러가 반환되면 예외를 발생시킨 명령이 다시 실행됩니다.
- 트랩: 디버깅이나 추적에 사용되는 예외입니다. 예외가 발생한 후 핸들러가 반환되면 다음 명령어가 계속 실행됩니다.
- 중단: 심각한 오류이며 일반적으로 복구할 수 없습니다.
일반적인 예외는 다음과 같습니다.
- 나누기 오류: 제수가 0일 때 발생합니다.
- 단일 단계: 디버깅에 사용되며 단일 단계를 실행할 때 발생합니다.
- 중단점: 중단점을 디버깅할 때 발생합니다.
- 과다:사용
INTO
명령어가 오버플로를 감지하면 발생합니다. - BOUND 범위가 초과되었습니다.: 배열 액세스가 범위를 벗어날 때 발생합니다.
- 유효하지 않은 Op코드: 잘못된 명령을 실행할 때 발생합니다.
- 장치를 사용할 수 없음: 보조 프로세서를 사용할 수 없을 때 발생합니다.
- 이중 결함: 예외 처리 시 다시 예외가 발생합니다.
- 보조 프로세서 세그먼트 오버런: 보조 프로세서 작업에 의해 발생합니다.
- 잘못된 TSS: 작업 상태 세그먼트가 불법일 때 발생합니다.
- 세그먼트가 존재하지 않음: 존재하지 않는 세그먼트에 액세스하면 발생합니다.
- 스택 오류: 스택 작업 오류가 발생하면 발생합니다.
- 일반 보호 결함: 보호 규칙을 위반할 때 트리거됩니다.
- 페이지 오류: 페이징 작업이 비정상일 때 발생합니다.
6. 인터럽트 및 예외 처리기
인터럽트 및 예외 처리기는 특정 인터럽트 또는 예외를 처리하는 데 사용되는 특수 루틴입니다. 이는 일반적으로 운영 체제에서 제공되며 시스템 상태 복원, 오류 정보 기록, 필요한 복구 작업 수행 또는 인터럽트 응답을 담당합니다.
7. 인터럽트 우선순위 및 마스킹
80386 프로세서는 인터럽트 우선순위 및 마스킹 메커니즘을 지원하고 PIC(Programmable Interrupt Controller)를 통해 하드웨어 인터럽트의 우선순위 및 마스킹을 관리합니다. 높은 수준의 인터럽트는 낮은 수준의 인터럽트 처리를 중단하여 중요한 이벤트에 적시에 응답할 수 있도록 합니다.
3.2 80386의 보호 메커니즘
1. 분할 보호
80386 프로세서는 분할 메커니즘을 사용하여 메모리를 관리합니다. 각 세그먼트에는 세그먼트의 기본 주소, 범위 및 액세스 권한이 포함된 설명자가 있습니다. 분할 보호는 프로세스가 승인된 메모리 영역에만 액세스할 수 있도록 보장합니다.
세그먼트 설명자
세그먼트 설명자는 전역 설명자 테이블(GDT) 및 로컬 설명자 테이블(LDT)에 저장됩니다. 각 설명자에는 다음 정보가 포함됩니다.
- 기본 주소: 세그먼트의 시작 주소입니다.
- 한계: 세그먼트의 끝 주소를 나타내는 세그먼트의 크기입니다.
- 유형(Type) 및 권한 수준(DPL): 세그먼트 유형(코드 세그먼트, 데이터 세그먼트, 시스템 세그먼트) 및 접근 권한입니다.
- 세그먼트 존재 비트(P): 세그먼트가 메모리에 있는지 여부입니다.
분할 보호 구현
메모리에 액세스할 때 프로세서는 세그먼트 선택기를 기반으로 세그먼트 설명자를 찾고 다음 검사를 수행합니다.
- 기본 주소 및 경계 확인: 접속 주소가 세그먼트 범위 내에 있는지 확인하세요.
- 권한 확인: 액세스 권한이 설명자의 유형 및 권한 수준과 일치하는지 확인하세요.
2. 페이징 보호
페이징 메커니즘은 각 페이지에 고유한 액세스 권한을 부여하여 메모리 관리를 더욱 구체화합니다. 페이징 보호 메커니즘은 페이지 디렉토리와 페이지 테이블을 통해 구현됩니다.
페이지 디렉토리 및 페이지 테이블
- 페이지 디렉토리: 페이지 테이블을 가리키는 페이지 디렉토리 항목(PDE)을 포함합니다.
- 페이지 테이블: 실제 물리적 메모리 페이지를 가리키는 PTE(페이지 테이블 항목)를 포함합니다.
각 페이지 테이블 항목에는 다음 정보가 포함됩니다.
- 페이지 기본 주소: 물리적 메모리 페이지의 시작 주소입니다.
- 존재 비트(P): 페이지가 메모리에 있는지 여부입니다.
- 읽기/쓰기 비트(R/W): 페이지에 쓰기 가능한지 여부입니다.
- 사용자/수퍼유저 비트(U/S): 해당 페이지에 대한 접근 권한입니다.
페이징 보호 구현
메모리에 액세스할 때 프로세서는 다음 검사를 수행합니다.
- 페이지 존재 확인: 페이지가 메모리에 있는지 확인하고, 그렇지 않은 경우 페이지 폴트(Page Fault)를 트리거합니다.
- 읽기/쓰기 확인: 페이지가 쓰기 가능한지 확인합니다. 쓰기 불가능한 페이지에 쓰기를 시도하면 보호 오류가 발생합니다.
- 사용자/수퍼유저 확인: 사용자 모드 코드가 커널 모드 페이지에 액세스할 수 없도록 액세스 권한을 확인합니다.
3. 권한 수준
80386 프로세서는 0부터 3까지 4가지 권한 수준(권한 수준)을 지원합니다. 수준이 낮을수록 권한은 높아집니다.
- 권한 수준 0(링 0): 일반적으로 운영 체제 커널에서 사용되는 가장 높은 권한 수준입니다.
- 권한 수준 1(링 1)그리고권한 수준 2(링 2): 중간 권한 수준으로 거의 사용되지 않습니다.
- 권한 수준 3(링 3): 일반적으로 사용자 모드 응용 프로그램에서 사용되는 가장 낮은 권한 수준입니다.
권한 수준 구현
권한 수준은 다음 메커니즘을 통해 구현됩니다.
- 코드 세그먼트 권한 수준(CPL): 현재 실행 중인 코드의 권한 수준입니다.
- 데이터 세그먼트 권한 수준(DPL): 세그먼트에 액세스할 수 있는 CPL을 결정하는 데이터 세그먼트의 권한 수준입니다.
- 요청 권한 수준(RPL): 요청된 액세스 권한을 나타내는 세그먼트 선택기의 권한 수준입니다.
액세스 작업을 수행할 때 프로세서는 CPL, DPL 및 RPL을 확인하여 권한 수준 규칙을 준수하는지 확인합니다. 일치하지 않으면 일반 보호 오류가 발생합니다.
4. 시스템 세그먼트 및 게이트 설명자
80386 프로세서는 작업 전환 및 인터럽트 처리를 위한 시스템 세그먼트 및 게이트 설명자를 지원합니다.
시스템 세그먼트
- 작업 상태 세그먼트(TSS): 작업의 상황별 정보를 포함하며 작업 전환에 사용됩니다.
- 로컬 설명자 테이블(LDT): 작업별 세그먼트 설명자를 포함합니다.
게이트 설명자
- 인터럽트 게이트: 인터럽트 처리에 사용되며, 인터럽트 핸들러로 점프합니다.
- 트랩 게이트: 예외 처리에 사용되며 인터럽트를 마스크하지 않습니다.
- 태스크 게이트: 작업 전환, TSS를 통한 작업 전환에 사용됩니다.
5. 작업 전환
80386 프로세서는 작업 상태 세그먼트(TSS)를 통해 구현되는 하드웨어 작업 전환을 지원합니다. 작업 전환은 인터럽트, 예외 또는 작업 게이트에 의해 트리거될 수 있습니다.
작업 상태 세그먼트(TSS)
TSS에는 작업의 레지스터 상태, 세그먼트 레지스터, 스택 포인터 및 작업 링크가 포함되어 있습니다. 작업 전환 시 프로세서는 현재 작업 상태를 TSS에 저장하고 새 작업 상태를 로드합니다.
작업 전환 프로세스
- 현재 작업 상태 저장: 현재 태스크의 레지스터와 세그먼트 레지스터를 TSS에 저장합니다.
- 새 작업 상태 로드: 새 작업의 TSS에서 레지스터와 세그먼트 레지스터를 로드합니다.
- 태스크 레지스터 업데이트(TR): 새 작업의 TSS를 가리킵니다.
6. 인터럽트 및 예외 처리
인터럽트 및 예외 처리는 80386 프로세서 보호 메커니즘의 중요한 부분입니다. 인터럽트 및 예외는 IDT(인터럽트 설명자 테이블)를 통해 관리되며, 처리 중에 권한 확인 및 컨텍스트 전환이 수행됩니다.
인터럽트 및 예외 처리 절차
- 컨텍스트 저장: 현재 CS, EIP, EFLAGS를 스택에 저장합니다.
- IDT 찾기: 인터럽트 또는 예외 번호를 기반으로 IDT에서 해당 설명자를 찾습니다.
- 권한 확인: CPL, DPL을 확인하여 법적 권한 변환을 확인하세요.
- 핸들러로 점프: 새로운 CS와 EIP를 로드하고 핸들러를 실행합니다.
- 컨텍스트 복원:통과하다
IRET
CS, EIP, EFLAGS를 복원하고 중단이나 예외가 발생하기 전의 상태로 돌아갑니다.
3.3 Windows 보호 메커니즘
1. 사용자 모드와 커널 모드
Windows 운영 체제는 프로세서의 실행 모드를 사용자 모드(User Mode)와 커널 모드(Kernel Mode)로 나눕니다.
- 사용자 모드: 하드웨어나 커널 데이터 구조에 직접 액세스하지 않고 제한된 액세스로 애플리케이션을 실행합니다.
- 커널 모드: 전체 액세스 권한으로 핵심 운영 체제 구성 요소 및 장치 드라이버를 실행하고 권한 있는 명령을 실행할 수 있습니다.
사용자 모드와 커널 모드 간 전환
사용자 모드와 커널 모드 간 전환은 일반적으로 시스템 호출을 통해 구현됩니다. 애플리케이션은 시스템 API를 호출하여 커널 서비스를 요청하고, 운영 체제는 처리를 위해 요청을 커널 모드로 전환합니다.
2. 메모리 보호
가상 메모리
Windows는 가상 메모리 메커니즘을 사용하여 각 프로세스에 독립적인 주소 공간을 제공합니다. 이 메커니즘은 프로세스가 서로의 메모리에 직접 액세스하는 것을 방지하여 시스템의 보안과 안정성을 향상시킵니다.
- 페이지 테이블: 각 프로세스에는 가상 주소를 물리적 주소로 매핑하는 독립적인 페이지 테이블이 있습니다.
- 페이지 교환: 실제 메모리가 부족하면 운영 체제는 자주 사용되지 않는 페이지를 하드 디스크의 페이지 파일로 교체합니다.
메모리 세그먼트
Windows는 메모리 세그먼트를 사용하여 다양한 유형의 데이터와 코드를 나누며, 각 세그먼트에는 서로 다른 액세스 권한과 보호 메커니즘이 있습니다. 예를 들어, 코드 세그먼트는 읽기 전용이고 데이터 세그먼트는 읽기-쓰기입니다.
3. 접근통제
Windows 운영 체제는 ACL(액세스 제어 목록)을 사용하여 리소스에 대한 사용자 및 프로세스 액세스 권한을 관리합니다.
보안 식별자(SID)
모든 사용자, 그룹 및 컴퓨터에는 이를 식별하는 고유한 SID(보안 식별자)가 있습니다.
ACL(액세스 제어 목록)
각 개체(예: 파일, 디렉터리, 레지스트리 키 등)에는 개체에 대한 다양한 사용자 및 그룹의 액세스 권한을 정의하는 ACE(액세스 제어 항목) 집합이 포함된 액세스 제어 목록이 있습니다.
4. 권한 관리
Windows는 권한 관리를 통해 프로세스와 사용자가 수행할 수 있는 작업을 제어합니다. 드라이버 설치, 시스템 로그 액세스 등과 같은 특정 권한은 특정 사용자 그룹(예: 관리자)에게만 부여됩니다.
보안 전략
Windows는 시스템 보안을 강화하기 위해 UAC(사용자 계정 제어), 암호 정책, 감사 정책 등을 구성할 수 있는 일련의 보안 정책을 제공합니다.
5. 인터럽트 및 예외 처리
Windows 운영 체제는 인터럽트 및 예외 처리 메커니즘을 사용하여 하드웨어 인터럽트, 소프트웨어 인터럽트 및 프로세서 예외를 관리합니다.
인터럽트 처리
인터럽트 핸들러(인터럽트 서비스 루틴, ISR)는 하드웨어 인터럽트를 처리하고 외부 장치가 적시에 응답할 수 있도록 보장하는 역할을 합니다.
예외 처리
예외 처리기는 0으로 나누기 오류, 페이지 오류 등과 같은 프로세서 예외를 처리하여 예외가 발생할 때 시스템이 적절한 복구 조치를 취할 수 있도록 합니다.
6. 멀티태스킹
Windows에서는 멀티태스킹 메커니즘을 통해 여러 프로세스와 스레드를 동시에 실행할 수 있습니다. 운영 체제는 스케줄러를 사용하여 프로세스와 스레드의 실행을 관리하고 시스템 리소스가 공정하게 할당되도록 합니다.
스레드 스케줄링
Windows는 우선 순위 예약 알고리즘을 사용하여 스레드의 우선 순위 및 상태(예: 준비, 대기 중, 실행 중 등)를 기반으로 CPU 시간 조각을 할당합니다.
프로세스 격리
각 프로세스에는 독립적인 가상 주소 공간과 리소스가 있어 한 프로세스가 다른 프로세스의 작동에 영향을 미치는 것을 방지하고 시스템 안정성을 향상시킵니다.
7. 보안 기능
Windows는 시스템 보호 기능을 강화하기 위해 DEP(데이터 실행 방지), ASLR(주소 공간 레이아웃 무작위화) 등과 같은 일련의 보안 기능을 제공합니다.
데이터 실행 방지(DEP)
DEP는 하드웨어와 소프트웨어의 조합을 통해 특정 메모리 영역을 실행 불가능으로 표시하여 데이터 세그먼트에서 코드 실행을 방지합니다.
ASLR(주소 공간 레이아웃 무작위화)
ASLR은 프로세스의 메모리 주소 공간을 무작위로 지정하여 공격자가 취약점을 악용하는 것을 더 어렵게 만듭니다.