Home Intel basic execution environment
Post
Cancel

Intel basic execution environment

더욱 자세한 내용은 Intel® 64 and IA-32 Architectures Software Developer Manuals 를 참조해라.

x86-64 프로세서의 운영 모드 요약

x86-64 프로세서에는 다섯 가지 주요 운영 모드가 있다. 이 모드는 리얼 모드, 보호 모드, IA-32e 모드, 시스템 관리 모드, 가상 8086 모드로 구분된다. 각 모드는 다양한 특징을 가지고 있으며, 컨트롤 레지스터와 인터럽트를 통해 전환된다. 모든 Intel의 CPU는 초기 부팅 시 리얼 모드에서 시작한다.

리얼 모드

  • 16비트 모드로, 프로세서 초기 상태이며 8086 프로세서와 호환된다.
  • 최대 1MB의 주소 공간을 지원한다.

보호 모드

  • 32비트 모드로, 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 제공한다.
  • 최대 4GB의 주소 공간을 지원한다.

IA-32e 모드

  • 32비트 호환 모드와 64비트 모드의 두 가지 서브모드로 구성된다.
  • 최대 16EB의 주소 공간을 지원한다.
  • 리얼 모드에서 IA-32e 모드로 전환하려면 반드시 보호 모드를 거쳐야 함

x86-64 ISA의 대표적인 두 제조사 중 하나인 인텔에서는 IA-32e 모드라고 부르고, AMD에서는 Long Mode라고 부른다. 두 모드는 동일하며, 이 글에서는 인텔 표기법을 따른다.

시스템 관리 모드

  • 전원 관리나 하드웨어 제어 등의 특수 기능을 제공한다.

가상 8086 모드

  • 보호 모드 내부에서 가상의 환경을 설정하여 리얼 모드처럼 동작한다.

필수 운영 모드

64비트 OS가 반드시 지원해야 하는 운영 모드는 리얼 모드, 보호 모드, IA-32e 모드(64비트 서브모드)이다. 시스템 관리 모드와 가상 8086 모드는 특수한 상황에서 사용되므로 필요 시에만 구현된다.

리얼 모드

  • 프로세서가 전원이 켜지거나 리셋되면 진입한다.
  • BIOS 기능을 사용할 수 있다.
  • 주로 OS 이미지를 디스크에서 메모리로 복사하여 보호 모드로 전환하는 작업을 수행한다.

보호 모드

  • 리얼 모드에서 IA-32e 모드로 전환하려면 반드시 거쳐야 한다.
  • 32비트 윈도우나 리눅스 OS가 동작하는 기본 모드이다.
  • 보호, 멀티태스킹, 세그먼테이션, 페이징 등의 기능을 제공한다.

IA-32e 모드

  • 32비트 호환 모드와 64비트 모드가 있다.
  • 64비트 모드에서는 최대 16EB의 주소 공간을 제공하며, 보호 모드보다 더 많은 레지스터와 기능을 제공한다.
  • 32비트 호환 모드에서는 보호 모드와 같이 동작하여 32비트 코드를 그대로 실행할 수 있다.

운영 모드 전환

운영 모드 전환은 현재 동작 중인 모드에 따라 다르다. 예를 들어, 리얼 모드에서 보호 모드로는 바로 전환할 수 있지만, IA-32e 모드로 전환하려면 보호 모드를 거쳐야 한다. 시스템 관리 모드는 모든 모드에서 진입할 수 있으며, 처리가 끝나면 이전 모드로 복귀하거나 리셋을 통해 리얼 모드로 돌아갈 수 있다.

image

이상으로 x86-64 프로세서의 운영 모드와 그 특징에 대해 간단히 살펴보았다. 다음으로는 x86-64 프로세서의 레지스터와 메모리 모델에 대해 알아보겠다.


레지스터

x86-64 프로세서는 다양한 레지스터를 제공하여 운영 체제 및 응용 프로그램의 효율적인 실행을 돕는다. 주요 레지스터는 일반 목적 레지스터, 제어 레지스터, 세그먼트 레지스터, 디버그 레지스터, 그리고 모델 특수 레지스터로 구분된다.


실행 모드에 따른 레지스터 개요

다음 그림을 참고하면 좋다.

non-64 bit

image

64-bit

image


주요 레지스터의 설명

GPR

범용 레지스터(General Purpose Register, GPR)는 계산, 메모리 어드레스 지정, 임시 저장 공간 등의 목적으로 사용되는 레지스터이다. 운영 모드에 따라 범용 레지스터의 크기와 수가 다르다.

16비트 및 32비트 모드: x86 계열 프로세서에서는 8개의 범용 레지스터가 있다. • 64비트 모드: x86-64 계열 프로세서에서는 16개의 범용 레지스터가 있다.

범용 레지스터는 프로세서 내부의 작은 공간으로 연산, 제어, 상태 표시, 디버깅 등의 목적으로 사용된다. 다양한 기능을 제공하기 위해 여러 종류의 레지스터가 있지만, 실제로 운영 체제 개발 시 필수적인 부분만 사용하면 된다.

레지스터의 용도와 이름

범용 레지스터는 다양한 목적으로 사용될 수 있으며, 특정 명령어는 특정 레지스터와 함께 사용해야 한다. x86-64 프로세서는 x86 프로세서의 레지스터 외에도 R8~R15로 이름 붙여진 8개의 추가 레지스터를 가진다. 이 추가 레지스터는 다른 범용 레지스터와 동일한 기능을 가지며, 특수한 용도가 정의되지 않았다.

레지스터설명
RAX누산기로 사용되는 레지스터
RBX베이스 레지스터
RCX카운터 레지스터
RDX데이터 레지스터
RSI소스 인덱스 레지스터
RDI목적지 인덱스 레지스터
RBP베이스 포인터 레지스터
RSP스택 포인터 레지스터
R8~R15추가 범용 레지스터

