티스토리 뷰

2017/06/01 - [OS] - 64Bit OS(Operating System, 운영체제) 만들어 보기 - 1 셋업

2017/06/03 - [OS] - 64Bit OS 만들어 보기 - 2 운영 모드의 종류


이번 포스팅에서는 몇가지 운영모드에서 사용하는 레지스터들을 알아보도록 하겠습니다.


OS를 개발하는 관점에서 운영 모드는 크게 16비트 , 32비트, 64비트 모드로 나눌 수 있는데 앞에 붙은 숫자는 레지스터의 크기와 비례합니다.

아래의 사진은 각각 보호모드와 IA-32e 모드에서 사용하는 레지스터들 입니다.

(보호모드 레지스터)

(IA-32e 모드 레지스터)

x86-64 프로세서에는 위의 사진과 같이 많은량의 레지스터가 있지만 OS를 개발하는데에 가장 큰 비중을 차지하는레지스터는 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 세 가지입니다.

세 가지를 제외한 나머지 레지스터는 사용 빈도가 적거나 직접 설정할 일이 없는 레지스터들입니다.


범용 레지스터

범용 레지스터는 가장 많이 사용하는 레지스터로 계산, 메모리 어드레스 지정, 임시 공간 지정 등 많은 목적으로 활용됩니다.

범용 레지스터의 수가 늘어나면 관련된 계산을 모두 올려서 계산 함으로써 메모리의 접근 시간을 줄여 수행 속도의 개선을 노릴 수 있습니다.

함수에서도 마찬가지로 함수가 작업을 처리하려면 정보가 필요하고 정보는 호출하는 쪽에서 파라미터를 통해 넘겨주는데 이때, 다수의 범용 레지스터에 함수의 파라미터를 넣어 스택 영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있습니다.


범용 레지스터의 이름답게 용도는 고정된것은 아니지만, 모든 상황에서 범용적인것은 아니며 범용 레지스터에는 개별적인 이름이 있는데, 이 이름을 통해 각 레지스터의 용도를 알 수 있고 R8~R15 레지스터는 다른 범용 레지스터와 다르게 특수한 용도가 정해져 있지 않습니다.

 범용 레지스터 이름

설명 

AX 

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

BX 

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

CX 

루프 또는 문자열의 카운트로 사용 

DX 

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

SI 

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

DI 

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

SP 

스택의 포인터로 사용 

BP 

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

R8 ~ R15 

다양한 용도로 사용가능 


각각의 운영 모드 마다 레지스터의 크기가 달라진다고 하였는데, 그렇다고 해서 운영 모드마다 레지스터가 따로 있는것은 매우 비효율적일것입니다.

실제로 x86-64 프로세서는 64비트의 범용 레지스터만 가지고 있으며 보호모드, 리얼모드에서는 일부 영역만 사용하도록 처리하고 있습니다.

64비트 범용 레지스터는 하위 32, 16, 8 비트의 크기로 구분하여 접근 할 수 있고, 레지스터에 접두사, 접미어를 붙여 접근하는 크기를 표시합니다.

(프로세서에 따른 레지스터 사용 가능 범위)

위의 사진에서 검은색이 64비트 모드에서 접근 가능한 용량 큰 파랑색 영역이 32비트, 주황색은 16비트 모드 작은 파랑색 영역은 각각 상위 8비트 하위 8비트 용량입니다.


RIP 레지스터는 현재 수행 중인 명령의 주소를 가리키는 레지스터 입니다, R 접두사가 붙었으니 64비트 레지스터란걸 알 수 있습니다.

RIP 레지스터 값과 32비트 오퍼랜드를 통해 64비트 주소 공간을 나타 낼 수 있으며 이러한 방법이 RIP 상대 주소 방식의 주소 지정방법 입니다.

여기서 기본 오퍼랜드의 크기가 32비트 이므로 RIP 레지스터의 값에 상위 2G 하위 2G 범위 까지만 표현 할 수 있다는 단점이 있습니다.

