IT 그리고 정보보안/Knowledge base

레지스터 (Register)

plummmm 2021. 4. 12. 21:59
반응형

레지스터란?

CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 다목적 공간이다.

프로세스 내부에 있는 작은 공간이고 연산 제어, 디버깅 등등의 목적으로 사용한다.

일반적으로 얘기하는 RAM과는 다르다.

CPU가 RAM에 있는 데이터에 접근하기 위해서는 물리적으로 먼 길을 돌아가야 하는데,

레지스터를 이용하면 고속으로 데이터를 처리할 수 있다.

 

연산을 위한 데이터를 레지스터에 저장하고, 그 결과값도 레지스터에 저장한다.

속도가 엄청 빠르다 레지스터 > 메모리 > 하드디스크

 

레지스터는 64/32비트 머신을 구분하는 기준으로, 한번에 처리할 수 있는 비트 수이다.

레지스터의 데이터 단위는 다음과 같다.

 

BIT

데이터를 표현할 수 있는 가장 작은 단위이다. 0과 1로 구분된다.

 

BYTE

8개의 비트가 모이면 바이트라고 한다. 0xFF(255) 까지 표현이 가능하다.

8비트와 대응하는 레지스터는 AL, AH, BL. BH, CL, CH, DL, DH 등이 있다.

 

WORD

2개의 바이트가 모이면 WORD라 한다. 0xFFFF(65535) 까지 표현이 가능하다.

16비트와 대응하는 레지스터는 AX, BX, CX, DX, SI, DI, BP, SP, IP 가 있다.

 

DOUBLE WORD(= DWORD)

워드 2개가 모이면 더블 워드이다. 0xFFFFFFFF ( 4294967295) 까지 표현이 가능하다.

32비트와 대응하는 레지스터는 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP 가 있다.

 

KILOBYTE

32비트의 제곱으로 값을 표현한다.

 

먼저 보호 모드 즉, 32비트 모드의 레지스터를 알아보자. 어차피 32비트나 64비트나 레지스터는 별로 다른 점이 없다.

 

늘상 봐오던 레지스터들은 저 프로그램 실행관련 레지스터들이다. 어셈블리 공부하면 자연스레 따라오게 되는..

OS 개발하는 과정에서 가장 많이 사용되는 레지스터는 위의 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 3가지 이다.

 

일단 간략하게 설명을 하자면,

프로그램 실행 관련 레지스터에는 주황색으로 표시된 것이 범용 레지스터, 녹색이 EIP, 파란색이 16비트 세그먼트 레지스터

시스템 관련 레지스터로는 파란색이 32비트 컨트롤 레지스터, 녹색이 각각 시스템에 관련된 레지스터들.

실수 연산 및 SIMD 관련 레지스터는 보는 것 처럼 저렇게 구성되어 있다.

 

방금 말했듯이 3가지가 OS 개발에 가장 중요하다고 했음. 나머지 레지스터들은 우리가 손 댈 필요 없거나, 사용해도 극히 빈도가 낮음.

 

다음 64비트 레지스터를 한번 보겠음. 레지스터가 확장되었다 뿐이지.. 다른점은 거의 없다고 보면 된다.

전체적인 32비트와 64비트 레지스터의 개형은 위와 같다. 비스무리하다. 

그럼 이제 범용 레지스터부터 한번 알아보자.

 

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

범용 레지스터는 가장 많이, 자주 쓰이고 중요한 녀석이다.

좀 저렴한 표현으로 말하자면, 막쓰는 놈이다. 상수나 주소를 저장할 때 쓰이기도 하고 혹은 특수한 목적으로 사용되기도 한다.

범용 레지스터는 운영체제 모드 별로 (보호모드 혹은 IA-32e 모드) 갯수와 크기가 다르다.

 

64비트가 되면 레지스터의 크기와 갯수가 늘어나는데, 이로써 생기는 이점은 수행 속도 개선이다.

위 그림들을 봤을 때, 64비트가 되면서 범용 레지스터 E☆ 이던 친구들이 R 으로 바뀌는걸 보았다.

그리고 R8, R9 ...  R15 로 이름 붙여진 8개의 친구들이 추가된다. 

 

머리가 나쁜 우리는 그림을 봐야 이해가 간다. 범용 레지스터 전체적인 그림을 한번봅시다.

IA-32e 모드를 기준으로 작성하였다. 먼저 이 레지스터들의 용도를 알아보겠음.

 

* 산술 연산 레지스터

AX : 산술 논리 연산에 사용된다. 그리고 함수의 리턴값이 여기 저장됨.

BX : 간접 번지 지정 시에 사용된다. 뭔말?? 배열의 인덱스 값을 저장하는거지.

