컴퓨터 구조와 명령어 집합 구조
(1) 컴퓨터 구조
[ 컴퓨터 구조(Computer Architecture)란? ]
컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법
1. 기능 구조의 설계
: 컴퓨터가 효율적인 연산을 위해 어떤 기능들이 필요한지 고민하고 설계
종류) 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조
2. 명령어 집합구조
: CPU가 처리해야하는 명령어를 설계하는 분야
종류) ARM, MIPS, AVR, 인텔의 x86 및 x86-64
3. 마이크로 아키텍처 → CPU의 하드웨어적 설계
: 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계
종류) 캐시 설계, 파이프라이닝, 슈퍼 스칼라, 분기 예측, 비순차적 명령어 처리
4. 하드웨어 및 컴퓨팅 방법론 → 직접 메모리 접근
(2) 폰 노이만 구조
초기 컴퓨터 과한자 폰 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각하여 근대의 컴퓨터는 중앙처리장치 (Central Processing Unit, CPU), 기억장치 (memory), 버스 (bus)를 사용한다.
1. 중앙처리장치
- CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌
- 산술/논리 연산을 처리하는 산술논리장치와 CPU를 제어하는 제어장치, CPU에 필요한 데이터를 저장하는 레지스터 등으로 구성
2. 기억장치
- 기억장치는 컴퓨터 동작에 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류
- 주기억장치
- 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용
- 대표적으로 램(Random-Access Memory, RAM)
- 보조기억장치
- 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용
- 대표적으로 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)
3. 버스
- 버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로
- 대표적으로 데이터가 이동하는 데이터 버스, 주소를 지정하는 주소 버스, 읽기/쓰기를 제어하는 제어 버스가 있음
- 이 외에도 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스로 불림
(3) 명령어 집합 구조
: 명령어 집합 구조(Instruction Set Architecture, ISA)란 CPU가 해석하는 명령어의 집합을 의미
▶ 기계어로 이루어진 프로그램을 실행하면 이 명령어들을 CPU가 읽고, 처리함
▶ ISA 종류 : IA-32, x86-64(x64), MIPS, AVR 등
[ x86-64 ]
- 고성능 프로세서를 설계하기 위해 사용
- CPU들은 많은 전력을 소모하며, 발열도 상대적으로 심함
- 안정적으로 전력을 공급할 수 있고, 냉각 장치를 구비하는데 공간상의 부담이 크지 않은 데스크톱 또는 랩톱에 적합
[ ARM이나 MIPS 또는 AVR의 프로세서 ]
- 임베디드 장비들은 전력 소모와 발열이 적은 프로세서 사용
- 작은 임베디드 기기들은 이러한 제약조건을 해결하기 어려움
x86-64 아키텍처
(1) x86-64 아키텍처
1999년, AMD는 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트로 확장한 AMD64 아키텍처를 발표하였다. 이후 보다 범용적이고 중립적으로 지칭되는 x86-64라는 명칭이 탄생하게 되었고, 현재 대다수 개인용 컴퓨터는 이 x86-64 아키텍처 기반의 CPU를 탑재하고 있다.
[ n 비트 아키텍처 ]
- 'n 비트' 아키텍처에서 'n 비트'는 CPU가 한번에 처리할 수 있는 데이터의 크기
- WORD : CPU가 이해할 수 있는 데이터 단위
WORD가 크면 유리한 점)
현대의 PC는 대부분 64비트 아키텍처의 CPU를 사용하는데, 그 이유 중 하나는 32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기가 작기 때문
▶ 32비트 아키텍처에서는 4기가 바이트가 최대로 제공 가능한 가상메모리의 크기이다. 일상적으로 사용하기에는 적절할 수 있지만, 많은 메모리 자원을 소모하는 전문 소프트웨어나 고사양의 게임 등을 실행할 때는 부족할 수 있다.▶ 반면 64비트 아키텍처에서는 이론상 16엑사 바이트의 가상메모리를 제공할 수 있다. 이는 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없다거나 소프트웨어의 실행이 불가능한 상황은 거의 발생하지 않는다.
(2) x86-64 아키텍처: 레지스터
1. 범용 레지스터
- 주용도 외의 다양한 용도로 사용될 수 있는 레지스터
- 부호 없는 정수를 기준으로 (2^64) −1까지의 수를 나타낼 수 있음
2. 세그먼트 레지스터
- x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다
현대의 x64에서의 레지스터)
1) cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용됨
2) 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터
3. 명령어 포인터 레지스터
- CPU가 어느 부분의 코드를 실행할지 가리키는 역할
- x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트
4. 플래그 레지스터
- 프로세서의 현재 상태를 저장하고 있는 레지스터
- 깃발을 올리고, 내리는 행위 로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현
5. 레지스터 호환
x86-64 아키텍처)
IA-32의 64비트 확장 아키텍처이며, 호환이 가능함
▶ rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가리킨다. 예를 들어, eax는 rax의 하위 32비트를 의미한다.
▶ 과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx , ecx , edx, esi, edi, esp, ebp의 하위 16비트를 가리킨다.
출처 : 드림핵 (https://dreamhack.io/lecture/roadmaps/2)
'Security > System Hacking' 카테고리의 다른 글
[Tool] gdb (0) | 2024.09.09 |
---|---|
[Dreamhack] ssp_001 (0) | 2024.09.01 |
[Dreamhack] ssp_000 write-up (2) | 2024.09.01 |
[Background] x86 Assembly (0) | 2024.09.01 |
[Background] Linux Memory Layout (0) | 2024.09.01 |