$bash

0x03_프로세서 모드 및 레지스터

0x0500 : 기술, 분석 문서/0x0503 : OS 원리와 구조

인텔 64비트 호환 프로세서에는 크게 다섯가지 운영 모드가 있다.


리얼모드

// 프로세서의 초기 상태로서 16비트 모드로 동작.


보호 모드

// 32비트 모드로 동작하며 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 제공하는 모드


IA-32E 모드

// 32비트 호환 모드와 64비트 모드의 두 가지 서브모드로 구성


시스템 관리 모드

// 전원 관리나 하드웨어 제어 같은 특수 기능을 제공하는 모드


가상 8086모드

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


각각의 모드는 리얼 > 보호 > IA-32e 를 거쳐야 하는 경우가 대부분.

리얼모드는 보호모드만 진입할 수 있고 보호모드는 가상 8068, IA모드로 진입이 가능하다.

관련해선 80페이지를 참고하자


이후 모드에 따른 레지스터 내용이 나온다.

그림적인 내용이 많아 따로 설명이 힘든거 같다...


기본적으로 레지스터는 두종류가 있는거 같다(물론 지금까지 본 내용을 한으로 말이다.)

프로그램 레지스터, 시스템 레지스터 인데.. 프로그램 레지스터는 달고나 문서를 보면서 이해된 내용이 나오지만..

시스템 레지스터

XX비트 컨트롤 레지스터                     (32/64)

플래그 레지스터                                 (32/64)

글로벌 디스크립터 테이블 레지스터    (48/80)

인터럽트 디스크립터 테이블 레지스터 (48/80)

로컬 디스크립터 테이블 레지스터        (16/16)

태스크 레지스터                                (16/16)

모델 고유 레지스터


순으로 있다. 대충 기억하면 될듯 하다..


프로그램 레지스터에는 범용, 세그먼트, 인스트럭션(자주보는 EIP)가 있는데.

범용 레지스터

계산, 메모리 주소 지정, 임시 저장 공간 의 목적으로 사용된다.


AX : 산술 연산을 수행할 때 누산기로 사용

BX : 데이터의 어드레스를 지정할 때 데이터 포인터로 사용

CX : 루프 또는 문자열의 카운터로 사용

DX : I/O 어드레스를 지정할 때 사용되며, 산술 연산을 수행할 때 보조 레지스터로 사용

SI : 문자열에 관련된 작업을 수행할 때 원본 문자열의 인덱스로 사용

DI : 문자열에 관련된 작업을 수행할 때 목적지 문자열의 인덱스로 사용

SP : 스택 포인터

BP : 스택의 데이터에 접근 할 때 데이터의 포인터로 사용

R8 ~ R15 : 86-64프로세서에 추가된 범용 레지스터로, 다양한 용도로 사용 가능


86페이지를 참고하면 각각의 모드마다 접근이 가능한 레지스터의 내용이 나온다.


세그먼트 레지스터

16비트 레지스터로 어드레스 영역을 다양한 크기로 구분하는 역할을 하는데, 주된 역활은 주소 영역 구분이지만 모드마다 조금씩 다르다.

보호모드, IA-32e모드  = 접근 권한 으로도 사용되기도 한다. 


CS : 코드 영역을 가리키는 레지스터

// 데이터 이동으로 값을 변경할 수 없으며, 점프 명령이나 인터럽트 관련 명령으로 변경 가능.

DS, ES, FS : 데이터 영역을 가리키는 레지스터.

// 데이터 이동 명령으로 값을 변경할수 있음.

// DS는 데이터 영역 접근시 암시적으로 사용. ES는 문자열과 관련된 작업을 처리할 때 암시적으로 사용.

SS : 스택 영역을 가리키는 레지스터

// 데이터 이동 명령으로 값을 변경할 수 있음.

// 스택 관련 레지스터(SP, BP)를 통해 스택에 접근할 때 암시적으로 사용됨.


컨트롤 레지스터

운영 모드를 변경하고, 운영 중인 모드의 특정 기능을 제어하는 레지스터 이다.


이후 모드에 따른 메모리 관리 기법에 대해 나온다.

아몰랑 ㅎㅎ..

'0x0500 : 기술, 분석 문서 > 0x0503 : OS 원리와 구조' 카테고리의 다른 글

0x06_32비트 보호모드 전환  (0) 2016.10.12
0x05_플로피 디스크에서 OS이미지 로딩  (0) 2016.10.10
0x04_BootLoader  (0) 2016.10.02
0x02_환경 구축  (0) 2016.10.01
0x01_시작  (0) 2016.09.27