CX : 반복문의 반복 횟수 지정 시에 사용된다. (counter) 그리고 문자열 처리에도 사용됨.

DX : AX의 보조적인 역할이다. AX와 합쳐져서 확장된 메모리로 사용하는 것. 그리고 I/O 어드레스를 지정할 때 사용됨.

 

* 인덱스 레지스터

SI(Source index) : 복사나 비교를 할때 사용되는 소스 문자

DI(Destination index) : 역시나 복사나 비교를 할때 사용되는 목적지 문자. stos, movs를 사용할때 마다 1씩 증가한다.

 

* 포인터 레지스터

SP(Stack Pointer) : 스택의 가장 윗부분을 가르킨다. 스택에 값이 쌓이면 ESP도 증가한다.

BP(Base Pointer) : 스택의 제일 바닥 부분의 주소를 가르킨다. EBP밑에는 Return값이 있음.

 

위와 같은 용도로 쓰인다.

보면 접두사가 R 이 붙었는데.. 64비트일 때 R 접두사가 붙고 32비트 일때는 E 접두사가 붙는다.

리얼 모드 즉 16비트 모드에서는 접두사가 붙지 않는 레지스터를 사용한다고 생각하면 되고,

보호모드도 마찬가지로 E 접두사가 붙는 레지스터를 사용한다고 생각해면 무방하다.

 

이번에는 x86-64 프로세서에서 추가된 범용 레지스터를 함 보자.

 

이 친구들은 특별히 정해진 용도는 없고, 다양하게 쓰인다.

얘네들은 IA-32e 모드에서만 접근 가능하다.

 

범용 레지스터를 알아보았는데, 그럼 이놈들이 어떤 방식으로 쓰이느냐??

결과적으로 얘기를 하자면, 운영 모드에 따라서 일정한 규칙을 갖고 사용된다.

이 부분을 이해하는 데에는 레지스터에 붙는 접두사(prefix)에 힌트가 있음.

 

IA-32e 모드의 기본 오퍼랜드(피연산자) 크기가 32비트인데, 64비트 모드인데 왜 32비트.?

이유는 잘 모르겠다. 하여튼 기본이 32비트라서 64비트 주소를 표현할 수 없으므로 

RIP 상대주소라는 새로운 계산 방식으로 64비트 어드레스를 표현한다. (이거에 대한 내용을 따로 정리해둠.)

 

이제 세그먼트 레지스터로 넘어가보자.

 

 

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

 

그다음.. 세그먼트 레지스터이다.

세그먼트 레지스터는 현재 메모리 주소를 표현하기 위한 세그먼트 디스크립터 테이블 ( GDT,Global Descriptor Table에 존재)

의 위치를 나타내며,  역의 기본 위치를 가르킨다.

 

운영체제에서는 가상메모리를 이용하여 물리 메모리보다 훨씬효율적으로 메모리를 쓸 수 있도록 되어있다.

이를 위해선 가상 메모리를 물리 메모리로 변환해야하는데, 이때 이 세그먼트 레지스터를 사용했었다.

 

근데 32비트 환경이 되어도 세그먼트 레지스터는 확장되지 않고 그대로 16비트인데, 호환성을 유지하기 위해서이다. 

그래서 여전히 세그먼트 레지스터는 16비트. 64비트가 되어도 여전히 16비트. 쩐다 대나무같은 놈.

 

세그먼트 레지스터의 기본 역할은 위해서 말했듯이 어드레스 영역을 구분하는 것이다.

하지만 운영모드 마다 역할의 차이가 생기기 시작함.

 

보호모드와 IA-32e 모드에서는 접근 권한 (특권 레벨.. Privilege Level), 세그먼트의 시작 어드레스와 크기 등을 지정하는 데에도 사용된다.

세그먼트 레지스터의 추가된 이 기능들 덕분에 응용 프로그램으로부터 커널 영역을 보호하는 기능을 쉽게 구현할 수 있게 되었다.

(보호 모드는 세그먼트라는 메모리를 조각내어 각 조각 하나하나 마다 시작 주소, 범위, 접근제한을 부여해 메모리를 보호하는 기법)

 

세그먼트 레지스터의 역할이 바뀌고 난 후 사용되는 것이 세그먼트 디스크립터 테이블(SDT)이다.

세그먼트 레지스터는 이 SDT의 인덱스 값을 가지고 있고, 요구 특권 레벨 값을 저장하고 있다.

 

SDT와 특권 레벨에 대한 이야기는 좀 있다 다시 다루도록 하고.. 일단 세그먼트 레지스터에 대해서 먼저 알아보자.

 

세그먼트 레지스터는 총 6개 종류로 이루어져 있다.

CS, SS, DS, ES, FS, GS

레지스터 별로 용도를 알아보기 전에 세그먼트 레지스터 구성 요소에 대해 간략하게 알아보자.

