전체적인 컴퓨터 구조 중에서 특히 cpu가 사용하는 명령어와 관련된 설계를 명령어 집합구조(Instrcution Set Architecture, ISA)라고 하는데, 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처입니다.

 

폰 노이만 구조

컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각했습니다. 근대 컴퓨터는 연산과 제어를 위해 중앙처리장치를 저장을 위해 기억장치를 사용합니다.

그리고 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스라는 전자 통로를 사용합니다.

CPU

프로그램의 연산을 처리하고 시스템을 제어하는 컴퓨터의 두뇌입니다. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 cpu에서 일어납니다.

기억장치

기억장치는 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용되며 용도에 따라 주기억장치와 보조기억장치로 분류됩니다. 주기억장치는 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용되며, 대표적으로 램이 있습니다. 이와 반대로 보조기억장치는 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용됩니다. 대표적으로 하드 드라이브, SSD가 있습니다.

버스

버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말합니다. 대표적으로 데이터가 이동하는 데이터 버스. 주소를 지정하는 주소 버스, 읽기/쓰기를 제어 하는 제어 버스가 있습니다.

주기억장치와 보조기억장치가 있는데 CPU안에 다른 저장장치가 왜 필요한가요?

cpu는 굉장히 빠른 속도로 연산을 처리하는데, 이를 위해 데이터의 빠른 교환이 필요합니다.

cpu도 필요한 데이터를 빠르게 공브하고, 반출할 수 있어야 장치의 효율을 제대로 발휘할 수 있습니다. 그런데 CPU의 연산속도는 주기억장치와 보조기억장치의 데이터 교환 속도보다 압도적으로 빠르기 때문에, 이들만 사용하면 병목현상이 발생합니다. 그래서 CPU는 데이터의 교환 속도를 획기적으로 단축하기 위해 레지스터와 캐시라는 저장장치를 내부에 갖고 있습니다.

 

명령어 집합 구조

cpu가 해석하는 명령어의 집합을 의미합니다.

프로그램 코드는 기계어로 작성되어 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고, 처리합니다.

64와 32는 cpu가 한번에 처리할 수 있는 데이터의 크기입니다. cpu가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부릅니다. WORD의 크기는 cpu가 어떻게 설계됐느냐에 따라 달라집니다. 예를 들어 32비트 컴퓨터는 WORD가 32비트이다.

 

WORD가 크면 유리한 점

현대의 컴퓨터는 대부분 64비트 cpu를 사용하는데, 그 이유 중 하나는 32비트 cpu가 제공하는 가상 메모리의 크기가 작기 때문입니다. 가상 메모리는 cpu가 프로세스에게 제공하는 가상의 메모리 공간인데 32비트는 최대 4기가 바이트입니다.

1Byte = 8bit

 

레지스터

레지스터는 cpu 내부의 저장장치로, cpu가 빠르게 접근하여 사용할 수 있습니다. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됩니다. x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재합니다.

 

범용 레지스터

주용도가 있으나, 그 외 임의의 용도로도 사용될 수 있는 레지스터입니다. 이 외에도 r8, r9 ... r15 까지의 범용 레지스터가 더 존재합니다. 8바이트 저장

세그먼트 레지스터

x64 아키텍처에는 cs,ss,ds,es,fs,gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트입니다.

현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터 영역, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터입니다.

현재는 주로 메모리 보호를 위해 사용되는 레지스터이다.

 

명령어 포인터 레지스터

cpu가 어느 부분의 코드를 실행할지 가리키는 게 명령어 포인터 레지스터의 역할입니다. x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트입니다.

 

플래그 레지스터

프로세서의 현재 상태를 저장하고 있는 레지스터입니다.

플래그 레지스터는 자신을 구성하는 여러 비트들로 cpu의 현재 상태를 표현합니다.

주로 접하게 될 것들은 다음과 같습니다.

간단한 예로 a = 3, b = 5일 때, a에서 b를 빼는 연산을 하면, 연산의 결과가 음수이므로 SF가 설정됩니다. 그러면 CPU는 SF를 통해 a가 b보다 작았음을 알 수 있습니다.

 

레지스터 호환

eax는 rax의 하위 32비트를 의미합니다. 또한 ax는 eax의 하위 16비트를 가리킵니다.

'Dreamhack - Reverse Engineering' 카테고리의 다른 글

Exercise: Helloworld  (0) 2022.02.18
x86 Assembly🤖: Essential Part(2)  (0) 2022.02.18
x86 Assembly🤖: Essential Part  (0) 2022.02.18
Windows Memory Layout  (0) 2022.02.18
드림핵 리버싱  (0) 2022.02.18