반응형

Intel 64bit 호환 프로세서(x86-64 프로세서)에는 다섯 가지 운영 모드가 있습니다.

 

- 리얼 모드

- 보호 모드

- IA-32e 모드

- 시스템 관리 모드

- 가상 8086 모드

 

위의 다섯 가지 운영 모드 전부 필요한 것은 아닙니다.

 

자신이 개발하는 OS의 상황에 따라 필요한 것만 넣으면 됩니다.

 

시스템 관리 모드가상 8086 모드특별한 경우에 사용되는 모드

 

저희가 만들 64bit 멀티코어 OS전원 관리 기능이나 보호 모드에서 16비트 코드를 실행하는 기능지원하지 않기 때문에 구현되지 않아도 됩니다.

 

앞으로 만들 64bit OS에서는 리얼 모드, 보호 모드, IA-32e 모드의 2 개의 서브 모드 중 64비트 모드3개의 모드가 필수적으로 필요합니다.

 

5가지 모드 특징
리얼 모드  프로세서 초기 상태로서 16bit 모드로 동작하며, 8086 프로세서와 호환되는 모드
 BIOS의 여러 기능을 사용할 수 있다.
 최대 1MB(2^20)의 주소 공간을 지원
 디바이스 드라이버를 제작하지 않아도 된다.
보호 모드  32bit 모드로 동작하고 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 하드웨어적으로 제공하는 모드
 4GB(2^32)의 주소 공간을 지원
IA-32e 모드  32bit 호환 모드 64bit 모드라는 두 가지 서브 모드로 구성되어 있다.
 16EB(2^64)의 주소 공간을 지원
시스템 관리 모드  전원 관리 하드웨어 제어 같은 특수 기능을 제공하는 모드
가상 8086 모드  보호 모드 내부에서 가상의 환경을 설정하여 리얼 모드처럼 동작하는 모드

 


앞으로 만들 64bit OS에서 필요로 하는 필수적인 모드 3가지

 

 

리얼 모드

 

프로세서가 어떠한 상태나 모드에 있던지 전원이 켜지거나 리셋되면 처음으로 진입하는 모드입니다.

 

대부분의 작업을 어셈블리어로 처리해야 하며, OS 이미지를 디스크에서 메모리로 복사하여 보호 모드로 변경하는 작업을 수행합니다.

 

 

 보호 모드

 

리얼 모드에서 IA-32e(64bit) 모드로 전환하기 위해서 반드시 거쳐야 합니다.

 

여러 기능을 제공하는 모드인 만큼 복잡한 구조이며, 레지스터와 자료구조가 다양합니다.

 

특히 이 모드에서 사용되는 레지스터IA-32e 모드에서도 같이 사용하므로 보호 모드를 이해하고 넘어가는 것이 좋습니다.

 

 

IA-32e 모드

 

위의 보호 모드보다 레지스터 수가 많으며, 더 많은 기능을 제공합니다.

 

대부분의 자료구조보호 모드의 자료구조와 같거나 크기만 2배로 확장되었고 일부 필드의 의미가 변하는 정도입니다.

 

서브 모드를 변경하여 32bit 호환 모드일 때 보호 모드에 있는 것처럼 동작하기에 32bit 코드를 실행할 수 있습니다.

 


→ 운영 모드 사이의 관계와 운영 모드의 전환

 

어떤 모드에서 또 다른 어떤 모드전환하려면 현재 동작 중인 모드에 따라 차이가 있습니다.

 

리얼 모드에서 보호 모드전환하려면 아래와 같이 바로 전환할 수 있습니다.

리얼 모드 -> 보호 모드

 

하지만 리얼 모드에서 IA-32e 모드전환하려면 아래와 같이 중간에 보호 모드를 거쳐서 전환해야 합니다.

리얼 모드 -> 보호 모드 -> IA-32e 모드

 

