컴퓨터 구조 (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 모드에서만 접근 가능 |
마이크로 아키텍처
•
캐시 설계
•
파이프라이닝
•
슈퍼 스칼라
•
분기 예측
•
비순차적 명령어 처리