컴퓨터 구조
- 컴퓨터의 기능 구조에 대한 설계: 컴퓨터가 연산을 효율적으로 수행하기 위해 필요한 기능들을 고안하고 설계하는 분야이다. 여기에는 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조 등이 포함된다.
- 명령어 집합구조(ISA, Instruction Set Architecture): CPU의 명령어를 설계하는 분야로, CPU가 처리해야하는 명령어를 정의한다. 대표적으로 ARM, MIPS, AVR, 인텔의 x86 및 x86-64 등이 있다.
- 마이크로 아키텍처(Micro Architecture): CPU의 하드웨어적 설계를 다루며, 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계한다.
컴퓨터 구조의 세부 분야
- 기능 구조의 설계
- 폰 노이만 구조
- 하버드 구조
- 수정된 하버드 구조
- 명령어 집합구조
- x86, x86-64
- ARM
- MIPS
- AVR
- 마이크로 아키텍처
- 캐시 설계
- 파이프라이닝
- 슈퍼 스칼라
- 분기 예측
- 비순차적 명령어 처리
- 하드웨어 및 컴퓨팅 방법론
- 직접 메모리 접근
폰 노이만 구조
- 폰 노이만은 초기 컴퓨터 과학자로, 컴퓨터의 연산, 제어, 저장이 세 가지 핵심 기능이 필요하다고 주장했다.
- 현대 컴퓨터는 이러한 기능을 중앙처리장치(CPU)와 기억장치(memory)를 사용하여 수행한다.
- CPU는 연산 처리와 시스템 제어를 담당하며, ALU, 제어장치, 레지스터 등의 요소로 구성된다.
- 기억장치는 데이터를 저장하는 역할을 하며, 주기억장치와 보조기억장치로 나뉘며, 주기억장치는 프로그램 실행에 필요한 데이터를 임시로 저장하고, 보조기억장치는 장기적인 데이터 보관에 사용된다.
- 버스는 장치 간 데이터와 제어 신호를 교환하는 통로를 제공하며, 데이터 버스, 주소 버스, 제어 버스 등이 있다.
CPU 내부 저장장치의 필요성
- CPU는 빠른 연산을 위해 레지스터와 캐시와 같은 내부 저장장치를 가진다.
- CPU의 속도는 외부의 주기억장치나 보조기억장치와 비교하여 극도로 빠르기 때문에, 이들 저장장치만 사용하면 데이터 교환에 병목 현상이 발생할 수 있다.
- 따라서 CPU 내부에 저장장치를 두어 데이터 교환 속도를 높이고, 효율적인 연산을 돕는다.
명령어 집합 구조
- 명령어 집합 구조는 CPU가 해석하는 명령어의 집합을 말하며, 프로그램 코드는 이러한 명령어로 작성된다.
- 다양한 ISA가 존재하며, 사용 목적과 환경에 따라 선택된다.
- 이 코스에서는 x86-64 아키텍처를 중점적으로 다루며, 이는 고성능 프로세서를 설계하기 위한 것으로, 데스크톱 및 랩톱과 같은 환경에 적합하다.
- 다른 ISA에 대한 학습은 이후 심화 과정에서 다룰 예정이며, x86 기반 CPU의 점유율이 높아 이를 기반으로 하는 것이 이해와 응용에 유리하다.
x86-64 아키텍처
- 1999년, AMD는 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트로 확장한 AMD64 아키텍처를 발표했다.
- AMD64가 시장에서 인정받자, 이를 기반으로 한 x86-64 아키텍처가 널리 사용되기 시작했다.
- 현재 대다수 개인용 컴퓨터는 x86-64 아키텍처 기반의 CPU를 탑재하고 있다.
n 비트 아키텍처
- CPU가 한 번에 처리할 수 있는 데이터의 크기를 나타내는 단위인 WORD의 크기를 나타낸다.
- 64비트 아키텍처는 보다 큰 가상메모리를 제공하여 성능을 향상시킨다.
- 가상메모리의 크기는 CPU 아키텍처에 따라 제한된다.
x86-64의 다양한 이름
- Intel64, IA-32e, amd64, EM64T 등의 다양한 이름을 가지고 있다.
- 이는 AMD와 인텔이 서로의 기술을 활용하고 명칭을 사용하는 등 복잡한 개발과정을 거쳤기 때문이다.
레지스터
- CPU 내부의 저장장치로서, 데이터를 빠르게 접근하여 사용한다.
- 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터 등이 있다.
- x86-64 아키텍처의 레지스터는 IA-32와의 호환성을 유지하면서 확장되었다.
- 가상 메모리(Virtual Memory):
- 운영체제는 프로세스에게 사용 가능한 메모리 공간을 할당해 줍니다. 이를 가상 메모리라고 한다.
- 프로세스가 사용하는 실제 물리 메모리(RAM)와는 별도로, 가상 메모리는 주소 공간으로서의 역할을 한다.
- 메모리 레이아웃(Memory Layout):
- 프로세스의 가상 메모리는 여러 영역으로 나뉘어집니다. 이러한 영역들을 메모리 레이아웃이라고 한다.
- 주요한 메모리 레이아웃 영역으로는 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 등이 있다.
- 주요 메모리 레이아웃 영역:
- 코드(Code): 프로그램의 명령어들이 저장되는 영역으로, 실행 가능한 기계어 코드가 위치한다.
- 데이터(Data): 정적(static) 및 전역(global) 변수들이 저장되는 영역이다.
- 스택(Stack): 지역 변수 및 함수 호출 시 사용되는 메모리 공간입니다. 후입선출(LIFO) 방식으로 동작한다.
- 힙(Heap): 동적으로 할당된 메모리 공간으로, 프로그램 실행 중에 동적으로 크기가 할당되고 해제된다.
- 권한 설정:
- 각각의 메모리 레이아웃 영역에는 적절한 권한이 설정됩니다. 예를 들어, 코드 영역은 실행 권한만을 가지며, 데이터 영역은 읽기/쓰기 권한을 가진다.
- 이러한 권한 설정은 보안 및 안정성을 유지하기 위해 중요하다.
- 섹션
- .text
- .data
- .rdata
- 스택
- 힙
- .text 섹션:
- 실행 가능한 기계 코드가 위치하는 영역입니다.
- 읽기 및 실행 권한이 부여됩니다.
- 예시: 프로그램의 명령어들이 기계어 코드로 변환되어 이 섹션에 위치합니다.
- .data 섹션:
- 컴파일 시점에 값이 정해진 전역 변수들이 위치하는 영역입니다.
- 읽기 및 쓰기 권한이 부여됩니다.
- 예시: 전역 변수들이나 초기화된 데이터가 위치합니다.
- .rdata 섹션:
- 컴파일 시점에 값이 정해진 전역 상수와 참조할 DLL 및 외부 함수들의 정보가 저장됩니다.
- 읽기 권한만 부여되며 쓰기는 불가능합니다.
- 예시: 전역 상수 및 문자열들이 위치하며, 일부 시스템 정보도 저장됩니다.
PE 파일의 메모리 레이아웃에는 섹션 이외에도 중요한 부분이 있습니다.
- 스택(Stack):
- 각 쓰레드는 자신만의 스택 공간을 가지고 있으며, 지역 변수나 함수의 리턴 주소 등이 저장됩니다.
- 읽기 및 쓰기 권한이 부여됩니다.
- 예시: 함수 호출 시 사용되는 지역 변수들이 저장됩니다.
- 힙(Heap):
- 동적으로 할당된 메모리 공간으로, 프로그램이 필요에 따라 사용합니다.
- 읽기 및 쓰기 권한이 부여되며, 실행 권한도 부여될 수 있습니다.
- 예시: malloc() 또는 new로 할당된 메모리가 위치합니다.
요약
.text | 실행 가능한 코드가 저장된 영역 | 읽기, 실행 | main() 등의 함수 코드 |
.data | 초기화된 전역 변수가 위치하는 영역 | 읽기와 쓰기 | 초기화된 전역 변수, 전역 상수 |
.rdata | 초기화된 전역 상수나 임포트 데이터가 위치하는 영역 | 읽기 전용 | 전역 상수, 임포트 데이터 |
스택 | 일시적으로 저장하고 사용하는 임시 영역 | 읽기, 쓰기 | 지역 변수, 함수의 인자 등 |
힙 | 자유롭게 사용할 수 있는 영역 | 읽기, 쓰기 | malloc(), calloc() 등으로 할당 받은 메모리 |