Search

운영 모드와 레지스터

대분류
CS
소분류
OS
유형
레지스터
주요 레퍼런스
https://karfn84.tistory.com/17
http://egloos.zum.com/miooim/v/48142
https://to-paz.tistory.com/99
https://indosm.tistory.com/24
최종 편집 일시
2024/10/29 04:34
생성 일시
2022/04/01 04:20
14 more properties

Intel 64bit 호환 프로세스(x86-64 프로세서) - 다섯 가지 운영 모드

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

리얼 모드

프로세서가 어떠한 상태나 모드에 있던지 전원이 켜지거나 리셋되면 처음으로 진입하는 모드이다.
대부분의 작업을 어셈블리어로 처리해야 하며, OS 이미지를 디스크에서 메모리로 복사하여 보호 모드로 변경하는 작업을 수행한다.

보호 모드

리얼 모드에서 IA-32e(64bit) 모드로 전환하기 위해서 반드시 거쳐야 한다.
여러 기능을 제공하는 모드인 만큼 복잡한 구조이며, 레지스터와 자료구조가 다양하다.
특히 이 모드에서 사용되는 레지스터는 IA-32e 모드에서도 같이 사용하므로 보호 모드를 이해하고 넘어가는 것이 좋다.

IA-32e 모드

위의 보호 모드보다 레지스터 수가 많으며, 더 많은 기능을 제공합니다.
대부분의 자료구조는 보호 모드의 자료구조와 같거나 크기만 2배로 확장되었고 일부 필드의 의미가 변하는 정도이다.
서브 모드를 변경하여 32bit 호환 모드일 때 보호 모드에 있는 것처럼 동작하기에 32bit 코드를 실행할 수 있다.

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

어떤 모드에서 또 다른 어떤 모드로 전환하려면 현재 동작 중인 모드에 따라 차이가 있다.
리얼 모드에서 보호 모드로 전환하려면 아래와 같이 바로 전환할 수 있다.
리얼 모드 -> 보호 모드
하지만 리얼 모드에서 IA-32e 모드로 전환하려면 아래와 같이 중간에 보호 모드를 거쳐서 전환해야 한다.
리얼 모드 -> 보호 모드 -> IA-32e 모드
<그림1> 운영 모드 관계 및 전환 방식

레지스터

프로세서 내부에 있는 작은 공간
연산, 제어, 상태 표시, 디버깅 등의 여러 목적으로 사용
OS 개발 과정에서 비중이 큰 레지스터
1.
범용 레지스터
2.
세그먼트 레지스터
3.
컨트롤 레지스터 
x86-64 프로세서에는 64bit 크기의 범용 레지스터만 있고, 레지스터에 접두사나 접미사로 R, E, D를 붙여서 접근하는 크기를 표시 보호 모드 혹은 IA-32e 모드 에서 사용
64bit 레지스터 : RAX 혹은 RBX처럼 R 접두사
(R8 ~ R15 레지스터는 원래 64bit 레지스터에서 추가된 것으로, 접두사나 접미사가 붙지 않습니다.)
32bit 레지스터 : EAX 혹은 EBX처럼 E 접두사가 붙거나 R8D 혹은 R10D처럼 D 접미사
16bit 레지스터 : AX 혹은 BX처럼 접두사가 붙지 않거나 R8W 혹은 R14W처럼 W 접미사
16bit 이하의 레지스터 : AX에서 AH 혹은 AL과 BX에서 BH 혹은 BL 그리고 R8에서 R8L과 같이 상위 8비트와 하위 8비트로 다시 구분하여 끝자리가 H 혹은 L로 변경되거나 접미사 L
<표1> 레지스터 구역 예시

1. 범용 레지스터(General Purpose Register)