범용 레지스터의 크기와 운영 모드 요약

x86-64 프로세서에는 운영 모드별로 별도의 레지스터가 존재하지 않는다. 대신, 64비트 크기의 범용 레지스터만 있으며, 보호 모드나 리얼 모드에서는 이 레지스터의 일부 영역만 사용하도록 설계되어 있다. 이를 통해 다양한 운영 모드에서 효율적으로 동작할 수 있다.

범용 레지스터 접근 방식

  • 64비트 레지스터: RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15
  • 32비트 레지스터: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, R8D-R15D
  • 16비트 레지스터: AX, BX, CX, DX, SI, DI, BP, SP, R8W-R15W
  • 상위 8비트 레지스터: AH, BH, CH, DH
  • 하위 8비트 레지스터: AL, BL, CL, DL, SIL, DIL, BPL, SPL, R8L-R15L

레지스터 크기 구분

  • 64비트 레지스터: R 접두사 사용 (예: RAX, RBX)
  • 32비트 레지스터: E 접두사 또는 D 접미사 사용 (예: EAX, R8D)
  • 16비트 레지스터: 접두사 없이 사용하거나 W 접미사 사용 (예: AX, R8W)
  • 8비트 레지스터:
    • 상위 8비트: H 접미사 사용 (예: AH, BH)
    • 하위 8비트: L 접미사 사용 (예: AL, BL, R8L)

운영 모드별 레지스터 접근

  • 리얼 모드: 16비트 이하 크기의 레지스터만 접근 가능
  • 보호 모드: 16비트, 32비트 레지스터 접근 가능
  • IA-32e 모드: 64비트 레지스터 접근 가능

다음 그림을 참고하면 좋다.

image

세그먼트 레지스터 (Segment Register)

세그먼트 레지스터(Segment Register)는 16비트 레지스터로, 주소 영역을 다양한 크기로 구분하는 역할을 한다. 각 운영 모드에서의 역할은 다음과 같다:

  • 리얼 모드: 고정된 크기의 주소 영역을 지정
  • 보호 모드 및 IA-32e 모드: 접근 권한, 세그먼트의 시작 주소와 크기 등을 지정하여 응용 프로그램으로부터 커널 영역을 보호

32비트 모드, 64비트 모드에서 세그먼트의 기능은 사실상 무시된다.

세그먼트 레지스터 구성

총 6개의 세그먼트 레지스터가 있다:

레지스터설명
CS코드 영역을 가리킴. 데이터 이동 명령으로 값을 변경할 수 없으며, 점프 명령이나 인터럽트 관련 명령으로 변경 가능
DS데이터 영역을 가리킴. 데이터 이동 명령으로 값을 변경할 수 있음
ES데이터 이동 명령으로 값을 변경할 수 있음
FS데이터 영역에 접근할 때 사용됨
GS문자열 관련 작업을 처리할 때 사용됨
SS스택 영역을 가리킴. 데이터 이동 명령으로 값을 변경할 수 있음. 스택 관련 레지스터(SP, BP)를 통해 스택에 접근할 때 사용됨

세그먼트 레지스터의 역할

세그먼트 레지스터는 주소 공간을 목적에 따라 구분하는 역할을 하며, 이는 메모리 관리 기법과 깊은 관계가 있다. 메모리 관리 기법에는 크게 두 가지가 있다:

  • 세그먼테이션: 세그먼트 레지스터를 통해 주소 공간을 구분하는 방식
  • 페이징: 메모리를 일정 크기로 나누어 관리하는 방식

컨트롤 레지스터

컨트롤 레지스터(Control Register)는 운영 모드를 변경하고, 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터이다. x86 프로세서에는 CR0, CR1, CR2, CR3, CR4의 5개의 컨트롤 레지스터가 있으며, x86-64 프로세서에는 CR8이 추가되어 총 6개의 컨트롤 레지스터가 있다.

x86-64 프로세서의 컨트롤 레지스터

레지스터설명
CR0운영 모드를 제어. 리얼 모드에서 보호 모드로 전환하고, 캐시, 페이징 기능 등을 활성화
CR1프로세서에 의해 예약된 레지스터
CR2페이지 폴트 발생 시 페이지 폴트가 발생한 선형 주소 저장
CR3페이지 디렉터리의 물리 주소와 페이지 캐시 관련 기능 설정
CR4프로세서에서 지원하는 확장 기능 제어. 페이지 크기 확장이나 메모리 영역 확장 등의 기능 활성화
CR8태스크 우선순위 레지스터 값을 제어. 인터럽트를 걸러주는 필터 역할. IA-32e 모드에서만 접근 가능

컨트롤 레지스터의 크기는 리얼 모드와 보호 모드에서는 32비트이고, IA-32e 모드에서는 64비트로 확장된다. 단, CR0와 CR4, CR8 레지스터는 상위 32비트를 0으로 설정해야 한다.

컨트롤 레지스터의 구조와 사용

컨트롤 레지스터는 운영 모드와 확장 기능을 제어하는 중요한 역할을 하며, 구조가 복잡하다. 각 필드는 특정 기능을 활성화하거나 비활성화하는 역할을 하며, 운영 모드에 따라 필드의 중요도가 다르다.

다음 그림은 컨트롤 레지스터의 구조를 나타낸 그림이다.

image


메모리 관리 기법

X86-64 프로세서에서 지원하는 메모리 관리 기법은 페이징과 세그먼테이션으로 나눌 수 있다.

메모리 관리 기법을 사용하려면 관련 레지스터에 특정한 자료구조를 설정해야 한다.

  1. 세그먼테이션 -> 세그먼트 레지스터에 세그먼트의 시작
This post is written by david61song