범용레지스터
16비트 / 32비트 모드르르 지원하는 x86계열은 8개, 64비트 모드를 지원하는 x86-64계열은 16개의 범용 레지스터가 있다.
레지스터?
레지스터는 프로세서 내부에 있는 작은 공간이며 연산 제어, 상태표시, 디버깅의 목적으로 사용
범용 레지스터가 늘어나면 장점이?
- 수행 속도의 개선 : 관련된 값을 레짓터에 모두 올려서 계산함으로써 메모리에 접근하는 시간을 줄이는 것이 가능
- 함수 호출 : 다수의 범용레지스터에 함수 파라미터를 넣어 넘겨줌으로써 스택 영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있다.
범용 레지스터의 용도는 고정된 것이 아니며, 다양한 목적으로 사용될 수 있다. 하지만, 모든 상황에서 가능한 것은 아니므로 특정 명령어는 특정 레지스터와 같이 사용해야 한ㄷㅏ.
범용 레지슽에는 개별적인 이름이 있는데, 이 이름을 통해 각 레지슽의 특수한 용도를 알 수 있다.
AX
산술 연산을 수행할 때 누산기로 사용
BX
데이터 어드레스를 지정하라 때 데이터 포인터로 사용
CX
루프 또는 문자열의 카운터로 사용
DX
IO 어드레스를 지정할 때 사용되며 , 산술 연산을 수행할 때 보조 레지스터로 사용
PC에 연결된 디바이스를 제어하려면 장치가 연결된 IO 어드레스에 접근해야함
SI
문자열에 관련되니 작업을 수행할 때 원본 문자열의 인덱스로 사용
DI
문자열에 관련된 작업을 수행할 때 목적지 문자열의 인덱스로 사용
SP
스택의 포인터로 사용
BP
스택의 데이터에 접근할 때 데이터의 포인터로 사용
R8 ~ R15
x86-64에 추가된 범용 레지스터
IA-32e 모드에서 기본 오퍼랜드 크기가 32비트, 기본 어드레스 크기는 64비트로 설계
기본 오퍼랜드 크기가 32비트로 설계되어 64비트 어드레스를 표현할 수 없으므로 RIP 상대 어드레스라는 새로운 어드레스 계산 방식이 도입
오퍼랜드 32비트로 어떻게? 64비트 어드레스 표현
32비트와 호환성을 유지하기 위해 오퍼랜드를 이렇게 정의한건가?
접두사 중에 64비트 오퍼랜드와 관계있는 REX 접두사를 이용
REX 접두사르 사용하면 오퍼랜드의 크기가 64비트가 되고, 따라서 64비트 어드레스를 모두 표현할 수 있다.
세그먼트 레지스터
세그먼트 레지스터는 16비트 레지스터로 어드레스 영역을 다양한 크기로 구분하는 역할을 한다.
세그먼트 레지스터의 주된 역할은 어드레스 영역의 구분이지만, 모드마다 조금 씩 차이가 있다.
리얼모드에서는 단순히 고정된 크기의 어드레스 영역을 지정하는 역할만 하지만, 보호모드와 IA-32e모드에서는 접근 권한, 세그먼트의 시작 어드레스와 크기 등을 지정하는데 사용
세그먼트 레지스터는 CS, DS, SS,ES,FS,GS로 총 6개로구성
CS
- 코드 영역을 가리키는 레지스터
- 데이터 이동 명령으로 값을 변경할 수 없으며, 점프 명령이나 인터럽트 관련 명령으로 변경가능
DS
ES
FS
- 데이터 영역을 가리키는 레지스터
- 데이터 이동 명령으로 값을 변경할 수 있음
- DS레지스터는 데이터 영역에 접근할 때 암시적으로 사용됨
- ES레지스터는 문자열과 관련된 작업을 처리할때 암시적으로 사용됨
- 데이터 영역에 접근하면서 DS레지스터 이외의 리제스터를 사용하려면 세그먼트 접두사 사용
SS
스택 영역을 가리키는 레지스터
- 데이터 이동 명령으로 값을 변경할 수 있음
- 스택 관련 레지스터를 통해 스택에 접근할 때 암시적으로 사용됨
세그먼트 레지스터로 주소공간을 구분하는 것이 세그먼테이션이다.
컨트롤 레지스터
- 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터
cr0
- 운영 모드를 제어하는 레지스터
- 리얼 모드에서 보호모드로 전환하는 역할과 캐시, 페이징 기능 등을 활성화 시킴
cr1
- 프로세서에 의해 예약된 레지스터
cr2
-페이지 폴트 발생시 페이지 폴트가 발생한 선형주소가 저장되는 레지스터
- 페지이 기법을 활성화 후에는 페이지 폴트 발생 시만 유효한 값을 가짐
cr3
- 페이지 디렉터리의 물리 주소와 페이지 캐시에 관련된 기능을 설정하는 레지스터
cr4
- 프로세서에서 지운하는 각종 확장 기능을 제어하는 레지스터
- 페이지 크기 확장이남 ㅔ모리 영역 확장 등의 기능을 활성화시킴
cr8
- 태스크 우선순위 레지스터 값을 제어하는 레지스터
- 프로세스 외부에서 발생하는 인터럽트를 걸러주는 필터의 역할
- IA-32e 모드에서만 접근 가능
보호모드(32비트)
세그먼트 레지스터는 세그먼트 디스크립터의 위치. 16비트에서는 그냥 구분하는 선형주소...
세그먼트 디스크립터는 메모리상에 존재하는 자료구조의 일종으로 GDT라고 불리는 곳에 모여있다.
GDT도 역시 자료구조이므로, 시작주소를 알려주어야 함 그것이 바로 GDTR 레지스터
GDT desc는 8192개 까지 생성
GDT desc의 크기는 64비트
보호모드에서 주소를 계싼하는 방법ㅇ느 리얼 모드와 마찬가지로 세그먼트 레지스터의 기준 주소에 범용 레지스터의 값을 더해서 구함 이렇게 계산한 결과가 선형주소이며(가상주소) 프로세서는 실제메모리에 접근할 때 선형주소를 기반으로 물리주소를 계산한다. 페이징을 사용하지 않는다면, 선형주소는 물리 주소와 1:1로 대응
리얼모드에서 보호모드로 전환하려면?
세그먼트 디스크립터 생성 : 보호모드를 위한
- 보호모드 코드와 데이터용 세그먼트 디스크립터 생성
GDT 정보 생성 : 보호모드를 위한
- 세그먼트 디스크립터의시작 어드레스와 디스크립터의 전체 크기 저장
프로세서에 GDT정보 설정
- GDTR 레지스터에 GDT의 시작 어드레스와 크기 설정
CR0 컨트롤러 레지스터 설정
- CR0 컨트롤 레지스터의 PE비트 = 1 PG비트 = 0
jmp 명령으로 CS 세그먼트 셀렉터 변경과 보호모드로 전환
- jmp 0x08 : 보호모드 커널의 시작 어드레스
-------------------------------------------------------------------- 윗부분은 16비트 리얼모드
각종 세그먼트 셀렉터 및 스택 초기화
- DS, ES, FS, GS, SS 세그먼트 셀렉터와 ESP, EBP 레즈섵 초기화