그러므로 접두사중 64비트 오퍼랜드와 관련이 있는 REX 접두사를 사용하면 오퍼랜드의 크기가 64비트가 되고 따라서 64비트 어드레스를 모두 표현 할 수 있습니다.


세그먼트 레지스터

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

세그먼트 레지스터의 주된 역할은 어드레스 영역의 구분이지만, 모드마다 조금씩의 역할 차이가 있습니다.

리얼 모드에서는 단순히 고정된 크기의 어드레스 영역을 지정하는 역할 이지만, 보호 모드와 IA-32e 모드에서는 접근 권한, 세그먼트로부터 커널영역을 보호하는 기능을 쉽게 구현 할 수 있습니다.

세그먼트 레지스터는 다음과 같이 구성됩니다.

 세그먼트 레지스터의 이름

 설명

CS 

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

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

DS 

데이터 영역을 가리키는 레지스터

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

DS 레지스터는 데이터 영역에 접근할 때 임시적으로 사용

ES 레지스터는 문자열과 관련된 작업을 처리할 때 임시적으로 사용

데이터 영역에 접근하면서 DS 레지스터 이외의 세그먼트 레지스터를 사용하려면 세그먼트 레지스터 접두사 사용

ES

FS 

SS 

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

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

스택 관련 레지스터를 통해 스택에 접근 할 때 임시적으로 사용

세그먼트 레지스터에는 DS, ES, FS, GS와 같이 4개의 데이터 관련 세그먼트 레지스터가 있으며 세그먼트 레지스터 접두사를 통해 명시적으로 특정 세그먼트를 설정 할 수 있습니다.

세그먼트 레지스터의 역할은 주소 공간을 목적에 따라 구분하는 것이며, 주소 공간을 구분하는 방법은 메모리 관리 기법과 깊은 관계가 있으며, 메모리 관리 기법에는 크게 세그먼테이션 기법과 페이징 기법이 있습니다.


컨트롤 레지스터

컨트롤 레지스터는 운영 모드를 변경하고 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터 입니다.

컨트롤 레지스터 이름 

설명 

CR0 

운영 모드를 제어하는 레지스터 

리얼 모드에서 보호 모드로 전환하는 역할과 캐시, 페이징 기능 등을 활성화 시킴

CR1 

프로세서에 의해 예약된 레지스터 

CR2 

페이지 폴트 발생시 발생한 선형 주소가 저장되는 레지스터

페이징 기법을 활성화한 후에는 페이지 폴트 발생 시만 유효한 값을 가짐 

CR3 

페이지 디렉토리의 물리 주소와 페이지 캐시에 관련된 기능을 실행하는 레지스터 

CR4 

프로세서에서 지원하는 각종 확장 기능을 제어하는 레지스터

페이지 크기 확장이나 메모리 영역 확장 등의 기능을 활성화 시킴

CR8 

태스크 우선순위 레지스터의 값을 제어한는 레지스터

프로세스 외부에서 발생하는 인터럽트를 걸러주는 필터의 역할

IA-32e 모드에서만 접근 가능 

컨트롤 레지스터는 리얼모드와 보호모드 일때 32비트의 크기를 가지지만 IA-32e 모드일시 64비트로 확장되지만 일부 제약사항이 있습니다.

CR0와 CR4,CR8레지스터에서는 64비트중 상위 32비트를 0으로 설정해야합니다. CR2 레지스터의 경우 64비트 모두 사요 할 수 있으며, CR3 레지스터는 비트 40 부터 비트 51까지 모두 0으로 채워야 합니다.

컨트롤 레지스터는 프로세서의 운영 모드와 확장 기능을 제어하는 만큼 구조가 복잡합니다.

컨트롤 레지스터의 각각의 필드는 저마다 특정 기능을 활성/비활성하며, 운영 모드에 따라 필수 필드와 옵션 필드가 달라지게 됩니다.


지금까지 운영 모드와 레지스터에 대해 알아 보았으며 다음에는 메모리 관리 기법에 대해 알아 보겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함