컴퓨터 구조란?
컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성하는 방법
명령어집합구조
CPU의 명령어에 대한 설계
->arm, mips,avr,인텔의 x86 및 x86-64 등
마이크로아키텍처
cpu의 하드웨어적 설계
연산과 제어를 위해 중앙처리장치(CPU)를, 저장을 위해 기억장치 사용, 장치간에 데이터나 제어신호를 교환할 수 있도록 버스라는 전다 통로 사용
중앙 처리 장치
프로그램의 연산을 처리하고 시스템을 관리하는 역할
-프로세스 코드 불러오고, 실행, 결과를 저장
-산술논리장치 + 제어장치 + 레지스터
기억장치
컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용
주기억장치와 보조기억장치로 분류
주기억 장치 - 프로그램 실행 과정에서 필요한 데이터들을 임시로 저장하기 위해 사용, 램
보조기억장치- 운영체제, 프로그램 등과 같은 데이터를 장기관 보관할 때 사용, 하드 드라이브
버스
컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이 신호를 전송하는 통로
데이터 버스, 주소 버스, 제어 버스가 있음 이외에 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 불림
? 기억장치가 있는데 cpu안에 레지스터가 왜 필요함?
-> cpu가 더 빠른 속도로 연산을 처리, 데이터의 빠른 교환이 필요
명령어 집합 구조(isa)
cpu가 해석하는 명령어의 집합
IA-32, x86-64(x64), mipsm avr 등 존재(다양하게 존재하는 이유: 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않으며 컴퓨팅 환경도 다양하기 때문이다)
intel x86-64 (cpu 점유율이 가능 높음)
고성능 프로세서를 설계하기 위해 사용, 많은 전력 소모, 발열 상대적으로 심함, 안정적으로 전력을 공급할 수 있고 냉각 장치를 구비하는데 공간상의 부담이 크지 않은 데스크톱 또는 랩톱에 적합하다
임베디드 장비들은 전력 소모와 발열이 적은 arm이나 mips 또는 avr의 프로세서를 사용
intel x86-64 아키텍처(x86)
인텔의 64비트 CPU 아키텍처이다. 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로, 대다수의 개인용 컴퓨터들이 이것을 사용 중
n 비트 아키텍처
64비트 아키텍처, 32비트 아키텍처에서 64와 32는 CPU가 한번에 처리할 수 있는 데이터의 크기를 말한다.
이를 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부르는데,
WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라지는데 보통 32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있으며, 레지스터의 용량 및 각종 버스들의 대역폭이 32비트이다.
WORD가 크면 유리한 점
32비트 아키텍처의 CPU가 제공할 수 있는 가상메모리의 크기가 작기 때문에 x64 많이 사용.
가상메모리는 CPU가 프로세스에게 제공하는 가상의 메모리 공간인데, 32비트 아키텍처에서는 4,294,967,296바이트(=4기가 바이트)가 최대로 제공 가능한 가상메모리의 크기이다. 일상적으로 사용하기에는 적절할 수 있지만 고사양 게임등에는 부적절
반면 64비트 아키텍처에서는 이론상 16엑사 바이트(=16,777,216 테라바이트)의 가상메모리를 제공한다.
이는 웬만해서는 완전한 사용이 불가능할 정도로 큰 크기이다.
intel x86-64 아키텍처(x86): 레지스터
레지스터는 cpu가 데이터를 빠르게 저장하고 이용할 수 있는 공간으로 범용레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다.
세그먼트 레지스터
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재(각 크기 16비트)
x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터이다.
현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고,
나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다.
명령어 포인터 레지스터
cpu가 어느 부분의 코드를 실행할지 가르키는 역할을 한다. x64의 아키텍처 명령어 레지스터는 rip 이며 크기는 8바이트이다.
플래그 레지스터
프로세서의 현재 상태를 저장하고 있는 레지스터 (최대 64개 플래그를 사용할 수 있음)
RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재(x86에서) -> 과거 16비트 플래그 레지스터에서 확장된 것
플 래그 예) 3의 값을 갖는 a와 5의 값을 갖는 b가 있을 때, a에서 b를 빼는 연산을 하면, 연산의 결과가 음수이므로 SF가 설정됩니다. 그러면 CPU는 SF를 통해 a가 b보다 작았음을 알 수 있다.
레지스터 호환
x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처라 호환이 가능 -> IA-32에서 CPU의 레지스터들은 32비트 크기를 가지는데
각각 eax, ebx, ecx, edx, esi, edi, esp, ebp이다. (호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능)
rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32비트를 가르킨다.
ex) eax는 rax의 하위 32비트를 의미
과거 16비트 아키텍처인 IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp ,ebp의 하위 16비트를 가르킨다
여기서 몇몇은 다시 상위 8비트, 하위 8비트로 나뉘는데 이들 전체에 대한 내용은 오른쪽 그림에서 확인하면 된다.
정리
범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
세그먼트 레지스터(Segment Register): 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터 x64에는 cs, ss, ds, es, fs, gs가 있다.
플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.
'System & Reversing 필기' 카테고리의 다른 글
[DreamHack] shell_basic 풀이 (0) | 2023.05.08 |
---|---|
DreamHack Stage2( x86 Assembly) (0) | 2023.05.01 |
DreamHack Stage2( 리눅스 메모리 구조) (0) | 2023.05.01 |
BoF (0) | 2023.03.18 |
x86, x64 레지스터 (0) | 2023.03.18 |