[Dreamhack]- Computer Architecture

Chris Kim·2024년 9월 30일

리버싱

목록 보기
5/10

1. 컴퓨터 구조와 명령어 집합 구조

컴퓨터 구조

컴퓨터 구조는 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법이다. 여기에는 컴퓨터 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍쳐 등이 포함된다.

  • 컴퓨터 구조의 세부 분야
  1. 기능 구조의 설계
  • 폰 노이만 구조
  • 하버드 구조
  • 수정된 하버드 구조
  1. 명령어 집합구조
  • x86, x86-64
  • ARM
  • MIPS
  • AVR
  1. 마이크로 아키텍쳐
  • 캐시 설계
  • 파이프라이닝
  • 슈퍼 스칼라
  • 분기예측
  • 비순차적 명령어 처리
  1. 하드웨어 및 컴퓨팅 방법론
  • 직접 메모리 접근

폰 노이만 구조

폰 노이만은 (1) 연산, (2) 제어, (3) 저장의 세 가지 핵심기능이 컴퓨터에 필요하다고 생각했다. 이에 (1),(2)는 중앙처리장치(Central Processing Unit,CPU) 에게, (3)은 기억장치(memory) 에게 맡겼다.
CPU는 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU), 그리고 제어장치(Control Unit), 그리고 CPU에 필요한 데이터를 저장하는 레지스터(Register)로 구성된다.
대표적인 기억장치는 램(Random-Access Memory, RAM) 이다. 하지만 램은 휘발성이 강하기 때문에 우리는 보조기억장치를 사용한다.
위의 장치들 간의 신호를 전송하는 통로가 바로 버스 다. 버스에는 데이터가 이동하는 데이터 버스, 주소를 지정하는 주소 버스, 읽기/쓰기를 제어하는 제어 버스가 있다. 그 밖에도 랜선이나 데이터 전송을 목적으로 하는 소프트웨어, 프로토콜 등도 버스라 불리니 참고하자.

명령어 집합 구조

명령어 집합 구조(Instruction Set Architecture, ISA) 는 CPU가 해석하는 명령어의 집합을 의미한다. 기계어로 쓰인 이 명령어들을 CPU가 읽고 처리한다.
우리가 살펴볼 x86-64는 고성능 프로세서를 설계하기 위해 사용된다. 하지만 많은 전력소모와 발열이 발생한다. 따라서 임베디드 장비, 드론, 스마트폰에는 ARM, MIPS, AVR 프로세서등을 사용한다.

2. x86-64 아키텍쳐

x86-64 아키텍쳐란?

1999년, AMD가 인텔의 IA-32를 64비트로 확장한 AMD64 아키텍쳐를 발표했다. 이를 기반으로 다양한 아키텍쳐가 나왔고, 범용적이고 중립적으로 지칭되는 x86-64라는 명칭이 탄생하게 되었다. 더 자세한 역사는 여기에...[ https://learn.dreamhack.io/62#5 ]

n비트 아키텍쳐

여기 보면 64, 32는 CPU가 처리할 수 있는 데이터의 크기다. 이것을 WORD 라고 부르며, CPU가 이해할 수 있는 데이터의 단위다.

WORD가 크면 유리한점

가상메모리 크기의 차이 때문이다. 32비트 아키텍쳐는 4기가 바이트의 가상 메모리만을 지원하지만 64비트 아키텍쳐에서는 16엑사 바이트의 가상메모리를 제공한다.

2. x86-64 아키텍쳐: 레지스터

레지스터는 CPU 내부의 저장장치로 CPU가 빠르게 접근하여 사용할 수 있다.

범용 레지스터(General Register)

범용 레지스터는 주용도를 가지고 있으나, 그 외 임의의 용도로 사용 가능하다. x86-64 에서 각 범용 레지스터는 8바이트를 저장할 수 있고, 부호 없는 정수를 기준으로 2^64-1까지 표기 할 수 있다.

이름주용도
rax(acuumulator register)함수의 반환 값
rbx(base register)x86에서는 주된 용도 없음
rcx(counter register)반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx(data register)x86에서는 주된 용도 없음
rsi(source Index)데이터를 옮길 떄 원본을 가리키는 포인터
rdi(destination index)데이터를 옮길 때 목적지를 가리키는 포인터
rsp(stack pointer)사용중인 스택의 위치를 가리키는 포인터
rbp(stack base pointer)스택의 바닥을 가리키는 포인터

세그먼트 레지스터

x86 아키텍쳐에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재한다. 각 레지스터의 크기는 16비트다.
과거 IA-32, IA-16 시절에는 세그먼트 레지스터를 이용하여 사용 가능한 물리 메모리의 크기를 키우려 했으나, x86에서는 접근 가능한 주소 영역이 매우 크기 때문에, 이런 용도로 사용되지 않는다.
x86에서 cs, ds, ss레지스터는 코드영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되며 나머지 레지스터는 운영체제 별로 용도를 결정 할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터다.

명령어 포인터 레지스터

명령어 레지스터의 역할은 CPU가 어느 부분의 코드를 실행할 지 가리키는게 명령어 포인터 레지스터의 역할이다. x86 아키텍쳐의 명령어 레지스터는 rip 이며 크기는 8바이트다.

플래그 레지스터

플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터다. 다음은 플래그 레지스터의 여러 플래그 비트 중 일부다.
|플래그|의미|
|-|-|
|CF(Carry Flag)|부호 없는 수의 연산 결과가 비트의 범위를 넘는 경우 설정 됩니다.|
|ZF(Zero Flag)|연산의 결과가 0일 경우 설정됩니다.|
|SF(Sign)|연산의 결과가 음수일 경우 설정 됩니다.|
|OF(Overflow Flag)|부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니댜.|

x86 아키텍쳐의 플래그는 RFLAG라고 하는데 64비트이므로 64개의 플래그를 사용할 것 같지만 실제로는 오른쪽 20여개만 사용한다.

레지스터 호환

x86-64 아키텍쳐는 IA-32 64비트의 확장 아키텍쳐이므로 호환이 가능하다. 여기서의 CPU 레지스터 들은 32비트의 크기를 가지며 이들은 각각, eax, ebx, ecx, edx, esi, edi, esp, ebp 였다. 이들은 32비트를 지원하므로 64비트 레지스터의 하위 32 비트를 의미하기도 한다. 이는 다시 IA-16에서의 레지스터틀로 하위 16비트를 가리킬 수 있다.
여기서 다시 상위 8비트, 하위 8비트로 나눌 수 있다.(ax -> ah/al, bx -> bh/bl, ...

profile
회계+IT=???

0개의 댓글