생겨 먹은 건 6가지 모두 동일하다.

 

* Index  : SDT에 대한 인덱스. 13비트이다. 세그먼트 디스크립터를 (2^13 - 1)개 만큼 가질 수 있으므로 13비트만 있음됨.

* TI      : Table Indicator의 약자로 디스크립터 테이블이 global(=0)인지 Local(=1)인지 설정

* RPL   : 요구 특권 레벨 값. (00: 커널, 11: 유저)

 

구조는 저렇게 생겼고, 각각 세그먼트 레지스터들이 무슨 역할을 하는지 알아보자. 이쁘게 표에 정리했다.

 

 

특이 사항이 있다면, 세그먼트 레지스터 접두사를 이용해 명시적으로 특정 세그먼트를 설정할 수 있다.

데이터 영역을 접근하면서 DS 레지스터 이외의 세그먼트 레지스터로 설정할 수 있다는 말.

스택 영역도 마찬가지. 단 CS 레지스터는 사용할 수 없다.

 

처음에 언급했듯이, 세그먼트 레지스터는 영역을 구분하는 기능 이외에 접근 권한 등의 기능이 추가되었다고 했다.

하지만 일단 기본적인 역할은 주소 공간을 구분하는 것 아니겠나.

 

 

그럼 이번에는 컨트롤 레지스터에 대해 알아보자.

 

3. 컨트롤 레지스터 (Control Register)

이 부분은 이전에 공부한 적이 없는 내용이다. 처음 쓴다 이말..

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

총 5개의 컨트롤 레지스터가 존재한다.

 

CR0, CR1, CR2, CR3, CR4

 

각각 레지스터들의 기능을 알아보자. 이번에도 표에 정리해서 보겠음.

 

 

컨트롤 레지스터는 용도가 다양한 만큼 구조도 다양하다.

 

​그림에서 회색으로 표시된 부분은 예약된 영역을 말한다.

 

컨트롤 레지스터의 각 필드들은 각자의 기능을 활성화/비활성화 시키는 역할을 한다.

 

CR0 레지스터만 일단 알아보자

32비트 보호 모드로 전환할 때 필요한 필드 외에 

캐시(Cache), 페이징(Paging), 실수 연산 장치(FPU) 등과 관련된 필드가 포함되어 있다.

예시를 들어서 설명하겠음.

자.. 위에 그림은 보호 모드로 전환할 때 설정하는 설정값이다. 예를 들어 설명하는 거다.

저런식으로 셋팅하기 위해서 0x4000003B 라는 값을 가진다. 각 필드에 대한 설명을 하겠음.

 

CR0 레지스터가 하는일은 운영모드를 제어하는 레지스터이다.

리얼모드(16비트)에서 보호모드(32비트)로 전환하는 역할! 이 가장 크고

캐시 기능, 페이징 기능 등을 활성화 시키는 그러한 레지스터이다.

그니까 운영체제 공부할 때 아주 중요한 레지스터 이다. 

 

다음으로 OS 제작과는 크게 관련없지만 알아둬야하는 Eflag 레지스터에 대해서 봅시다.

 

4. E-flag 레지스터 (E-flag Register)

네번째 E-flag 레지스터이다.

 

E-FLAG 레지스터는 말 그대로 16비트인 flag 레지스터가 확장(Extend) 되었따. 이말이다.

시스템 제어용 플래그로 사용되거나 어셈블리의 조건 처리, 상태 저장 용도로 중요한 역할을 한다.

E-FLAG 레지스터의 비트별 플레그는 다음과 같다.

 

 

32비트 확장 레지스터구조는 이러하다.

이 플래그들 중 가장 많이 사용되는 플래그가 ZF이다.

참, 거짓에 따라 분기한다.

프로그래밍 언어의 if문은 어셈블리의 JNE 명령으로 CPU에서 처리되며 이 때, ZF값을 참고해서 분기한다.

그럼 각 플래그별 기능을 알아보겠음

 

 

그럼 이제, 마지막.. EIP를 알아보자.

 

5. IP(Instruction Pointer)

CPU가 처리해야 하는 명령어의 "주소"를 나타내는 레지스터이다.

cpu에서는 EIP에 저장된 주소의 명령어를 처리하고 크기만큼 다음으로 이동하여 또 명령어를 실행시킨다.

이 싸이클을 변경하고 싶으면 분기문을 사용하면 된다.(JMP, CALL, RET 등)

반응형

'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글

MintOS 부팅 과정  (0) 2021.04.12
OS 메모리 관리 기법  (0) 2021.04.12
MintOS 운영 모드  (0) 2021.04.12
각종 접근통제 기술 및 모델  (0) 2021.04.12
접근통제 정책  (0) 2021.04.12