운영 모드와 관계가 깊은 레지스터
계산(연산 처리), 메모리 주소(번지) 지정, 작은 데이터의 임시 저장 공간, 컴퓨터 장치 제어 등의 목적으로 사용
32bit 프로세서, 64bit 프로세서 전부 보유
범용 레지스터의 수는 프로세서가 지원하는 운영 모드에 따라 달라짐.
범용 레지스터의 수가 많을 경우, 수행 속도가 빨라짐.
함수를 호출할 때 파라미터를 통해 값을 넘겨주는데 다수의 범용 레지스터에 어떤 함수에서 사용할 정보가 담긴 함수 파라미터를 넣어 넘겨주면 스택 영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있어서 수행 속도가 빨라진다.
기본적인 8개의 레지스터는 공통적인 용도로 사용할 수 있게 가지고 있고, IA-32e(64bit) 모드에서는 추가적으로 R8 ~ R15 레지스터가 있다.
IA-32e(64bit) 모드에서 기본 범용 레지스터와 R8 ~ R15 레지스터는 같은 기능을 하지만, R8 ~ R15 레지스터는 특수한 용도가 정의되지 않는다.
다양한 용도로 사용될 수 있지만, 특정 명령어는 해당 명령어의 용도에 맞는 레지스터를 사용하여야 한다.
범용 레지스터 종류
1.
기본 레지스터
레지스터 이름
용도
AX
- 입출력 / 산술 연산 수행 주 누산기(Primary Accumulator Register) - 함수 리턴값을 가짐
BX
- 데이터의 주소를 지정할 때 데이터 포인터로 사용(주로 DS 세그먼트에 대한 포인터 저장), 베이스 레지스터(Base Register) - 일반적인 용도는 계산기, 특정 주소 지정(인덱스)을 위해 DI, SI와 결합 가능
CX
- 문자열이나 루프의 카운터(Counter Register) - 루프가 반복되는 횟수를 제어하는 값 또는 왼쪽이나 오른쪽으로 이동되는 비트 수 포함 가능
DX
- 데이터 레지스터(Data Register) - I/O(Input/Output) 주소를 지정할 때 사용(입출력 연산) - 큰 수 산술 연산을 수행할 때 보조 레지스터로 사용(with. AX)
2.
인덱스 레지스터
인덱스 주소지정, 연산(덧셈, 뺄셈)에서 사용 가능
레지스터 이름
용도
SI
문자열에 관련된 작업을 수행할 때 원본 문자열의 인덱스(위치)로 사용
DI
문자열에 관련된 작업을 수행할 때 목적지 문자열의 인덱스(위치)로 사용
3.
포인터 레지스터(Pointer Register)
레지스터 이름
용도
SP
- 스택(Stack)의 포인터로 사용 - 현재 스택의 위치 - 스택 사이즈가 커지면 SP에 저장된 주소값은 작아진다.
BP
- 스택의 데이터에 접근할 때 데이터의 포인터로 사용 - 현재 스택 프레임이 소멸되지 않는 동안 EBP의 값이 변하지 않으므로 기준점(Base)이 됨
IP
- 명령어(Instruction) 포인터 레지스터 - 현재 실행중인 코드 세그먼트에 속한 현재 명령어를 가리킨다는 점에서 CS 레지스터 (CS:IP)와 연관됨.
4.
기타 레지스터
R8 ~ R15
x86-64 프로세서에서 추가된 범용 레지스터, 특수한 용도가 정의되어 있지 않아 다양한 용도로 사용 가능

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

