혜랑's STORY

[System Hacking STAGE 2] Background: Computer Architecture 본문

무지성 공부방/Dreamhack SystemHacking

[System Hacking STAGE 2] Background: Computer Architecture

hyerang0125 2022. 1. 18. 13:19
시작하며

 컴퓨터는 각자 다른 기능을 수행하는 여러 부품들의 도움으로 작동한다. 이는 컴퓨터에 대한 기본 설계가 존재하기 때문에 가능한 일이다. 이 설계에 맞춰서 여러 하드웨어가 개발되고, 컴퓨터 과학에서는 이러한 설계를 '컴퓨터 구조(Computer Architecture)'라고 부른다. 전체적인 컴퓨터 구조 중 특히 CPU가 사용하는 명령어와 관련된 설계를 '명령어 집합구조(Instruction Set Architecture, ISA)'라고 하는데, 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍처이다.

 시스템 해킹 공부를 시작하는 시점에서 앞으로의 학습에 중요한 기초가 될 것이므로 하나 하나 살펴보도록 하자.

 

# 컴퓨터 구조와 명령어 집합 구조

1. 컴퓨터 구조(Computer Architecture)

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

  • 컴퓨터의 기능 구조에 대한 설계 ; 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야
    • 폰 노이만 구조
    • 하버드 구조
    • 수정된 하버드 구조
  • CPU의 명령어에 대한 설계 ; 명령어 집합구조(Instruction Set Architecture)로 CPU가 처리해야하는 명령어를 설계하는 분야
    • x86, x86-64
    • ARM
    • MIPS
    • AVR
  • CPU의 하드웨어적 설계 ; 마이크로 아키텍처(Micro ARchitecture)라고 불리며 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야
    • 캐시 설계
    • 파이프라이닝
    • 슈처 스칼라
    • 분기 예측
    • 비순차적 명령어 처리

 현대적 컴퓨터의 기능 구조에 큰 영향을 끼친 폰 노이만 구조명령어 집합구조(Instruction Set Architecture) 중 x86-64 아키텍처에 대해 자세히 살펴보자.

2. 폰 노이만 구조

 초기 컴퓨터 과학자 중 한명인 폰 노이만은 컴퓨터에 연산, 제어, 저장의 세 가지 핵심 기능이 필요하다고 생각했다. 근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을 위해 기억장치(memory)를 사용한다. 그리고 장치간 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다.

  • 중앙처리장치(CPU, Central Processing Unit)
    • 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌이다.
    • 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU)와 CPU를 제어하는 제어장치(Control Unit), CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성된다.
  • 기억장치(memory)
    • 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용된다. 용도에 따라 주기억장치와 보조기억장치로 분류된다.
    • 주기억장치 ; 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용됨. ex) 램(Random-Access Memory, RAM)
    • 보조기억장치 ; 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용됨. ex) 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)
  • 버스(bus)
    • 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로
    • 대표적으로 데이터가 이동하는 데이터 버스(Data Bus), 주소를 지정하는 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus)가 있다. 이 외에도 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 불린다.

3. 명령어 집합 구조(ISA, Instruction Set Architecture)

프로그램은 기계어로 이루어져 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고, 처리한다. ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재한다. 그 중 x86-64 아키텍처에 대하여 알아보자.

 x64 아키텍처는 인텔의 64비트 CPU 아키텍처이다. 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로, 대다수의 개인용 컴퓨터들이 인텔의 x64 CPU를 사용하고 있다.

n 비트 아키텍처

 CPU가 한번에 처리할 수 있는 데이터의 크기이다. 컴퓨터 과학에서는 이를 'CPU가 이해할 수 있는 데이터의 단위'라는 의미에서 WORD라고 부른다. WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라진다. 예를들어 일반적인 32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있으며, 레지스터의 용량 및 각종 버스들의 대역폭이 32비트이다. 따라서 이들로 구성된 CPU는 설계 상 32비트의 데이터까지만 처리할 수 있게된다.

 레지스터(Register)

 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소로 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다.

  • 범용 레지스터(General Register) ; 주용도는 있지만, 그 외의 다양한 용도로 사용될 수 있는 레지스터이다. x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있으며, 부호 없는 정수를 기준으로 2^64-1 까지의 수를 나타낼 수 있다.

  • 세그먼트 레지스터(Segment Register) ; cs, ss, ds, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다. 세그먼트 레지스터는 x64로 아키텍처가 확장되며 용도에 큰 변화가 생긴 레지스터이다. 현대의 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도록 제작된 세그먼트 레지스터이다.
  • 명령어 포인터 레지스터(Instruction Pointer Register, IP) ; CPU가 어느 부분의 코드를 실행할지 가리킨다. x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트이다.
  • 플래그 레지스터(Flag Register)

 프로세서의 현재 상태를 저장하고 있는 레지스터이다. x64 아키텍처에서는 REFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며 최대 64개의 플래그를 사용할 수 있다. 실제로는 20여개의 비트만 사용하며, 앞으로 주로 접하게 될 것들은 다음과 같다.

 플래스를 사용하는 간단한 예로, 3의 값을 갖는 a와 5의 값을 갖는 b가 있을 떄, a에서 b를 빼는 연산을 하면, 연산의 결과가 음수이므로 SF가 설정된다. 그러면 CPU는 SF를 통해 a가 b보다 작았음을 알 수 있다.

레지스터 호환