Search

3장 : Background: Computer Architecture, Register

대분류
보안
소분류
기초 리버싱
유형
컴퓨터 구조
레지스터
최종 편집 일시
2024/11/02 10:31
생성 일시
2022/10/10 04:30
15 more properties

컴퓨터 구조 (Computer Architecture)

컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법

컴퓨터의 기능 구조에 대한 설계

폰 노이만 구조
중앙처리장치 CPU
기억장치 (주/보조)
버스
컴퓨터 부품 사이 신호를 전송하는 통로
데이터 버스(Data Bus)
주소 버스(Address Bus)
제어 버스(Control Bus)
랜선, 데이터 전송 목적 소프트웨어, 프로토콜 등
하버드 구조
수정된 하버드 구조

명령어 집합구조 ( ISA : Instruction Set Architecture)

CPU가 해석하는 명령어의 집합
ARM
MIPS
AVR
인텔의 x86 및 x86-64
n비트 아키텍처 : n비트는 cpu가 처리할 수 있는 데이터의 크기 = WORD

레지스터

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

운영 모드와 관계가 깊은 레지스터
계산(연산 처리), 메모리 주소(번지) 지정, 작은 데이터의 임시 저장 공간, 컴퓨터 장치 제어 등의 목적으로 사용
32bit 프로세서, 64bit 프로세서 전부 보유
범용 레지스터의 수는 프로세서가 지원하는 운영 모드에 따라 달라짐.
범용 레지스터의 수가 많을 경우, 수행 속도가 빨라짐.
함수를 호출할 때 파라미터를 통해 값을 넘겨주는데 다수의 범용 레지스터에 어떤 함수에서 사용할 정보가 담긴 함수 파라미터를 넣어 넘겨주면 스택 영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있어서 수행 속도가 빨라진다.
기본적인 8개의 레지스터는 공통적인 용도로 사용할 수 있게 가지고 있고, IA-32e(64bit) 모드에서는 추가적으로 R8 ~ R15 레지스터가 있다.
IA-32e(64bit) 모드에서 기본 범용 레지스터와 R8 ~ R15 레지스터는 같은 기능을 하지만, R8 ~ R15 레지스터는 특수한 용도가 정의되지 않는다.
다양한 용도로 사용될 수 있지만, 특정 명령어는 해당 명령어의 용도에 맞는 레지스터를 사용하여야 한다.
범용 레지스터 종류
1.
기본 레지스터
레지스터 이름
용도
AX
- 입출력 / 산술 연산 수행 주 누산기(Primary Accumulator Register) - 함수 리턴값을 가짐
BX
- 데이터의 주소를 지정할 때 데이터 포인터로 사용(주로 DS 세그먼트에 대한 포인터 저장), 베이스 레지스터(Base Register) - 일반적인 용도는 계산기, 특정 주소 지정(인덱스)을 위해 DI, SI와 결합 가능
CX
- 문자열이나 루프의 카운터(Counter Register) - 루프가 반복되는 횟수를 제어하는 값 또는 왼쪽이나 오른쪽으로 이동되는 비트 수 포함 가능
DX
- 데이터 레지스터(Data Register) - I/O(Input/Output) 주소를 지정할 때 사용(입출력 연산) - 큰 수 산술 연산을 수행할 때 보조 레지스터로 사용(with. AX)
2.
인덱스 레지스터
인덱스 주소지정, 연산(덧셈, 뺄셈)에서 사용 가능
레지스터 이름
용도
SI
문자열에 관련된 작업을 수행할 때 원본 문자열의 인덱스(위치)로 사용
DI
문자열에 관련된 작업을 수행할 때 목적지 문자열의 인덱스(위치)로 사용
3.
포인터 레지스터(Pointer Register)
레지스터 이름
용도
SP
- 스택(Stack)의 포인터로 사용 - 현재 스택의 위치 - 스택 사이즈가 커지면 SP에 저장된 주소값은 작아진다.
BP
- 스택의 데이터에 접근할 때 데이터의 포인터로 사용 - 현재 스택 프레임이 소멸되지 않는 동안 EBP의 값이 변하지 않으므로 기준점(Base)이 됨
IP
- 명령어(Instruction) 포인터 레지스터 - 현재 실행중인 코드 세그먼트에 속한 현재 명령어를 가리킨다는 점에서 CS 레지스터 (CS:IP)와 연관됨.
4.
기타 레지스터
R8 ~ R15
x86-64 프로세서에서 추가된 범용 레지스터, 특수한 용도가 정의되어 있지 않아 다양한 용도로 사용 가능

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