세그먼트 : 프로토콜 데이터 단위
16bit 크기를 가진 레지스터
어드레스 영역을 다양한 크기로 구분하는 역할
주된 작업은 어드레스 영역의 구분(세그먼트라고 하는 메모리의 한 영역에 대한 주소지정)이지만, 모드에 따라 조금씩 차이가 있다.
리얼 모드
단순 고정된 크기의 어드레스 영역을 지정하는 역할
보호 모드와 IA-32e 모드
접근 권한세그먼트의 시작 주소와 크기 등을 지정하는 데 사용
응용프로그램으로부터 커널 영역을 보호하는 기능을 구현 가능
과거 IA-32, IA-16에서는 사용 가능 물리 메모리를 키우려고 했지만 현대에선 사용 가능 주소 영역이 넓어져서 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작
세그먼트 레지스터의 종류
레지스터 이름
용도
CS
- 코드 영역(프로그램의 코드 세그먼트 시작주소 포함)을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 X, 점프 명령이나 인터럽트 관련 명령으로 변경 가능 - 이 세그먼트 주소에 IP 레지스터 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 됨 - 일반적 프로그래밍에선 직접 참조 필요 X
DS
- 데이터 영역(프로그램의 데이터 세그먼트 시작주소 포함)을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능, 데이터 영역에 접근할 때 임시적으로 사용
ES
- 데이터 영역을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능, 문자열과 관련된 작업(메모리 주소 지정을 다루는 스트링 연산)을 처리할 때 임시적으로 사용 * 이 때 DI레지스터와 연관되어 적절한 세그먼트 주소로 초기화 해야함
FS/GS
- 데이터 영역을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능 - 기억장소 요구사항을 다루기 위해서 80386에서 추가로 도입된 여분의 세그먼트 레지스터
SS
- 스택 영역(프로그램의 스택 세그먼트 시작 주소)을 가리키는 레지스터 - 주소와 데이터의 임시 저장 목적 - 데이터 이동 명령으로 값을 변경 불가능, 스택 관련 레지스터(SP, BP)를 통해 스택에 접근할 때 임시적으로 사용

3. 플래그 레지스터

프로세서의 현재 상태를 저장하고 있는 레지스터
비트들로 CPU의 현재 상태 표현
CF(Carry Flag)
부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정.
ZF(Zero Flag)
연산의 결과가 0일 경우 설정.
SF(Sign Flag)
연산의 결과가 음수일 경우 설정.
OF(Overflow Flag)
부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정.

4. 컨트롤 레지스터

운영 모드를 바꾸고, 현재 운영 모드의 특정 기능을 제어하는 레지스터
x86 프로세서에서는 CR0 ~ CR4의 총 5가지 컨트롤 레지스터 보유
x86-64 프로세서에서는 위의 5개 및 추가로 CR8이 생겨 6개를 보유
레지스터 이름
용도
CR0
- 운영 모드 제어 기능 레지스터 - 리얼 모드에서 보호 모드로 전환하는 역할, 캐시, 페이징 기능 등 활성화
CR1
- 프로세서에 의해 예약된 레지스터
CR2
- 페이지 폴트 발생 시 페이지 폴트가 발생한 선형 주소(가상 주소)가 저장되는 레지스터 - 페이징 기법을 활성화 한 후, 페이지 폴트 발생 시만 유효한 값 가짐
CR3
- 페이지 디렉터리의 물리 주소페이지 캐시에 관련된 기능을 설정하는 레지스터
CR4
- 프로세서에서 지원하는 각종 확장 기능을 제어하는 레지스터 - 페이지 크기 확장이나 메모리 영역 확장 등의 기능 활성화
CR8
- 테스크 우선순위 레지스터의 값을 제어하는 레지스터 - 프로세스 외부 발생 인터럽트 필터링 - IA-32e 모드에서만 접근 가능

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

IA-32e 모드 - 64bit로 확장가능 but 제약 존재
제약 사항
CR0, CR4, CR8 레지스터 - 64bit 중 상위 32bit를 0으로 설정 필요
CR2 레지스터 - 64bit 영역 모두 사용 가능
CR3 레지스터 - bit 40 ~ bit 51까지 모두 0으로 설정 필요
컨트롤 레지스터의 특정 기능은 해당 비트를 1로 설정해도 되지만 특정 기능은 1로 설정하기 전에 프로세서가 사용할 자료구조를 미리 준비 필요
CR0 레지스터의 비트 0은 리얼 모드와 보호 모드로 전환하는 플래그이다.
<그림2> 컨트롤 레지스터 구조