인기 검색어

Research

INTEL SDM Vol.3 (System Programming) - SYSTEM ARCHITECTURE OVERVIEW 번역 및 정리

  • -

하드웨어 및 커널 공부를 위해(사실 하이퍼바이저 공부를 위해) 선행되어야만 하는 지식들(용어만 알고 있거나, 잘 모르는 것들)이 INTEL SDM에 정말 자세하게 나와있는데, 전부 영어여서 Notion + AI, 후처리를 통해서 번역 및 요약해봤습니다.

Chapter 별로 하나씩 번역해볼 예정입니다. (약 700장정도의 분량)

IA-32 아키텍처의 운영 모드:

  1. Protected Mode (보호 모드)
    • 프로세서의 기본 운영 모드.
    • 고성능유연성 제공.
    • 과거 소프트웨어와의 호환성 유지.
    • 메모리 보호, 멀티태스킹 같은 고급 기능 사용 가능.
  2. Real-Address Mode (실제 주소 모드)
    • Intel 8086 프로세서와 유사한 환경 제공.
    • 간단한 프로그래밍 모델.
    • Protected Mode 또는 System Management Mode(SMM)로 전환 가능.
  3. System Management Mode (SMM)
    • 전원 관리OEM 차별화 기능 지원.
    • SMI# 핀 신호를 통해 진입.
    • SMM으로 전환 시:
      • 현재 실행 중인 프로그램의 상태(컨텍스트) 저장.
      • 독립된 별도 주소 공간에서 SMM 전용 코드 실행.
    • SMM 종료 후 이전 상태로 복귀.
  4. Virtual-8086 Mode (가상 8086 모드)
    • Protected Mode에서 지원하는 유사 운영 모드.
    • 8086 소프트웨어를 멀티태스킹 환경에서 실행 가능.
    • 주로 과거 소프트웨어와의 호환성 유지에 사용.

Intel 64 아키텍처의 추가 모드:

  1. IA-32e Mode
    • 두 가지 하위 모드 지원:
      1. Compatibility Mode (호환 모드):
        • 대부분의 과거 Protected Mode 애플리케이션이 변경 없이 실행 가능.
      2. 64-Bit Mode (64비트 모드):
        • 64비트 선형 주소 지원.
        • 64GB 이상의 물리적 메모리 접근 가능.

모드 간 전환:

  • 모드 전환은 소프트웨어 또는 하드웨어 이벤트에 따라 발생.
  • SMM처럼 외부 인터럽트에 의해 진입하거나, Protected Mode에서 Virtual-8086 Mode로 진입 등 다양한 전환 경로가 있음.
  • 아키텍처가 각 모드 간 전환을 투명하게 지원.

Protected Mode 에서의 메모리 접근

1. 메모리 접근의 기본 메커니즘

  • Global Descriptor Table (GDT) 또는 Local Descriptor Table (LDT)를 통해 메모리 접근이 이루어짐.
  • GDT와 LDT는 세그먼트 디스크립터(segment descriptor)라는 항목을 포함하고 있음.
    • 세그먼트 디스크립터에는 다음 정보가 포함됨:
      • 세그먼트의 시작 주소(base address)
      • 접근 권한(access rights)
      • 세그먼트의 유형(type)
      • 사용 상태(usage information)

2. 세그먼트 셀렉터(segment selector)

  • 세그먼트 디스크립터에 접근하기 위해 사용하는 인덱스.
  • GDT 또는 LDT의 특정 위치(offset)를 가리킴.
  • 구성 요소:
    1. 인덱스(Index): GDT 또는 LDT 내 디스크립터의 위치.
    2. G/L 플래그(Global/Local Flag): GDT인지 LDT인지 구분.
    3. 접근 권한 정보(Access Rights): 현재 실행 중인 코드의 권한과 비교하여 접근 가능 여부 결정.

3. 메모리 접근 절차

  1. 세그먼트 셀렉터(segment selector)와 오프셋(offset)을 통해 접근.
  2. 세그먼트 셀렉터는 GDT 또는 LDT의 세그먼트 디스크립터로 접근.
  3. 세그먼트 디스크립터에서 해당 세그먼트의 시작 주소(base address)를 가져옴.
  4. 오프셋을 더해 최종적으로 선형 주소(linear address) 계산.
  5. 이후 페이징 메커니즘을 통해 물리 주소(physical address)로 변환.

4. 특별한 레지스터

  • GDTR (Global Descriptor Table Register):
    • GDT의 선형 주소(linear address) 저장.
  • LDTR (Local Descriptor Table Register):
    • LDT의 선형 주소(linear address) 저장.
  • TR (Task Register):
    • 현재 작업(task) 상태를 나타내는 TSS(Task-State Segment)를 가리킴.

5. Current Privilege Level (CPL)

  • 현재 실행 중인 코드의 보호 수준(Privilege Level).
  • 접근하려는 세그먼트의 접근 권한과 CPL을 비교하여 접근 가능 여부 결정.

6. 페이징과 연계

  • Protected Mode에서는 선형 주소가 페이징 메커니즘에 의해 물리 주소로 변환됨.
  • 페이징 단계:
    • PML4 -> Page Directory -> Page Table 순서로 주소 변환.
  • 4KB 페이지와 4단계 페이징 구조를 통해 큰 메모리 공간 지원.


IA-32e 모드에서의 글로벌 및 로컬 디스크립터 테이블 (GDT, LDT)

  1. GDTR 및 LDTR 레지스터:
    • IA-32e 모드(64비트 모드와 호환 모드)에서 64비트로 확장됨.
    • 세부 내용은 섹션 3.5.2 "IA-32e 모드의 세그먼트 디스크립터 테이블"을 다룰 때 포스팅 예정
  2. 64비트 모드:
    • GDT와 LDT는 64비트 베이스 주소를 지원하도록 확장됨.
    • LDT 디스크립터는 16바이트로 구성되며, 64비트 베이스 주소와 다양한 속성을 포함.
    • 호환 모드에서는 디스크립터가 확장되지 않음.

시스템 세그먼트, 세그먼트 디스크립터 및 게이트

  1. 시스템 세그먼트:
    • TSS(Task-State Segment)와 LDT(Local Descriptor Table) 정의.
    • GDT는 세그먼트로 간주되지 않음(세그먼트 선택자와 디스크립터를 통해 접근하지 않음).
      • 왜?
        • GDT는 GDTR(Global Descriptor Table Register)로 직접 참조되며, 세그먼트 선택자를 통해 간접적으로 접근되지 않기 때문
        • GDT는 세그먼트처럼 실행되거나 접근되지 않음 (한 마디로 그냥 세그먼트를 모아둔 것에 불과하다는 뜻)
  2. 게이트(Gates):
    • 유형: 호출 게이트(Call Gate), 인터럽트 게이트(Interrupt Gate), 트랩 게이트(Trap Gate), 태스크 게이트(Task Gate).
    • 역할: 다른 권한 수준에서 실행되는 시스템 절차 및 핸들러로의 보호된 접근 제공.
      • 예: 호출 게이트를 통해 낮은 권한 수준(더 높은 권한)의 코드 세그먼트로 접근 가능.
  3. 게이트 동작:
    • 호출 프로시저는 게이트를 가리키는 세그먼트 선택자를 제공.
    • 프로세서는 현재 권한 수준(CPL)과 게이트 및 대상 코드 세그먼트의 권한 수준을 비교하여 접근 권한 확인.
    • 접근 허용 시:
      • 대상 코드 세그먼트의 세그먼트 선택자와 오프셋을 가져옴.
      • 권한 수준 변경 시, 대상 권한 수준의 스택으로 전환:
        • TSS에서 새로운 스택의 세그먼트 선택자를 가져옴.
    • 16비트와 32비트 코드 세그먼트 간의 전환도 지원.