서적에서는 리얼모드에서 IA-32e 모드로 전환하려면 보호 모드를 거쳐야 한다고 되어 있지만, 추후 IA-32e 모드로 전환하기 위한 필요한 것들을 준비해두면 리얼 모드에서 바로 전환이 가능하다고 합니다.

(https://kkamagui.tistory.com/756?category=187695)

 

 


→ 운영 모드와 레지스터

 

x86-64 프로세서에는 많은 레지스터가 있습니다.

 

레지스터프로세서 내부에 있는 작은 공간으로 연산, 제어, 상태 표시, 디버깅 등의 여러 목적으로 사용합니다.

 

OS를 개발하는 과정에서 비중이 큰 레지스터범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 3가지입니다.

 


범용 레지스터

 

운영 모드와 관계가 깊은 레지스터로서 계산, 메모리 주소 지정, 임시 저장 공간 등의 목적으로 사용합니다.

 

범용 레지스터32bit 프로세서64bit 프로세서 모두 있으며, 범용 레지스터의 수프로세서가 지원하는 운영 모드에 따라 달라집니다.

 

범용 레지스터의 수가 많으면, 가장 대표적인 장점으로 수행 속도가 빨라집니다.

 

함수를 호출할 때 파라미터를 통해 값을 넘겨주는데

 

이때 다수의 범용 레지스터에 어떤 함수에서 사용할 정보가 담긴 함수 파라미터를 넣어 넘겨주면 스택 영역의 메모리에 접근하는 시간스택을 정리하는 시간을 줄일 수 있어서 수행 속도가 빨라집니다.

 

기본적인 8개의 레지스터는 공통적인 용도로 사용할 수 있게 가지고 있고, IA-32e(64bit) 모드에서는 추가적으로 R8 ~ R15 레지스터가 있습니다.

 

IA-32e(64bit) 모드에서 기본적인 8개 범용 레지스터R8 ~ R15 레지스터는 같은 기능을 하지만, R8 ~ R15 레지스터특수한 용도가 정의되지 않았습니다.

 

참고) 다양한 용도로 사용될 수 있지만, 특정 명령어는 해당 명령어의 용도에 맞는 레지스터를 사용하여야 합니다.

 

x86-64 프로세서의 범용 레지스터와 용도

범용 레지스터 이름 용도
AX 산술 연산을 수행할 때 누산기로 사용
BX 데이터의 주소를 지정할 때 데이터 포인터로 사용
CX 문자열이나 루프의 카운터(counter)로 사용
DX I/O(Input/Output) 주소를 지정할 때 사용되며, 산술 연산을 수행할 때 보조 레지스터로 사용
SI 문자열에 관련된 작업을 수행할 때 원본 문자열의 인덱스(위치)로 사용
DI 문자열에 관련된 작업을 수행할 때 목적지 문자열의 인덱스(위치)로 사용
SP 스택의 포인터로 사용
BP 스택의 데이터에 접근할 때 데이터의 포인터로 사용
R8 ~ R15 x86-64 프로세서에서 추가된 범용 레지스터, 특수한 용도가 정의되어 있지 않아 다양한 용도로 사용 가능

 

위의 레지스터들의 접두사로 E 혹은 R을 붙이게 되면 각각 보호 모드 혹은 IA-32e 모드에서 사용됩니다.

(ex : EAX 혹은 RAX)

 

범용 레지스터프로세서의 운영 모드와 관련이 있다고 했지만, 모든 운영 모드에 따라 레지스터가 별개로 존재하지는 않습니다.

 

만약, 운영 모드 별로 각각의 레지스터가 따로따로 존재한다면 범용 레지스터의 수 x 운영 모드의 수를 곱한 만큼의 레지스터가 필요로 합니다.

 

하지만 위의 방법처럼 범용 레지스터의 수 x 운영 모드의 수만큼의 범용 레지스터가 존재한다면 쓸데없이 용량만 커지고 비효율적입니다.

 

그렇기 때문에 범용 레지스터가장 큰 사이즈의 레지스터를 공유해서 사용합니다.

 