세그먼트 : 프로토콜 데이터 단위
16bit 크기를 가진 레지스터
어드레스 영역을 다양한 크기로 구분하는 역할
주된 작업은 어드레스 영역의 구분(세그먼트라고 하는 메모리의 한 영역에 대한 주소지정)이지만, 모드에 따라 조금씩 차이가 있다.
리얼 모드
단순 고정된 크기의 어드레스 영역을 지정하는 역할
보호 모드와 IA-32e 모드
접근 권한세그먼트의 시작 주소와 크기 등을 지정하는 데 사용
응용프로그램으로부터 커널 영역을 보호하는 기능을 구현 가능
과거 IA-32, IA-16에서는 사용 가능 물리 메모리를 키우려고 했지만 현대에선 사용 가능 주소 영역이 넓어져서 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작
세그먼트 레지스터의 종류
레지스터 이름
용도
CS
- 코드 영역(프로그램의 코드 세그먼트 시작주소 포함)을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 X, 점프 명령이나 인터럽트 관련 명령으로 변경 가능 - 이 세그먼트 주소에 IP 레지스터 오프셋 값을 더하면, 실행하기 위해 메모리로부터 가져와야 할 명령어의 주소가 됨 - 일반적 프로그래밍에선 직접 참조 필요 X
DS
- 데이터 영역(프로그램의 데이터 세그먼트 시작주소 포함)을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능, 데이터 영역에 접근할 때 임시적으로 사용
ES
- 데이터 영역을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능, 문자열과 관련된 작업(메모리 주소 지정을 다루는 스트링 연산)을 처리할 때 임시적으로 사용 * 이 때 DI레지스터와 연관되어 적절한 세그먼트 주소로 초기화 해야함
FS/GS
- 데이터 영역을 가리키는 레지스터 - 데이터 이동 명령으로 값 변경 가능 - 기억장소 요구사항을 다루기 위해서 80386에서 추가로 도입된 여분의 세그먼트 레지스터
SS
- 스택 영역(프로그램의 스택 세그먼트 시작 주소)을 가리키는 레지스터 - 주소와 데이터의 임시 저장 목적 - 데이터 이동 명령으로 값을 변경 불가능, 스택 관련 레지스터(SP, BP)를 통해 스택에 접근할 때 임시적으로 사용

3. 플래그 레지스터

프로세서의 현재 상태를 저장하고 있는 레지스터
비트들로 CPU의 현재 상태 표현
CF(Carry Flag)
부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정.
ZF(Zero Flag)
연산의 결과가 0일 경우 설정.
SF(Sign Flag)
연산의 결과가 음수일 경우 설정.
OF(Overflow Flag)
부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정.

4. 컨트롤 레지스터

운영 모드를 바꾸고, 현재 운영 모드의 특정 기능을 제어하는 레지스터
x86 프로세서에서는 CR0 ~ CR4의 총 5가지 컨트롤 레지스터 보유
x86-64 프로세서에서는 위의 5개 및 추가로 CR8이 생겨 6개를 보유
레지스터 이름
용도
CR0
- 운영 모드 제어 기능 레지스터 - 리얼 모드에서 보호 모드로 전환하는 역할, 캐시, 페이징 기능 등 활성화
CR1
- 프로세서에 의해 예약된 레지스터
CR2
- 페이지 폴트 발생 시 페이지 폴트가 발생한 선형 주소(가상 주소)가 저장되는 레지스터 - 페이징 기법을 활성화 한 후, 페이지 폴트 발생 시만 유효한 값 가짐
CR3
- 페이지 디렉터리의 물리 주소페이지 캐시에 관련된 기능을 설정하는 레지스터
CR4
- 프로세서에서 지원하는 각종 확장 기능을 제어하는 레지스터 - 페이지 크기 확장이나 메모리 영역 확장 등의 기능 활성화
CR8
- 테스크 우선순위 레지스터의 값을 제어하는 레지스터 - 프로세스 외부 발생 인터럽트 필터링 - IA-32e 모드에서만 접근 가능

마이크로 아키텍처

캐시 설계
파이프라이닝
슈퍼 스칼라
분기 예측
비순차적 명령어 처리