2.1.3 Task-State 세그먼트 및 Task 게이트

TSS(Task-State Segment)의 역할

  • TSS란?: 태스크의 실행 환경 상태를 정의하는 데이터 구조.
  • 포함하는 내용:
    • 범용 레지스터 상태.
    • 세그먼트 레지스터 상태.
    • EFLAGS, EIP(Instruction Pointer) 레지스터.
    • 3개의 스택 세그먼트의 세그먼트 선택자와 스택 포인터(각 권한 수준에 하나씩).
    • 현재 태스크와 관련된 LDT의 세그먼트 선택자.
    • 페이징 구조 계층의 베이스 주소(CR3).

Protected Mode에서 태스크 전환

  • 모든 프로그램 실행은 현재 태스크(Current Task) 컨텍스트에서 이루어짐.
  • *Task Register(TR)**에 현재 태스크의 TSS 세그먼트 선택자가 저장됨.
  • 태스크 전환 방법:
    • CALL 또는 JMP 명령어를 사용하여 새로운 태스크로 전환 가능.
    • 명령어에 새로운 태스크의 TSS 세그먼트 선택자가 포함됨.

태스크 전환 시 프로세서 동작

  1. 현재 태스크 상태 저장:
    • 현재 태스크의 상태를 TSS에 저장.
  2. Task Register(TR) 업데이트:
    • 새로운 태스크의 TSS 세그먼트 선택자로 갱신.
  3. GDT에서 새로운 TSS 접근:
    • 새로운 TSS의 세그먼트 디스크립터를 GDT에서 가져옴.
  4. 새로운 태스크 상태 로드:
    • 새 TSS에 저장된 정보를 다음 레지스터와 데이터 구조로 로드:
      • 범용 레지스터, 세그먼트 레지스터, LDTR.
      • CR3(페이징 구조 계층의 베이스 주소).
      • EFLAGS, EIP.
  5. 새 태스크 실행:
    • 새 태스크의 실행 시작.

Task Gate

  • 기능: 태스크 접근을 위한 게이트.
  • 차이점:
    • Call Gate는 코드 세그먼트에 접근하지만, Task Gate는 TSS에 접근.
    • Task Gate는 세그먼트 선택자를 통해 TSS를 참조.
  • 사용 목적:
    • 태스크 간의 안전한 전환 제공.

1. IA-32e 모드에서 하드웨어 작업 전환이 지원되지 않음

  • 64비트 모드에서는 하드웨어 기반 작업 전환 기능이 제거되었습니다.
    • CPU가 TSS를 이용해 자동으로 작업 전환을 수행하지 않습니다.
    • 대신 TSS는 특정한 시스템 정보를 저장하는 데 사용됩니다.

2. 64비트 TSS에 포함된 주요 정보

  1. 권한 수준별 스택 포인터 주소
    • 각 권한 레벨(Privilege Level, Ring 0~3)에 대한 스택 포인터 정보를 저장합니다.
    • 권한 레벨 변경(예: 사용자 모드에서 커널 모드로 전환) 시 올바른 스택을 사용할 수 있도록 합니다.
  2. 인터럽트 스택 테이블(IST) 포인터 주소
    • 인터럽트 처리 시 사용할 독립적인 스택 주소를 포함합니다.
    • 특정 예외(Double Fault 등)나 치명적 상황에서 기존 스택 대신 안정적인 스택을 제공하기 위해 사용됩니다.
  3. IO-권한 비트맵(IO-Permission Bitmap) 오프셋 주소
    • TSS 기본 주소(base)로부터 오프셋을 계산하여 IO 권한 비트맵의 위치를 지정합니다.
    • IO 비트맵은 각 프로세스가 특정 입출력 포트에 접근할 수 있는 권한을 제어합니다.

IO 비트맵(IO-Permission Bitmap)

IO 비트맵은 IA-32 및 IA-32e 아키텍처에서 프로세스의 입출력 포트(IO Port) 접근을 제어하기 위한 데이터 구조입니다. Task-State Segment(TSS)의 일부로 포함되며, 특정 프로세스가 어떤 IO 포트에 접근할 수 있는지 결정합니다.

IO 비트맵의 주요 특징

  1. 위치
    • TSS(Task-State Segment) 내부에 포함됩니다.
    • TSS의 기본 주소(base address)로부터 오프셋(offset) 값을 사용하여 IO 비트맵의 위치를 지정합니다.
  2. 구조
    • IO 비트맵은 1비트 당 하나의 IO 포트를 나타냄.
      • 1이면 해당 포트에 접근이 허용되지 않음.
      • 0이면 접근이 허용됨.
    • IO 비트맵의 길이는 최대 64KB로, 0번부터 65535번까지의 IO 포트를 제어할 수 있습니다.
  3. 활용
    • 각 비트는 특정 IO 포트를 나타내며, 프로세스마다 다른 IO 비트맵을 설정하여 세분화된 IO 접근 제어가 가능합니다.
    • 커널 또는 하드웨어가 IO 비트맵을 읽어, 해당 포트에 대한 접근을 허용하거나 차단합니다.

3. Task Register(TR)의 확장

  • 64비트 모드에서는 Task Register가 64비트 주소를 저장하도록 확장되었습니다.
    • TR은 활성화된 TSS의 기본 주소를 가리키며, CPU가 필요한 정보를 TSS에서 가져올 수 있도록 합니다.

4. TSS의 현대적 사용

  • 하드웨어 작업 전환이 제거되었지만, TSS는 다음과 같은 목적으로 여전히 사용됩니다:
    1. 스택 관리
      • 권한 수준 전환 및 인터럽트 처리 시 안정적인 스택 전환을 지원.
    2. IO 접근 제어
      • 특정 프로세스가 IO 포트에 접근할 수 있는지 제어.
    3. 시스템 안정성 향상
      • 인터럽트 스택 테이블을 통해 치명적 예외 상황에서의 시스템 안정성을 확보.

2.1.4 인터럽트 및 예외 Handling