x86-64 프로세서에는 64bit 크기의 범용 레지스터만 있고, 레지스터접두사접미사R, E, D를 붙여서 접근하는 크기를 표시합니다.

 

64bit 레지스터 - RAX 혹은 RBX처럼 R 접두사가 붙습니다.

                          (R8 ~ R15 레지스터는 원래 64bit 레지스터에서 추가된 것으로, 접두사나 접미사가 붙지 않습니다.)

 

32bit 레지스터 - EAX 혹은 EBX처럼 E 접두사가 붙거나 R8D 혹은 R10D처럼 D 접미사가 붙습니다.

 

16bit 레지스터 - AX 혹은 BX처럼 접두사가 붙지 않거나 R8W 혹은 R14W처럼 W 접미사가 붙습니다.

 

16bit 이하의 레지스터 - AX에서 AH 혹은 ALBX에서 BH 혹은 BL 그리고 R8에서 R8L과 같이 상위 8비트하위 8비트로 다시 구분하여 끝자리가 H 혹은 L로 변경되거나 접미사 L이 붙습니다.

 

 

리얼 모드에서 오퍼랜드 크기 접두사(0x66)를 사용하거나 어드레스 크기 접두사(0x67)를 사용하면 32비트 레지스터도 접근할 수 있지만

 

리얼 모드에서 접두사를 사용하는 경우는 보호 모드로 전환하는 것처럼 특별한 경우에만 사용하므로 리얼 모드에서는 16bit 이하의 크기를 가지는 레지스터에만 접근한다고 봐도 된다.

 

보호 모드에서도 마찬가지로 오퍼랜드 크기 접두사어드레스 크기 접두사를 사용하여 16비트 크기 레지스터에 접근하며

 

IA-32e 모드에서는 오퍼랜드 크기 접두사어드레스 크기 접두사와 함께 새로 추가된 REX 접두사를 사용하여 다양한 크기의 레지스터를 사용합니다.

 

 

IA-32e 모드의 기본 오퍼랜드 크기는 32bit이고, 기본 어드레스 크기는 64bit로 설계되어 있습니다.

 

기본 오퍼랜드 크기가 32bit로 설계되어 있기 때문에 RIP 기본 어드레스는 64비트 어드레스를 표현할 수 없어서 RIP 상대 어드레스라는 새로운 어드레스 계산 방식을 사용합니다.

 

하지만, RIP 상대 어드레스 방식에서도 기본 오퍼랜드의 크기32bit이기 때문에 RIP 레지스터의 값에 상위 2G와 하위 2G 범위까지만 표현할 수 있습니다.

 

그래서 프로세서 제조사에서는 무조건 분기 명령어(jmp)에 예외를 두었습니다.

 

무조건 분기 명령어(jmp)에서 기본 오퍼랜드의 크기32bit에서 64bit로 하여 전체 어드레스 범위에서 이동할 수 있게 한 것입니다.

 


세그먼트 레지스터

 

 세그먼트 레지스터16bit 크기를 가진 레지스터이며 어드레스 영역을 다양한 크기로 구분하는 역할을 합니다.

 

주된 작업은 어드레스 영역의 구분이지만, 어떤 모드인지에 따라 조금씩 차이가 있습니다.

 

리얼 모드 - 단순히 고정된 크기의 어드레스 영역을 지정하는 역할만 합니다.

 

보호 모드와 IA-32e 모드 - 접근 권한, 세그먼트의 시작 주소크기 등을 지정하는 데 사용합니다.

                                         (이러한 기능을 이용하면 응용프로그램으로부터 커널 영역을 보호하는 기능을 구현할 수 있습니

                                          다.)

 

x86-64 프로세서의 세그먼트 레지스터

