* 모든 내용과 이미지 출처는 Background: Computer Architecture | Dreamhack
CPU : 컴퓨터 작동의 핵심이 되는 연산 처리.
저장장치 : 데이터 저장
GPU : 그래픽 데이터 처리
랜카드 : 네트워크 통신 처리
사운드 카드 : 소리 데이터 처리
컴퓨터 구조(Computer Architecture)
컴퓨터의 기본 설계. 서로 다른 부품들이 이 설계에 맞춰서 개발되고 조립되어 컴퓨터가 완성됨.
컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 구성하는 방법.
명령어 집합구조(Instruction Set Architecture, ISA)
CPU가 사용하는 명령어와 관련된 설계
인텔 x86-64 아키텍처 = 가장 널리 사용되는 ISA 중 하나.
세부 분야
- 기능 구조의 설계
폰 노이만 구조
하버드 구조
수정된 하버드 구조
- 명령어 집합구조
x86, x86-64
ARM
MIPS
AVR
- 마이크로 아키텍처
캐시 설계
파이프라이닝
슈퍼 스칼라
분기 예측
비순차적 명령어 처리
- 하드웨어 및 컴퓨팅 방법론
직접 메모리 접근
폰 노이만 구조
컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다. - 노이만
+ 중앙처리장치(Central Processing Unit, CPU) -> 연산과 제어
CPU = 컴퓨터의 두뇌
- 프로그램 연산 처리, 시스템 제어
- 구성
산술논리장치(Arithmetic Logic Unit, ALU) : 산술/논리 연산 처리
제어장치(Control Unit) : CPU 제어
레지스터(Register) : CPU에 필요한 데이터 저장
+ 기억장치(Memory) -> 저장
주기억장치 : 프로그램 실행과저에서 필요한 데이터 임시 저장.-> 램(Random-Access Memory, RAM)
보조기억장치 : 운영 체제, 프로그램 등과 같은 데이터 장기 보관 -> 하드드라이브(HDD), SSD(Solid State Drive)
+ 버스(bus) -> 장치 간 데이터 or 제어 신호 교환용 전자 통로.
컴퓨터 부품과 부품 사이 / 컴퓨터 간 신호 전송 통로.
데이터 버스(Data Bus) : 데이터 이동
주소 버스(Address Bus) : 주소 지정
제어 버스(Control Bus) : 읽기/쓰기 제어
그 외) 랜선, 데이터 전송 목적 소프트웨어, 프로토콜 등
CPU에 저장장치가 필요한 이유 : CPU는 굉장히 빠른 속도로 연산을 처리하므로 데이터 교환속도를 주기억장치 및 보조기억장치가 따라가지 못함. -> 병목현상 발생 가능.
데이터 교환 속도 획기적 단축 목적 -> 레지스터와 캐시 존재
명령어 집합 구조
CPU가 해석하는 명령어의 집합
프로그램의 코드는 기계어로 작성되어 있고, 실행하면 이 명령어들을 CPU가 읽고 처리함.
인텔 x86-64 : 고성능 프로세서 설계용. 많은 전력 소비, 발열 -> 데스크톱, 랩탑에 적합함. 점유율 압도적임.
ARM, MIPS, AVR 사용 : 임베디드 기기, 스마트폰 등은 발열 문제에 민감하고, 배터리 작동으로 많은 전력 공급이 어려움.
x86-64 아키텍처
인텔의 64비트 CPU 아키텍처.
- n 비트 아키텍처
64비트 아키텍처, 32비트 아키텍처
64, 32 = CPU가 한번에 처리 가능한 데이터의 크기 => WORD : CPU가 이해할 수 있는 데이터의 단위라는 의미.
32비트 아키텍처
ALU = 한번에 32비트 크기의 값 연산 가능
레지스터의 용량 및 각종 버스 대역폭 = 32비트 크기
-> 설계 상 32비트의 데이터까지만 처리 가능.
WORD가 크면 유리한 점
32비트 아키텍처는 가상메모리(Vitual Architecture) 크기가 작음.-> 전문 소프트웨어나 고사양 게임 돌리기엔 부족함.
x86-64 아키텍처 : 레지스터
레지스터 : CPU 내부 저장장치, 산술 연산에 필요한 데이터 저장 or 주소 저장하고 참조 등 다양한 용도.
범용 레지스터(General Register)
주용도는 있는데 그 외 용도로도 사용 가능.
8바이트 저장 가능.
부호 없는 정수 기준 2^64 -1 까지 나타낼 수 있음.
이름 | 주용도 |
rax(accumulator register) | 함수의 반환 값 |
rbx (base register) | x64에서는 주된 용도 x |
rcx (counter register) | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
rdx (data register) | x64에서는 주된 용도 x |
rsi (source index) | 데이터를 옮길 때 원본을 가리키는 포인터 |
rdi (destination index) | 데이터를 옮길 때 목적지를 가리키는 포인터 |
rsp (stack pointer) | 사용중인 스택의 위치를 가리키는 포인터 |
rbp (stack base pointer) | 스택의 바닥을 가리키는 포인터 |
세그먼트 레지스터
cs, cc, ds, es, fs, gs -> 세그먼트 레지스터. 각각 16비트 크기.
- x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터.
과거
IA-32, IA-16 : 세그먼트 레지스터를 이용해서 사용 가능한 물리 메모리의 크기를 키우려 함.
ex) cs:offset -> 실제 주소 = cs<<4 + offset
= 16비트에 범위에서 접근할 수 없는 주소 접근 가능.
당시에는 범용 레지스터 크기 작았지만 지금 x64에서는 사용 가능한 주소 영역이 굉장히 넓기 때문에 이런 용도로는 거의 사용 x.
현대
cs, ds, ss 레지스터 : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용됨.
es, fs, gs : 운영체제 별로 용도 결정. -> 범용적 세그먼트 레지스터.
명령어 포인터 레지스터
프로그램의 기계어 코드 중 어느 부분의 코드를 실행할지 가리키는 역할.
rip, 크기 = 8바이트.
플래그 레지스터
프로세서의 현재 상태 저장.
REFLAGS, 64비트 크기.
깃발을 올리고 내리듯이 자신을 구성하는 여러 비트들로 CPU의 현재 상태 표현.
플래그 | 의미 |
CF (Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정됨. |
ZF (Zero Flag) | 연산의 결과가 0일 경우 |
SF(Sign Flag) | 연산의 결과가 음수일 경우 |
OF(Overflow Flag) | 부호 있는 수의 연산 결과가 비트의 범위를 넘을 경우 |
a=3, b=5일 때 a에서 b를 빼면 연산의 결과가 음수이므로 SF 설정.
CPU는 SF를 통해 a가 b보다 작았음을 알 수 있음.
-> 실제 이런 원리를 이용해 대소 비교하는 어셈블리 명령어가 있음.
레지스터 호환
x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처임. 호환 가능.
IA-32 레지스터들 : eax, ebx, ecx, edx, esi, edi, edp, ebp -> 확장된 레지스터의 하위 32비트.
예) eax = rax의 하위 32비트
IA-16 레지스터 : ax, bx, cx, dx, si, di, sp bp -> IA-32의 하위 16비트를 가리킴
또 다시 상위 8비트와 하위 8비트로 나뉘기도 함.
rax -> eax -> ax 순으로 내려간다고 보면 됨.
퀴즈
rax = 0x0123456789abcdef 일 때, eax, ax, ah, al의 값.
1) eax = 0x89abcdef
-> rax는 16바이트 즉, 64비트로 이루어짐. eax는 rax의 하위 32비트이므로 0123456789abcdef의 절반 중 뒷부분인
0x89abcdef이다.
2) ax = 0xcdef
3) ah = 0xcd
4) al = 0xef
rax에서 rbx를 뻈을 때, ZF 설정 -> rax == rbx이다.
-> ZF= 제로 플래그. 연산의 결과가 0일 경우 설정됨.
'Dreamhack' 카테고리의 다른 글
리버싱 06 - rev-basic-0 (0) | 2022.07.12 |
---|---|
리버싱 05 - x86 Assembly (0) | 2022.07.12 |
리버싱 04 - Windows Memory Layout (0) | 2022.07.10 |
리버싱 02 - 동적 분석과 정적 분석 (0) | 2022.07.10 |
리버싱 01 - Binary (0) | 2022.07.09 |