1. 개요

  • 인터럽트예외 처리는 Interrupt Descriptor Table(IDT)를 통해 이루어짐.
  • IDT는 게이트 디스크립터(gate descriptor)의 집합으로, 각각의 디스크립터는 특정 인터럽트 또는 예외 핸들러에 대한 정보를 포함.
  • IDT는 세그먼트가 아니며, IDT의 시작 주소(선형 주소)는 IDT 레지스터(IDTR에 저장됨.

2. IDT의 동작

  1. 인터럽트 벡터 수신:
    • 내부 하드웨어, 외부 인터럽트 컨트롤러, 또는 소프트웨어 명령어(INT n, INTO, INT3 등)에 의해 발생.
    • 이 벡터는 IDT의 인덱스로 사용됨.
  2. 게이트 디스크립터 접근:
    • 인터럽트 게이트, 트랩 게이트, 또는 태스크 게이트일 수 있음.
  3. 핸들러 호출:
    • 인터럽트 게이트 또는 트랩 게이트: 핸들러를 호출하는 방식이 Call Gate와 유사.
    • 태스크 게이트: 태스크 전환(task switch)을 통해 핸들러에 접근.

2.1.4.1 Interrupt and Exception Handling in IA-32e Mode

1. IA-32e 모드의 특징

  • IDT의 게이트 디스크립터가 16바이트로 확장됨:
    • 64비트 기반 주소를 지원하기 위해.
    • 64비트 모드와 호환 모드 모두 동일하게 적용.
  • IDTR:
    • IDT의 시작 주소를 저장하는 IDTR도 64비트 주소를 지원하도록 확장됨.
  • 태스크 게이트 지원 중단:
    • IA-32e 모드에서는 태스크 게이트를 사용할 수 없음.

2.1.5 Memory Management

1. 개요

  • 시스템 아키텍처는 두 가지 메모리 관리 방식을 지원:
    1. 직접 물리 주소 지정:
      • 선형 주소를 물리 주소로 그대로 사용.
    2. 가상 메모리 (페이징 사용):
      • 선형 주소를 여러 단계의 페이징 구조를 통해 물리 주소로 변환.

2. 페이징 메커니즘

  1. 페이징 구조:
    • 페이지 프레임(page frame)의 물리적 위치는 페이징 구조에 저장.
    • 페이징 구조는 물리 메모리에 존재하며, 가장 최근에 접근된 페이지만 물리 메모리에 유지 가능.
  2. CR3 레지스터:
    • 페이징 구조 계층의 기본 물리 주소를 저장.
    • 각 테이블 엔트리는 페이지 프레임의 시작 주소, 접근 권한, 메모리 관리 정보를 포함.
  3. 선형 주소 변환 과정:
    • 선형 주소를 여러 부분으로 나누어 각 부분이 페이징 구조 계층의 오프셋 역할을 함.
    • 페이징 구조를 따라 최종 물리 주소를 계산.
  4. 계층적 구조:
    • 시스템은 단일 계층 또는 여러 계층의 페이징 구조를 가질 수 있음.
    • 예를 들어, 태스크마다 독립적인 페이징 구조를 사용할 수 있음.

요약

  1. Interrupt and Exception Handling:
    • IDT를 통해 인터럽트와 예외 처리.
    • IA-32e 모드에서는 64비트 주소 지원을 위해 IDT 디스크립터와 IDTR이 확장되었으며, 태스크 게이트는 지원하지 않음.
  2. Memory Management:
    • 물리 주소 지정 또는 가상 메모리(페이징) 방식 지원.
    • 페이징 구조는 CR3 레지스터를 통해 관리되며, 선형 주소는 페이징 계층을 따라 물리 주소로 변환.
    • 가상 메모리는 효율적인 메모리 사용과 프로세스 격리를 가능하게 함.

2.1.5 IA-32e 모드에서의 메모리 관리 (2.1.5.1 Memory Management in IA-32e Mode)


1. IA-32e 모드의 페이징 구조

IA-32e 모드에서는 4단계 또는 5단계 페이징 구조를 사용합니다.

페이징 구조는 선형 주소(linear address)를 물리 주소(physical address)로 변환하는 데 필요한 정보를 계층적으로 저장합니다.

1.1. 계층 구조

  • 5단계 페이징 활성화 시: PML5 → PML4 → Page Directory Pointer → Page Directory → Page Table
  • 4단계 페이징 활성화 시: PML4 → Page Directory Pointer → Page Directory → Page Table

2. 각 단계의 역할과 데이터 구조

2.1. PML5 (Page Map Level 5)

  • 5단계 페이징에서 추가되는 최상위 계층입니다.
  • PML5 테이블의 각 엔트리에는 다음 정보가 저장됩니다:
    • PML4 테이블의 물리적 주소.
    • 접근 권한 및 메모리 관리 정보.
  • PML5 테이블의 기본 물리 주소는 CR3 레지스터에 저장됩니다.
    • 4단계 페이징에서는 PML4 테이블의 주소가 CR3에 저장됩니다.

2.2. PML4 (Page Map Level 4)

  • 5단계 페이징에서는 PML5 아래에 위치하며, 4단계 페이징에서는 최상위 계층.
  • PML4 테이블의 각 엔트리에는 다음 정보가 포함됩니다:
    • Page Directory Pointer Table의 물리적 주소.
    • 접근 권한 및 메모리 관리 정보.

2.3. Page Directory Pointer Table

  • PML4 테이블 아래 계층.
  • 각 엔트리는 Page Directory Table의 물리적 주소, 접근 권한, 메모리 관리 정보를 포함합니다.

2.4. Page Directory

  • Page Directory Pointer Table 아래 계층.
  • 각 엔트리는 Page Table의 물리적 주소, 접근 권한, 메모리 관리 정보를 포함합니다.

2.5. Page Table

  • Page Directory 아래 계층으로, 실제 **페이지 프레임(page frame)**에 대한 정보를 포함합니다.
  • 각 엔트리에는:
    • 물리 메모리 페이지의 시작 주소.
    • 페이지 접근 권한 및 메모리 관리 정보.

3. 동작 과정

  1. CPU가 선형 주소(linear address)를 참조합니다.
  2. 선형 주소는 페이징 구조의 여러 계층을 거쳐 최종적으로 물리 주소(physical address)로 변환됩니다.
    • 각 계층의 엔트리를 참조하여 다음 계층의 주소를 결정.
  3. 최종적으로 Page Table에서 물리 메모리 페이지의 주소를 얻습니다.

4. 5단계 페이징의 필요성

  • 5단계 페이징은 물리 메모리와 선형 주소 공간이 증가하면서 추가된 구조입니다.
  • 4단계 페이징은 최대 48비트의 선형 주소(256TB)를 지원하지만, 5단계 페이징은 최대 57비트의 선형 주소(128PB)를 지원합니다.

2.1.6 시스템 레지스터(System Registers)

이 내용은 IA-32와 Intel 64 아키텍처에서 시스템 초기화 및 제어를 위한 주요 시스템 레지스터와 관련된 정보를 설명하고 있습니다. 주요 레지스터와 역할을 정리하면 다음과 같습니다.


1. EFLAGS 레지스터

  • EFLAGS 레지스터시스템 플래그IOPL 필드를 포함하여 프로세서의 동작을 제어.
  • 주요 기능:
    • 작업(task) 전환.
    • 운영 모드 변경.
    • 인터럽트 처리.
    • 명령어 추적.
    • 접근 권한 제어.
  • 자세한 정보는 섹션 2.3에서 설명 예정.

2. 제어 레지스터(Control Registers)

  • CR0, CR2, CR3, CR4와 같은 제어 레지스터는 시스템의 주요 동작을 제어하기 위한 플래그와 데이터를 포함.
  • 각 레지스터의 역할:
    • CR0: 보호 모드 활성화, 페이징 활성화 등 기본 시스템 동작 제어.
    • CR2: 페이지 폴트가 발생한 주소 저장.
    • CR3: 페이징 구조의 PML4 테이블 또는 디렉터리의 물리 주소 저장.
    • CR4: 추가 기능(예: PAE, SMAP 등) 활성화.
  • 확장된 제어 레지스터 XCR0에 대한 자세한 정보는 섹션 2.6에서 설명 예정.

3. 디버그 레지스터(Debug Registers)

  • 디버깅 목적으로 중단점(breakpoints)을 설정할 수 있는 레지스터.
  • 프로그램 및 시스템 소프트웨어 디버깅에 사용.
  • 자세한 정보는 19장에서 확인 가능.

4. 메모리 관리 레지스터

  • GDTR, LDTR, IDTR:
    • 각각 GDT, LDT, IDT 테이블의 **선형 주소와 크기(한계값)**를 저장.
  • Task Register (TR):
    • 현재 작업에 대한 TSS의 선형 주소와 크기 저장.
  • 자세한 정보는 섹션 2.4에서 제공.

5. 모델 특화 레지스터(Model-Specific Registers, MSRs)

  • 특정 프로세서 기능을 제어하거나 설정하기 위한 레지스터.
  • 주요 기능:
    • 디버그 확장.
    • 성능 모니터링 카운터.
    • 메모리 타입 범위 레지스터(MTRR).
    • 머신 체크 아키텍처(MCA).
  • MSR의 수와 기능은 프로세서 모델에 따라 다름.
  • 자세한 정보는 11.4 섹션 및 4권의 MSR 관련 장에서 제공.

6. 접근 권한

  • 대부분의 시스템 레지스터는 특권 레벨 0에서만 접근 가능.
  • EFLAGS 레지스터는 애플리케이션 프로그램에서도 제한적으로 접근 가능.
  • 예외적으로, 모든 프로그램이 특권 레벨 0에서 실행되도록 설계된 시스템에서는 애플리케이션이 시스템 레지스터를 수정할 수 있음.

정리

  1. EFLAGS 레지스터: 작업 전환, 인터럽트 처리, 접근 권한 제어 등.
  2. 제어 레지스터 (CR0~CR4, XCR0): 시스템 동작 제어와 메모리 관리.
  3. 디버그 레지스터: 디버깅 도구로 사용.
  4. 메모리 관리 레지스터: GDT, IDT, TSS 등 테이블의 주소와 크기 관리.
  5. 모델 특화 레지스터(MSR): 프로세서별 고유 기능 제어.

시스템 플래그와 IOPL 필드


1. 시스템 플래그(System Flags)

시스템 플래그는 EFLAGS 레지스터(또는 RFLAGS 레지스터)에 포함된 비트 필드로, 프로세서의 시스템 동작을 제어하거나 상태를 나타냅니다. 이 플래그들은 작업 전환, 인터럽트 처리, 트레이싱 등 시스템 운영에 필요한 기능을 제어합니다.

주요 시스템 플래그

  1. IF (Interrupt Enable Flag)
    • 인터럽트 허용 여부를 제어합니다.
      • 1: 인터럽트 활성화 (허용).
      • 0: 인터럽트 비활성화 (무시).
    • 운영체제가 인터럽트를 차단하거나 허용할 때 사용합니다.
  2. TF (Trap Flag)
    • 단일 스텝 디버깅을 활성화합니다.
      • 1: 명령어 실행 후 트랩 인터럽트가 발생하여 디버거로 제어가 전달됩니다.
  3. NT (Nested Task Flag)
    • 작업(Task) 간 중첩 호출을 나타냅니다.
      • 1: 작업 전환이 중첩 상태임을 나타냄.
  4. RF (Resume Flag)
    • 디버깅 예외(예: Breakpoint Exception)를 재개할 때 사용.
      • 1: 디버그 예외를 무시하고 명령어 실행을 재개합니다.
  5. VM (Virtual-8086 Mode Flag)
    • 프로세서를 가상 8086 모드로 전환합니다.
      • 1: 가상 8086 모드 활성화.
      • 0: 보호 모드.

2. IOPL 필드 (I/O Privilege Level Field)

IOPL의 정의

  • *IOPL (I/O Privilege Level)**은 EFLAGS 레지스터의 12번과 13번 비트에 위치한 2비트 필드로, **입출력 명령어(IO instructions)**의 실행 권한을 제어합니다.
  • 이 필드는 프로세스가 특정 **특권 레벨(Ring)**에서 실행될 때 IO 명령어 실행 가능 여부를 결정합니다.

IOPL 값과 권한

IOPL 값 허용된 레벨 (CPL) 설명

0 Ring 0 (커널 모드)만 허용 가장 엄격한 권한 제어.
1 Ring 0~1 (커널 및 하위 레벨)만 허용 제한적 입출력 권한.
2 Ring 0~2 (커널 및 중간 수준 권한) 허용 일반 애플리케이션보다 높은 권한.
3 Ring 0~3 (모든 레벨) 허용 모든 애플리케이션에서 허용.

IOPL 필드의 동작

  • 현재 실행 중인 코드의 **권한 레벨(CPL)**과 IOPL을 비교하여 입출력 명령어의 실행 여부를 결정합니다.
    • CPL ≤ IOPL: 입출력 명령어 실행 허용.
    • CPL > IOPL: 입출력 명령어 실행 시 권한 예외(#GP) 발생.

IOPL의 활용

  1. 시스템 보안
    • 입출력 명령어를 낮은 권한 레벨에서 실행하지 못하도록 제한하여 시스템 보안을 강화합니다.
  2. 운영체제 설계
    • 운영체제는 IOPL 값을 설정하여 사용자 모드(Ring 3)에서의 IO 명령어 접근을 제한하고, 커널 모드(Ring 0)에서만 실행되도록 제어합니다.
  3. 특정 드라이버 실행
    • IOPL을 조정하여 특정 드라이버나 하드웨어와의 상호작용을 제한적으로 허용할 수 있습니다.

IA-32 아키텍처의 운영 모드

1. Protected Mode (보호 모드)

  • IA-32 프로세서의 기본 모드.
  • 특징:
    • 고급 기능 지원 (예: 메모리 보호, 멀티태스킹).
    • 과거 소프트웨어와의 하위 호환성 제공.
    • PagingSegmentation을 통한 가상 메모리 관리.

2. Real-Address Mode (실제 주소 모드)

  • Intel 8086 프로세서의 환경을 제공합니다.
  • 특징:
    • 간단한 메모리 모델로, 기본적으로 1MB의 메모리 접근 가능.
    • 일부 확장 기능 포함 (예: Protected Mode로 전환 가능).
    • 프로세서는 초기화(Reset) 후 이 모드에서 시작됩니다.

3. System Management Mode (SMM)

  • 프로세서의 특수한 운영 모드로, 전원 관리 및 하드웨어 제어를 위한 기능 제공.
  • 특징:
    • SMI# 핀 신호를 통해 진입.
    • 현재 프로그램의 상태를 저장하고, 별도의 주소 공간에서 SMM 코드를 실행.
    • RSM 명령어를 실행하면, 이전 모드로 복귀.

4. Virtual-8086 Mode (가상 8086 모드)

  • Protected Mode의 하위 모드.
  • 특징:
    • Intel 8086 소프트웨어를 멀티태스킹 환경에서 실행 가능.
    • EFLAGS 레지스터의 VM 플래그로 제어.
    • Protected Mode에서 태스크 전환, 인터럽트 또는 예외 핸들러를 통해 진입.

Intel 64 아키텍처에서 추가된 운영 모드

1. IA-32e Mode (IA-32 확장 모드)

  • IA-32e 모드는 64비트 모드와 **호환 모드(Compatibility Mode)**로 구성됩니다.
    • 64비트 모드:
      • 64비트 선형 주소를 지원.
      • 64GB 이상의 물리 메모리 접근 가능.
    • 호환 모드:
      • 대부분의 기존 Protected Mode 애플리케이션을 변경 없이 실행 가능.

모드 간 전환

1. Real-Address Mode → Protected Mode

  • CR0 레지스터의 PE(Protection Enable) 플래그를 설정하여 전환.

2. Protected Mode → Virtual-8086 Mode

  • EFLAGS 레지스터의 VM(Virtual Mode) 플래그를 설정하여 진입.
  • 태스크 전환 또는 인터럽트/예외 핸들러로 전환 수행.

3. Protected Mode → IA-32e Mode

  • IA32_EFER 레지스터의 LME(Long Mode Enable) 플래그를 설정.
  • Paging 활성화 필요.

4. SMM(System Management Mode)

  • SMI# 핀 신호로 진입.
  • RSM 명령어를 통해 이전 모드로 복귀.

기술적 플래그와 레지스터

  1. CR0 레지스터: PE 플래그를 통해 Real-Address Mode와 Protected Mode를 전환.
  2. EFLAGS 레지스터: VM 플래그로 Protected Mode와 Virtual-8086 Mode를 전환.
  3. IA32_EFER 레지스터:
    • LME 플래그: IA-32e 모드 활성화.
    • LMA 플래그: 64비트 모드와 호환 모드 결정.
  4. CS 레지스터의 L 비트: IA-32e 모드에서 현재 코드 세그먼트가 64비트 모드인지 호환 모드인지 결정.

시스템 플래그와 EFLAG

IA32_EFER 레지스터 필드 설명

  1. Bit 0 (SYSCALL Enable: IA32_EFER.SCE)
    • 이 비트는 SYSCALLSYSRET 명령어를 64비트 모드에서 활성화하거나 비활성화하는 데 씀
    • R/W(읽기/쓰기 가능)로 설정할 수 있음.
    • 예: 운영체제가 SYSCALL 명령어를 지원하려면 이 비트를 활성화해야 함.
  2. Bit 8 (IA-32e Mode Enable: IA32_EFER.LME)
    • IA-32e 모드(64비트 모드)를 활성화하기 위한 비트.
    • R/W로 설정 가능.
    • IA-32e 모드로 전환하려면 이 비트를 1로 설정해야 하고, 페이징도 활성화해야 함.
  3. Bit 10 (IA-32e Mode Active: IA32_EFER.LMA)
    • 현재 IA-32e 모드가 활성화되었는지를 나타내는 읽기 전용 비트.
    • LME 비트가 설정되고 페이징이 활성화되면 자동으로 1로 설정됨.
  4. Bit 11 (Execute Disable Bit Enable: IA32_EFER.NXE)
    • NX (No-eXecute) 비트를 활성화해서 특정 메모리 페이지에서 코드 실행을 막는 데 사용돼.
    • 이를 통해 실행할 수 없는 메모리 영역에서의 명령 실행을 차단해 보안을 강화함.
    • R/W로 설정 가능.
    • 예: PAE(Page Address Extension)와 함께 사용하면 악성 코드의 실행을 방지할 수 있음.
  5. Reserved (비워진 비트)
    • 나머지 비트들은 현재 사용되지 않고 예약된 상태

EFLAGS 주요 플래그와 필드

  1. TF (Trap Flag, Bit 8)
    • 디버깅용 단일 단계 모드를 활성화하거나 비활성화.
    • 1로 설정 시: 명령어 하나가 실행될 때마다 디버그 예외(#DB)가 발생.
    • 디버깅 시 프로그램 상태를 한 명령어 단위로 점검할 수 있음.
  2. IF (Interrupt Enable Flag, Bit 9)
    • 마스크 가능 하드웨어 인터럽트의 허용 여부를 제어.
    • 1로 설정 시: 인터럽트를 허용.
    • 예외(Exception)나 마스크 불가능 인터럽트(NMI)에는 영향을 주지 않음.
  3. IOPL (I/O Privilege Level, Bits 12-13)
    • 현재 실행 중인 프로그램의 I/O 권한 레벨을 나타냄.
    • 현재 프로그램의 **CPL(Current Privilege Level)**이 IOPL 이하일 때만 I/O 접근 가능.
    • 권한 레벨이 낮아야 I/O 명령을 실행할 수 있어.
  4. NT (Nested Task Flag, Bit 14)
    • 태스크 체인을 제어.
    • 태스크 호출(CALL), 인터럽트, 예외가 발생하면 설정되고, IRET 명령으로 복귀할 때 사용.
    • POPF/POPFD로 설정 가능하지만 예상치 못한 예외를 일으킬 수 있음.
  5. RF (Resume Flag, Bit 16)
    • *디버그 예외(#DB)**를 임시로 비활성화.
    • 디버깅 중 명령어가 재실행되면서 또 다른 예외가 발생하지 않도록 방지.
    • 사용 후 자동으로 0으로 초기화됨.
  6. VM (Virtual-8086 Mode, Bit 17)
    • Virtual-8086 모드 활성화 여부를 결정.
    • 1로 설정 시: Virtual-8086 모드 활성화.
    • 0으로 설정 시: Protected Mode로 복귀.
  7. AC (Alignment Check, Bit 18)
    • 데이터의 메모리 정렬을 확인.
    • CR0 레지스터의 AM 비트가 활성화된 경우에만 작동.
    • 정렬되지 않은 데이터에 접근하면 예외 발생.
  8. VIF (Virtual Interrupt Flag, Bit 19)
    • IF 플래그의 가상 이미지를 저장.
    • VME 또는 PVI 플래그가 활성화된 경우에만 작동.
  9. VIP (Virtual Interrupt Pending, Bit 20)
    • 소프트웨어에 의해 설정되며, 인터럽트가 대기 중임을 나타냄.
    • 프로세서는 이 비트를 읽기만 하고 수정하지 않음.
  10. ID (Identification Flag, Bit 21)
    • 이 플래그를 설정/해제할 수 있는지는 CPUID 명령 지원 여부를 나타냄.

RFLAG

  • RFLAGS와 EFLAGS의 차이
    • 64비트 모드에서는 기존의 EFLAGS 레지스터가 RFLAGS로 확장돼서 64비트 크기를 가짐.
    • 하지만 상위 32비트는 사용되지 않고 예약된 상태(Reserved).
  • Virtual-8086 모드 비활성화
    • IA-32e 모드에서는 Virtual-8086 모드가 지원되지 않음.
      • VM 비트(Virtual-8086 Mode Flag)를 설정하려 해도 무시됨.
      • 이는 IA-32e 모드가 64비트 환경에 맞춰 동작하기 때문에 옛날 8086 소프트웨어를 지원할 필요가 없기 때문.
  • NT(Nested Task) 비트 동작
    • 프로세서는 IA-32e 모드에서 NT 비트를 자동으로 설정하지 않음.
    • 하지만 소프트웨어는 NT 비트를 설정 가능.
      • 단, NT 비트를 설정한 상태에서 IRET 명령을 실행하면 **일반 보호 예외(#GP)**가 발생.
  • SYSCALL/SYSRET 명령어의 동작
    • SYSCALL(시스템 호출)과 SYSRET(시스템 복귀) 명령은 RFLAGS/EFLAGS의 특정 비트를 제어 가능.
      • 예를 들어, 명령 실행 중 특정 플래그를 저장하거나 복구할 수 있음.
      • 이 동작은 프로그래밍 가능한 방식으로 설정돼서, 소프트웨어가 필요에 따라 플래그를 조정할 수 있음.

IRET 명령이란?

  • *IRET (Interrupt Return)**은 인터럽트 핸들러 실행이 끝난 후 CPU가 원래 실행하던 프로그램으로 복귀할 때 사용하는 명령.

이 명령은 인터럽트 처리 루틴의 마지막에 위치하며, 스택에 저장된 이전 실행 상태를 복구하는 역할을 함.


IRET 명령의 동작 과정

  1. IRET 실행 시 CPU가 복구하는 상태:
    • EIP/RIP (Instruction Pointer): 중단되었던 명령어의 주소.
    • CS (Code Segment): 코드 세그먼트 레지스터 값.
    • EFLAGS/RFLAGS: 인터럽트 발생 전에 CPU의 상태 플래그.
  2. 프로세스:
    • CPU는 스택에 저장된 값을 사용해 위 3가지 레지스터를 복구.
    • 복구 후 원래 실행 중이던 코드로 복귀.

IA-32e 모드에서 IRET 명령이 GP (#GP)를 발생시키는 이유

  1. NT(Nested Task) 비트와 IRET의 관계:
    • NT 비트Nested Task 플래그로, 태스크 간의 호출 체인을 관리하는 데 사용됨.
    • 32비트 Protected Mode에서는 NT 비트가 설정된 경우, IRET 명령은 태스크를 전환하며 실행을 복구.
    • 그러나 IA-32e 모드에서는 NT 비트를 사용하는 Nested Task 기능이 지원되지 않음.
  2. IRET 실행 시 NT 비트 확인:
    • IA-32e 모드에서 IRET 명령은 스택에서 EFLAGS/RFLAGS 값을 복구하는 과정에서 NT 비트를 확인함.
    • 만약 NT 비트가 1로 설정되어 있으면, 프로세서는 이를 잘못된 상태로 간주하고 **일반 보호 예외(GP, #GP)**를 발생시킴.
  3. 왜 GP(#GP)가 발생하는가?:
    • IA-32e 모드에서는 NT 비트를 사용하는 기능이 금지되어 있음.
    • IRET 명령이 NT 비트를 활성화된 상태로 복구하려고 하면, 이는 규격에 맞지 않은 동작으로 간주되므로 #GP 예외를 발생시킴.

메모리 관리 레지스터 개요

이 레지스터들은 CPU가 메모리를 효율적으로 관리하기 위해 사용하는 데이터 구조(GDT, LDT, IDT, TSS)의 위치크기를 저장한다.

  • GDTR (Global Descriptor Table Register): 전역 디스크립터 테이블(GDT) 위치와 크기를 지정.
  • LDTR (Local Descriptor Table Register): 로컬 디스크립터 테이블(LDT) 위치와 크기를 지정.
  • IDTR (Interrupt Descriptor Table Register): 인터럽트 디스크립터 테이블(IDT) 위치와 크기를 지정.
  • TR (Task Register): 현재 태스크의 태스크 상태 세그먼트(TSS) 정보를 지정.

2. 각 레지스터 설명

2.1 GDTR (Global Descriptor Table Register)

  • 역할: 전역 디스크립터 테이블(GDT)의 **기본 주소(Base Address)**와 **테이블 크기(Limit)**를 저장.
    • GDT는 세그먼트의 속성(베이스 주소, 크기, 접근 권한 등)을 정의하는 테이블.
  • 구조:
    • 32비트 모드: 32비트 기본 주소와 16비트 크기.
    • 64비트 모드: 64비트 기본 주소와 16비트 크기.
  • 초기화:
    • CPU가 리셋되면 기본 주소는 0으로, 크기는 0xFFFF로 설정됨.
    • 보호 모드 사용 시 반드시 새 값으로 초기화 필요.
  • 명령어:
    • LGDT: GDTR 값을 로드.
    • SGDT: GDTR 값을 저장.

2.2 LDTR (Local Descriptor Table Register)

  • 역할: 로컬 디스크립터 테이블(LDT)의 기본 주소(Base Address), 크기(Limit), 그리고 디스크립터 속성을 저장.
    • LDT는 특정 태스크나 프로그램에 필요한 세그먼트 디스크립터를 관리.
  • 구조:
    • 32비트 모드: 32비트 기본 주소와 16비트 크기.
    • 64비트 모드: 64비트 기본 주소와 16비트 크기.
  • 초기화:
    • CPU가 리셋되면 기본 주소는 0, 크기는 0xFFFF로 설정.
    • LLDT 명령으로 LDTR 초기화 가능.
  • 명령어:
    • LLDT: LDTR 값을 로드.
    • SLDT: LDTR 값을 저장.

2.3 IDTR (Interrupt Descriptor Table Register)

  • 역할: 인터럽트 디스크립터 테이블(IDT)의 기본 주소(Base Address)와 크기(Limit)를 저장.
    • IDT는 인터럽트 및 예외 처리 루틴의 위치와 속성을 정의.
  • 구조:
    • 32비트 모드: 32비트 기본 주소와 16비트 크기.
    • 64비트 모드: 64비트 기본 주소와 16비트 크기.
  • 초기화:
    • CPU가 리셋되면 기본 주소는 0, 크기는 0xFFFF로 설정.
    • 인터럽트 처리 루틴을 등록하려면 초기화 필요.
  • 명령어:
    • LIDT: IDTR 값을 로드.
    • SIDT: IDTR 값을 저장.

2.4 TR (Task Register)

  • 역할: 현재 태스크의 태스크 상태 세그먼트(TSS) 정보를 저장.
    • TSS는 태스크 간의 전환 시 레지스터 값, 스택 포인터 등을 저장하는 데 사용.
  • 구조:
    • 32비트 모드: 32비트 기본 주소와 16비트 크기.
    • 64비트 모드: 64비트 기본 주소와 16비트 크기.
  • 초기화:
    • CPU가 리셋되면 기본 주소는 0, 크기는 0xFFFF로 설정.
    • 새로운 태스크로 전환될 때 자동으로 업데이트.
  • 명령어:
    • LTR: TR 값을 로드.
    • STR: TR 값을 저장.

3. 세그먼트 관리의 주요 흐름

  1. GDTR: 시스템 전반의 세그먼트 정보(GDT)를 관리.
  2. LDTR: 특정 태스크나 프로그램의 세그먼트 정보(LDT)를 관리.
  3. IDTR: 인터럽트와 예외 처리를 위한 IDT를 관리.
  4. TR: 현재 실행 중인 태스크의 상태(TSS)를 관리.

4. 초기화와 동작

  • CPU가 전원을 켜거나 리셋되면 모든 레지스터 값은 기본값(0 또는 0xFFFF)으로 설정됨.
  • 보호 모드(Protected Mode) 또는 IA-32e 모드로 전환하려면 GDTR과 IDTR 등의 레지스터를 반드시 초기화해야 함.
  • 태스크 전환 시, LDTRTR은 새로운 태스크의 디스크립터 정보를 자동으로 로드.

2.5 CONTROL REGISTERS 요약

  • CR0, CR1, CR2, CR3, CR4, CR8로 구성.
  • 32비트 모드에서는 32비트, 64비트 모드에서는 64비트 크기로 확장.
  • 제어 레지스터는 MOV 명령어를 통해 읽기/쓰기 가능하며, 권한 레벨 0에서만 접근 가능.
  • *예약된 비트(Reserved Bits)**는 반드시 0으로 설정해야 하며, 잘못된 설정은 예외(#GP)를 발생시킴.

각 레지스터의 역할

1. CR0 (Control Register 0)

  • CPU의 시스템 제어 플래그를 포함.
  • 운영 모드와 CPU 상태를 제어.
  • 보호 모드(Protected Mode)와 가상 메모리(Paging) 활성화 플래그가 포함됨.
    • 예: PE(Protection Enable), PG(Paging Enable), CD(Cache Disable).

2. CR1

  • 예약됨(Reserved): 사용되지 않음.

3. CR2

  • *페이지 폴트 주소(Page-Fault Linear Address)**를 저장.
  • 페이지 폴트가 발생한 메모리 주소를 제공해 디버깅과 예외 처리를 지원.
  • 모든 64비트가 쓰기 가능.

4. CR3

  • 페이징 구조의 루트 주소를 저장.
    • 페이지 디렉터리, PML4 테이블, PML5 테이블의 물리 주소(Base Address) 포함.
  • *PCD (Page Cache Disable)**와 PWT (Page Write Through) 플래그를 포함.
    • 페이징 구조의 캐싱을 제어.
  • 12비트 정렬 필요:
    • 하위 12비트는 항상 0이어야 하며, 페이지 경계(4KB)로 정렬되어야 함.
  • Physical Address Extension(PAE), 4-Level Paging, 5-Level Paging 지원.
  • 4 레벨 페이징 및 5 레벨 페이징을 사용하는 경우 CR3 레지스터에는 PML4의 기본 주소가 포함됩니다.

5. CR4

  • 아키텍처 확장 기능을 활성화하는 플래그 그룹 포함.
    • 예: PAE(Physical Address Extension), SSE(Streaming SIMD Extensions), SMAP(Supervisor Mode Access Prevention).
  • 64비트 모드 전용 비트 (CR4[63:32]):
    • IA-32e 모드(64비트 모드)에서만 사용 가능.
    • 64비트 모드 밖에서는 효과 없음.

6. CR8 (64비트 모드 전용)

  • *Task Priority Register (TPR)**에 대한 읽기/쓰기 접근 제공.
    • 외부 인터럽트의 우선순위를 제어.
  • 64비트 모드에서만 사용 가능.
    • 호환 모드(Compatibility Mode)에서도 인터럽트 필터링은 계속 적용됨.

사용 및 제약 사항

  1. 권한 레벨 0에서만 접근 가능:
    • 운영체제와 같은 특권 코드만 제어 레지스터를 읽거나 쓸 수 있음.
    • 권한 레벨 1, 2, 3에서는 접근 불가.
  2. 예약된 비트 사용 제한:
    • CR0[31:0]의 예약된 비트를 설정하려 하면 무시됨.
    • CR0[63:32] 또는 CR4의 예약된 비트를 설정하면 #GP(0) 예외가 발생.
  3. MOV 명령 동작:
    • 64비트 모드에서 MOV 명령은 상위 32비트를 포함한 모든 비트를 유지.
    • 64비트 모드 외부에서 MOV 명령 실행 시 상위 32비트는 0으로 초기화됨.


CR0 플래그 정리

  1. CR0.PG (Paging, 비트 31)
    • 페이징 활성화/비활성화를 제어.
    • 1로 설정: 페이징 활성화 → 가상 주소를 물리 주소로 매핑.
    • 0으로 설정: 페이징 비활성화 → 모든 주소를 물리 주소로 처리.
    • 주의: PE(Protection Enable) 플래그가 설정되지 않은 상태에서 PG를 설정하면 #GP(일반 보호 예외) 발생.

  1. CR0.CD (Cache Disable, 비트 30)
    • 캐시 비활성화를 제어.
    • 1로 설정: 프로세서의 캐시 접근 제한.
    • 캐시를 비활성화하려면 CD를 설정하고 캐시를 무효화해야 함.

  1. CR0.NW (Not Write-through, 비트 29)
    • 쓰기 처리 방식(Write-through 또는 Write-back)을 결정.
    • 0으로 설정: 캐시에 Write-back 활성화 (데이터를 캐시에 먼저 쓰고 나중에 메모리에 씀).
    • 1로 설정: Write-through 활성화 (데이터를 캐시와 메모리에 동시에 씀).

  1. CR0.AM (Alignment Mask, 비트 18)
    • 메모리 정렬 검사를 제어.
    • 1로 설정: 정렬되지 않은 메모리 접근 시 예외 발생.
    • 조건: AM 플래그, EFLAGS.AC 플래그가 1이고, CPL이 3(사용자 모드)일 때.

  1. CR0.WP (Write Protect, 비트 16)
    • 슈퍼바이저 레벨에서 읽기 전용 페이지 쓰기를 제어.
    • 1로 설정: 읽기 전용 페이지에 쓰기 금지.
    • 0으로 설정: 읽기 전용 페이지에 쓰기 가능.
    • OS에서 Copy-on-Write(COW) 구현에 사용.

  1. CR0.NE (Numeric Error, 비트 5)
    • x87 FPU 에러 보고 메커니즘을 제어.
    • 1로 설정: 내부(native) 방식으로 에러 보고.
    • 0으로 설정: PC 스타일의 외부 핀(FERR#, IGNNE#)을 사용한 에러 보고.
    • 현대 OS에서는 이 비트를 1로 설정해 내부 방식 사용을 권장.

  1. CR0.ET (Extension Type, 비트 4)
    • 구식 플래그로, Intel 386/486 프로세서에서 사용.
    • 최신 프로세서에서는 항상 1로 고정되어 있음.

  1. CR0.TS (Task Switched, 비트 3)
    • 태스크 전환 시 FPU/MMX/SSE 레지스터 상태 저장 지연을 제어.
    • 1로 설정: 태스크 전환 후 FPU/MMX/SSE 명령어를 실행하면 #NM 예외 발생.
    • 예외 핸들러가 FPU/MMX/SSE 상태를 저장하고 TS 플래그를 초기화(Clear)해야 함.
    • 새로운 태스크에서 FPU 명령어를 실행하지 않으면 레지스터 상태를 저장하지 않아도 됨.

  1. CR0.EM (Emulation, 비트 2)
    • FPU 명령어 에뮬레이션을 제어.
    • 1로 설정: FPU 명령어를 소프트웨어 에뮬레이션으로 실행.
    • 0으로 설정: 하드웨어 FPU에서 실행.

  1. CR0.MP (Monitor Coprocessor, 비트 1)
  • x87 FPU와 WAIT/FWAIT 명령어의 사용 조건을 제어.
  • MP 플래그와 TS 플래그를 함께 사용해 FPU 사용 여부를 결정.

2. CR3 레지스터 (Control Register 3)

CR3는 페이징 구조의 루트 주소와 캐시 동작을 제어.

플래그 이름 비트 설명

PCD Page-level Cache Disable 4 페이징 구조의 캐싱을 비활성화.
PWT Page-level Write-Through 3 페이징 구조의 쓰기 처리 방식을 제어 (Write-through 또는 Write-back).
LAM_U57 User LAM57 Enable 61 사용자 포인터에서 선형 주소 비트 62:57 마스킹 활성화.
LAM_U48 User LAM48 Enable 62 사용자 포인터에서 선형 주소 비트 62:48 마스킹 활성화.

3. CR4 레지스터 (Control Register 4)

CR4는 프로세서의 확장 기능을 활성화하거나 제어하는 플래그를 포함함.

플래그 이름 비트 설명

VME Virtual-8086 Mode Extensions 0 Virtual-8086 모드에서 인터럽트 및 예외 처리 확장을 활성화.
PVI Protected-Mode Virtual Interrupts 1 보호 모드에서 가상 인터럽트 플래그(VIF) 활성화.
TSD Time Stamp Disable 2 RDTSC 명령어를 권한 레벨 0에서만 실행 가능하도록 제한.
DE Debugging Extensions 3 DR4, DR5 레지스터 접근 시 #UD 예외 발생.
PSE Page Size Extensions 4 32비트 페이징에서 4MB 페이지 활성화.
PAE Physical Address Extension 5 물리 주소 확장 활성화. 32비트를 초과하는 물리 주소를 지원.
MCE Machine-Check Enable 6 Machine Check Exception 활성화.
PGE Page Global Enable 7 글로벌 페이지를 활성화해 TLB 플러시 시 제외.
PCE Performance-Monitoring Counter Enable 8 RDPMC 명령어를 모든 보호 레벨에서 실행 가능.
OSFXSR OS Support for FXSAVE/FXRSTOR Instructions 9 FXSAVE/FXRSTOR 명령어와 SSE/SSE2/SSE3/SSSE3/SSE4 지원 활성화.
OSXMMEXCPT OS Support for SIMD Floating-Point Exceptions 10 SIMD 부동소수점 예외(#XM)를 처리하는 운영체제 지원 활성화.
UMIP User-Mode Instruction Prevention 11 사용자 모드에서 특정 명령어(SGDT, SIDT 등) 실행 금지.
LA57 57-bit Linear Addressing 12 57비트 선형 주소 지원(5레벨 페이징).
VMXE VMX Enable 13 VMX(Virtual Machine Extensions) 활성화.
SMXE SMX Enable 14 SMX(Safer Mode Extensions) 활성화.
FSGSBASE FS/GS Base Enable 16 RDFSBASE, WRFSBASE 등의 명령어 활성화.
PCIDE PCID Enable 17 프로세스 컨텍스트 식별자(PCID) 활성화. IA-32e 모드에서만 사용 가능.
OSXSAVE XSAVE and Processor Extended States Enable 18 XSAVE/XRSTOR 명령어 및 확장 상태 지원 활성화.
KL Key Locker Enable 19 AES Key Locker 명령어 활성화.
SMEP Supervisor Mode Execution Prevention 20 커널에서 사용자 모드 코드를 실행하지 못하도록 방지.
SMAP Supervisor Mode Access Prevention 21 커널에서 사용자 모드 메모리 접근을 방지.
PKE Protection Keys for User-Mode Pages 22 사용자 모드 메모리 페이지의 보호 키 활성화.
CET Control-Flow Enforcement Technology 23 제어 흐름 보호 기술 활성화.
PKS Protection Keys for Supervisor-Mode Pages 24 커널 모드 메모리 페이지의 보호 키 활성화.
UINTR User Interrupts Enable 25 사용자 인터럽트 지원 활성화.
LAM_SUP Supervisor Linear-Address Masking 28 커널 주소의 선형 주소 마스킹 활성화.

4. CR8 레지스터 (Control Register 8, 64비트 모드 전용)

CR8는 외부 인터럽트의 우선순위를 제어.

플래그 이름 비트 설명

TPL Task Priority Level 3:0 인터럽트 우선순위 임계값 설정. 0은 모든 인터럽트 허용, 15는 모든 인터럽트 차단.

'Research' 카테고리의 다른 글

SeedSeeker  (1) 2024.02.18
ComRaceConditionSeeker  (0) 2024.02.13
CodeQL Summary  (1) 2024.02.06
What Is Windows Search DB?  (1) 2023.12.26
Twice the Bits, Twice the Trouble: Vulnerabilities Induced by Migrating to 64-Bit Platforms  (2) 2023.11.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.