ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • dreamhack stage 2 - Computer Architecture
    보안/SYSTEM HACKING 2024. 3. 15. 11:44

    STAGE 2

    Computer Architecture

    Background: Computer Architecture

    0. 서론

    • 컴퓨터 구조, 명령어 집합 구조, 인텔의 x86-64에 대해 알아볼 예정
    • 컴퓨터 과학을 배워야 하는 이유

    시스템 해킹의 기술은 컴퓨터 과학에 뿌리를 두고 있다.

    • 컴퓨터는 여러 부품의 도움으로 작동한다.

    CPU: 컴퓨터의 작동에 핵심이 되는 연산 처리

    저장장치: 데이터를 저장

    GPU: 그래픽 데이터

    랜카드: 네트워크 통신

    사운드 카드: 소리 데이터 처리 ...

    --> 서로 다른 부품이 모여 기계가 작동하게 하는 것은 기본 설계가 존재하기 때문이다.

    여기에서 설계를 컴퓨터 구조(Computer Architecture) 라고 한다.

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

    : CPU 가 사용하는 명령어와 관련된 설계

    대표적인 ISA: 인텔의 x86-64 아키텍쳐


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

    • 컴퓨터 구조(Computer Architecture)

    : 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 구성하는 방법

    - 포함되는 것들:

    컴퓨터의 기능 구조에 대한 설계

    : 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능이 컴퓨터에 필요한지 고민하고 설계하는 분야

    대표적인 구조- 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조

    명령어 집합구조(Instruction Set Archiecture)

    CPU의 명령에 대한 설계

    : CPU가 처리해야하는 명령어를 설계하는 분야

    대표적인 구조 - ARM, MIPS, AVR, 인텔의 x86, 인텔의 86-64

    마이크로 아키텍쳐(Micro Architecture)

    CPU의 하드웨어적 설계

    : 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야

    • 기능 구조의 설계 - 폰 노이만 구조

    폰 노이만은 컴퓨터에 연산, 제어, 저장 이라는 핵심 기능이 필요하다고 생각했다.

    근대의 컴퓨터는 연산과 제어를 위해 중앙처리장치(CPU), 저장을 위해 기억장치(memory),

    장치 간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다.

     

    - 중앙처리장치(CPU)

    : 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌

    CPU에서 일어나는 일: 프로세스의 코드 불러오기, 실행하기, 결과를 저장하는 과정

    CPU의 구성: 산술논리장치(Arithmetic Logic Unit, ALU) - 산술/논리 연산 처리

    제어장치(Control Unit): CPU를 제어하는 장치

    레지스터(Register): CPU에 필요한 데이터를 저장

    등으로 구성된다.

    - 기억장치(memory)

    : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용

    용도에 따라 주기억장치 : 프로그램 실행과정에서 필요한 데이터를 임시로 저장하기 위해 사용

    대표적: 램(Random-Access Memory, RAM)

    보조기억장치: 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하기 위해 사용

    대표적: 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)

    - 버스

    : 컴퓨터 부품과 부품 사이/ 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로

    랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 한다.

    대표적: 데이터 버스(Data Bus) - 데이터가 이동

    주소 버스 (Address Bus) - 주소를 지정

    제어 버스 (Control Bus) - 읽기/쓰기 제어

     

    + CPU 안에 레지스터가 있는 이유: 필요한 데이터를 빠르게 공급하고 반출해야 효율을 제대로 발휘할 수 있다.

    CPU의 연산속도가 기억장치와의 데이터 교환속도보다 너무 빨라서 기억장치만

    사용하면 병목현상이 발생한다. 따라서 CPU는 교환속도를 획기적으로

    단축하기 위해 레지스터와 캐시라는 저장장치를 가지고 있다.

     

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

    : CPU가 해석하는 명령어의 집합

    프로그램은 기계어로 이루어져있고 프로그램을 실행하면 CPU가 명령어를 읽고 처리한다.

    - 다양한 ISA가 존재하는데, 이는 컴퓨팅 환경이 다양하고 컴퓨터의 연산 능력이 다르기 때문이다.

    ex. 인텔의 x86-64: 고성능 프로세서를 설계하기 위해 사용된다. 따라서 데스크톱, 랩톱에 적합하고

    임베디드 기기에게는 적합하지 않다. 임베디드 장비들은 전력 소모와 발열이 적은 ARM/ MIPS/ AVR

    프로세서를 사용한다.

    - 여기에서는 x86-64를 대상으로 한다. x86기반 CPU점유율이 압도적이기 때문이다.


    2. x86-64 아키텍처

    : 인텔의 64비트 CPU 아키텍처

    - 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에서 사용할 수 있도록 확장함

    - 대다수의 컴퓨터가 인텔의 x64 CPU 사용

    • n 비트 아키텍처

    - **비트 아키텍처에서의 숫자는 CPU가 한번에 처리할 수 있는 데이터의 크기이다.

    - WORD: CPU가 이해할 수 있는 데이터의 단위

    - WORD의 크기는 CPU의 설계에 따라 달라진다. ex. 32비트 아키텍처: 32비트까지 계산 가능..

    - WORD가 크면 유리한 점: 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없거나

    소프트웨어의 실행이 불가능한 상황이 거의 발생하지 않기 때문이다.\

    + x86-64가 여러 이름을 가진 이유는 개발 역사가 복잡하기 때문이다. amd64라는 명칭은 x86-64와 같은 아키텍처라고 생각해도 괜찮다.

    • x86-64 아키텍처: 레지스터

    레지스터: CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소

    - 용도: 산술 연산에 필요한 데이터 저장, 주소 저장, 참조 등의 용도

    x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다.

    - 범용 레지스터 (General Register)

    : 주용도는 있지만 다양한 용도로 사용될 수 있는 레지스터

    x86-64에서 각각의 범용 레지스터는 8바이트 저장 가능, 부호 없는 정수 기준 2^64-1까지의 수 나타낼 수

    있음.

    - 세그먼트 레지스터 (Segment Register)

    x64 아키텍처: cs, ss, ds, fs, gs 세그먼트 레지스터 존재, 각각 크기는 16비트

    아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터

    과거: IA-32, IA-16 - 사용가능한 물리 메모리의 크기를 키우려고 했음

    범용 레지스터의 크기가 작아 사용 가능한 메모리 주소 폭 좁음

    현대: x64 - 사용 가능한 주소 영역이 넓음

    cs, ss, ds 레지스터: 코드영역, 데이터, 스택 메모리 영역 가리킬 때 사용

    나머지: 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터

    - 명령어 포인터 레지스터 ( Instruction Pointer Register, IP )

    : CPU가 어느 부분의 코드를 실행할지 가리킨다.

    x64 아키텍처의 명령어 레지스터: rip, 크기 8바이트

    - 플래그 레지스터 ( Flag Register )

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

    x64 아키텍처: RFLAGS 라는 64비트의 플래그 레지스터 존재한다.

    최대 64개의 플래그 사용 가능하지만 20여개만 사용하고 16비트 플래그 레지스터가 확장된 것이다.

    자신을 구성하는 비트로 CPU의 현재 상태를 표현한다.

     

    • 레지스터 호환

    IA-32에서는 CPU의 레지스터들이 32비트의 크기이고 각각 명칭이 eax, ebx, ecx, edx, esi, edi, esp, ebp

    호환성을 위해 모두 x86-64에서도 사용 가능하다.

    rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 확장된 형태이다.

    + eax는 rax의 하위 32비트를 나타낸다 -> eax, ebx 등은 확장된 레지스터의 하위 32비트

    + IA-16과의 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp, ebp의 하위 16비트를 가리킨다.

    3. 결론

    범용 레지스터(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가 있다.


     

    STAGE 2

    Quiz: Computer Architecture

Designed by Tistory.