세그먼트 레지스터 이름 설명
CS ● 코드 영역을 가리키는 레지스터
데이터 이동 명령으로 값을 변경할 수 없으며, 점프 명령이나 인터럽트 관련 명령으로 변경이 가능합니다.
DS ● 데이터 영역을 가리키는 레지스터
데이터 이동 명령으로 값을 변경할 수 있으며, 데이터 영역에 접근할 때 임시적으로 사용됩니다.
ES ● 데이터 영역을 가리키는 레지스터
데이터 이동 명령으로 값을 변경할 수 있으며, 문자열과 관련된 작업을 처리할 때 임시적으로 사용됩니다.
FS ● 데이터 영역을 가리키는 레지스터
 데이터 이동 명령으로 값을 변경할 수 있습니다.
GS ● 데이터 영역을 가리키는 레지스터
 데이터 이동 명령으로 값을 변경할 수 있습니다.
SS ● 스택 영역을 가리키는 레지스터
● 데이터 이동 명령으로 값을 변경할 수 없으며, 스택 관련 레지스터(SP, BP)를 통해 스택에 접근할 때 임시적으로
사용합니다.

 

위의 세그먼트 레지스터들 중에서 데이터 관련 레지스터에서 접두사를 통해 명시적으로 특정 세그먼트를 설정할 수 있고

 

스택 관련 작업을 수행할 때 역시 접두사를 통해 CS를 제외한 다른 세그먼트 레지스터를 설정할 수 있습니다.

 

세그먼트 레지스터를 통해 주소 공간을 구분하는 방식세그먼테이션입니다.

 


▶ 컨트롤 레지스터

 

운영 모드를 바꾸고, 현재 운영 모드의 특정 기능을 제어하는 레지스터입니다.

 

x86 프로세서에서는 CR0 ~ CR4의 총 5가지 컨트롤 레지스터가 있으며

 

x86-64 프로세서에서는 기존의 CR0 ~ CR4에 추가로 CR8가 생겨 총 6개의 컨트롤 레지스터가 있습니다.

 

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

컨트롤 레지스터 이름 설명
CR0 운영 모드를 제어하는 레지스터
● 리얼 모드에서 보호 모드로 전환하는 역할과 캐시, 페이징 기능 등을 활성화 시킵니다.
CR1 ● 프로세서에 의해 예약된 레지스터
CR2 ● 페이지 폴트 발생 시 페이지 폴트가 발생한 선형 주소(가상 주소)가 저장되는 레지스터
● 페이징 기법을 활성화 한 후에는 페이지 폴트 발생 시만 유효한 값을 가집니다.
CR3  페이지 디렉터리의 물리 주소와 페이지 캐시에 관련된 기능을 설정하는 레지스터
CR4 ● 프로세서에서 지원하는 각종 확장 기능을 제어하는 레지스터
● 페이지 크기 확장이나 메모리 영역 확장 등의 기능을 활성화 시킵니다.
CR8 ● 테스크 우선순위 레지스터의 값을 제어하는 레지스터
● 
프로세스 외부에서 발생하는 인터럽트를 걸러주는 필터의 역할을 수행합니다.
● 
IA-32e 모드에서만 접근 가능합니다.

 

리얼 모드와 보호 모드 - 32bit 크기

 

IA-32e 모드 - 64bit로 확장되지만 일부 제약사항이 있습니다.

 

제약 사항

CR0, CR4, CR8 레지스터 - 64bit 중 상위 32bit를 0으로 설정해야 합니다.

 

CR2 레지스터 - 64bit 영역 모두 사용할 수 있습니다.

 

CR3 레지스터 - bit 40 ~ bit 51까지 모두 0으로 설정해야 합니다.

 

 

컨트롤 레지스터의 특정 기능은 해당 비트를 1로 설정해도 되지만

특정 기능은 1로 설정하기 전에 프로세서가 사용할 자료구조를 미리 준비해야 합니다.

 

그렇지 않으면 시스템이 재부팅되거나 심각하면 먹통이 될 수 있습니다.

 

참고) CR0 레지스터의 비트 0은 리얼 모드와 보호 모드로 전환하는 플래그입니다.

 

 

각 컨트롤 레지스터들의 구조는 아래의 사진과 같습니다.

 

출처 - http://miooim.egloos.com/48142

 

반응형

+ Recent posts