반응형

범용 레지스터(General Purpose Register)

운영 모드와 가장 관계가 깊은 레지스터. 범용 레지스터는 계산, 메모리 어드레스 지정, 임시 저장 공간등의 목적으로 사용한다. 운영 모드 앞에 붙는 숫자와 범용 레지스터의 크기는 대체로 일치하지만, 범용 레지스터의 수는 프로세서가 지원하는 운영 모드에 따라 다르다.

범용 레지스터의 수가 늘어나면 어떻게 될까?

가장 큰 장점은 수행 속도의 개선이다. 관련된 값을 레지스터에 모두 올려서 계산함으로써 메모리에 접근하는 시간을 줄이는 것이 가능하다. 함수 호출에도 이와 같은 개념이 그대로 적용된다. 호출되는 함수가 작업을 처리하려면 정보가 필요하고, 이러한 정보는 호출하는 쪽에서 파라미터를 통해 넘겨준다. 다수의 범용 레지스터에 함수 파라미터를 넣어 넘겨줌으로써 스택 영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있다.

c.f)레지스터

프로세서 내부에 있는 작은 공간, 연산, 제어, 상태 표시, 디버깅 등의 목적으로 사용한다. x86-64 프로세서에는 여러 종류의 레지스터가 존재한다. 이는 곧 프로세서가 다양한 기능을 제공한다는 것을 의미하고, 구조 또한 복잡함을 의미한다.


~> 범용 레지스터의 용도는 고정된 것이 아니고, 다양한 용도로 사용된다(우리가 쉘코드를 만들때처럼 .. ). 하지만, 모든 상황에서 가능한 것은 아니므로 특정 명령어는 특정 레지스터와 같이 사용해야 한다.

여러 레지스터가 존재하는데, 다른 포스팅에서 처럼 레지스터를 다시한번 살펴보겠다.

 범용 레지스터 

용도 

AX 

산술 연산을 수행할 누산기(ACCUMULATOR) 

BX 

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

CX 

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

DX 

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

SI 

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

DI 

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

SP 

스택의 포인터로 사용 

BP 

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

R8~R15 

x86-64 프로세서에서 추가된 범용 레지스터로, 다양한 용도로 사용가능. 


c.f) 레지스터가 특수한 용도로 사용되는 예는 '디바이스 드라이버 코드'에서 찾을 수 있다.  PC에 연결된 디바이스를 제어하려면 장치가 연결된 I/O 어드레스에 접근해야 한다. 이때 I/O 어드레스를 저장할 수 있는 레지스터는 'DX'를 통해서만 가능하다

~>범용 레지스터의 크기는 프로세서의 '운영 모드'와 관련이 있다. 또한, 운영 모드에 따라 접두사를 결합하는 방법에는 일정한 규칙이 있으며 사용한 접두사에 따라 명령어(instruction)가 처리하는 오퍼랜드나 어드레스의 크기가 달라진다.


세그먼트 레지스터

세그먼트 레지스터의 주된 역할은 어드레스 영역의 구분이지만, 모드마다 조금씩 역할의 차이가 존재한다. 예를 들어, '리얼 모드'에서는 단순히 고정된 크기의 어드레스 영역을 지정하는 역할만 하지만, '보호 모드'와 'IA-32' 모드에서는 접근 권한, 세그먼트의 시작 어드레스와 크기 등을 지정하는데 사용되기도 한다.~> 이러한 기능을 이용하면 응용프로그램으로 부터 커널영역을 보호하는 기능을 쉽게 구현할 수 있다.

 세그먼트 레지스터 이름

설명 

CS 

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

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

DS 

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

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

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

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

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

ES

FS

SS 

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

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

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

~> 세그먼트 레지스터 접두사를 통해 명시적으로 특정 세그먼트를 설정할 수 있다. 스택 관련 작업을 수행할 때 역시 세그먼트 레지스터 접두사를 통해 ss 레지스터가 아닌 기타 세그먼트(CS 레지스터 제외)를 설정할 수 있다. 명시적으로 지정하지 않으면 기본적으로 사용되는 세그먼트 레지스터는 위의 표와 같다.

~> 세그먼트 레지스터의 역할은 주소 공간을 목적에 따라 구분하는 것이고, 주소 공간을 구분하는 방법은 메모리 관리 기법과 깊은 관계가 있다.(지금 이 포스팅을 하고 있는 사람도 메모리 때문에 운영체제를 공부하고 있다 ..)

메모리 관리 기법에는  크게 ' 세그먼테이션 기법'과 '페이징 기법 ' 두가지가 존재한다. 이 중 세그먼트 레지스터를 통해 주소 공간을 구분하는 방식이 '세그먼테이션' 이다. 


컨트롤 레지스터

운영 모드를 변경하고, 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터, X64 프로세서에서는 CR0,CR1,CR2,CR3,CR4의 5개 의 컨트롤 레지스터가 존재하며, X86-64 프로세서에는 CR8이 추가 되어 총 6개의 컨트롤 레지스터가 있다.

 컨트롤 레지스터

설명 

CR0 

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

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

CR1 

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

CR2 

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

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

CR3 

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

(페이징)

CR4 

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

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

CR5 

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

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

CR8

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

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

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

여기서 CR0 와 CR4, CR8 레지스터에서는 64비트 중 상위 32비트를 0으로 설정해야 한다.  CR2의 경우 64비트 영역을 모두 사용할 수 있고, CR3 레지스터는 비트 40~ 51 까지 모두 0으로 설정해야한다.

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

여기서 중요한건 컨트롤 레지스터의 특정기능은 해당 비트를 1로 설정해도 충분하긴 하나, 특정 기능은 1로 설정 하기전에 프로세서가 사용할 자료구조를 미리 준비해두어야 한다.


반응형
,