Background : Computer Architecture

·2023년 1월 12일
0

System Hacking

목록 보기
3/10

컴퓨터 구조
: 컴퓨터 구조와 명령어 집합 구조, 그리고 인텔 x86-64에 대한 대략적 이해

컴퓨터 구조 (Computer Architecture)

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

  • 컴퓨터 기능 구조에 대한 설계
    - 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야
    ex) 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조

  • 명령어 집합 구조 (Instruction Set Architecture)
    - CPU가 처리해야하는 명령어를 설계하는 분야
    ex) ARM, MIPS, AVR, 인텔의 x86 및 x86-64

  • 마이크로 아키텍처 (Micro Architecture)
    - 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

[폰 노이만 구조] : 연산, 제어, 저장 - 컴퓨터 기능 구조에 대한 설계

  1. 중앙처리장치(Central Processing Unit, CPU) : 연산, 제어
    CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌
    프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 일어남
    1) 산술논리장치(Arithmetic Logic Unit, ALU) - 산술/논리 연산 처리
    2) 제어장치(Control Unit) - CPU 제어
    3) 레지스터(Register) - CPU에 필요한 데이터를 저장

  2. 기억장치(memory) : 저장
    컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류됨
    1) 주기억장치 - 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용
    ex) 램(Random-Access Memory, RAM)
    2) 보조기억장치 - 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용
    ex) 하드 드라이브(Hard Disk Drive, HDD), SSD(Solid State Drive)

  3. 버스(bus) : 장치간에 데이터나 제어 신호를 교환할 수 있도록 하는 전자 통로
    ex) 데이터 버스(Data Bus), 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus), 랜선이나 데이터 전송 소프트웨어, 프로토콜 등

기억장치가 있는데 CPU 안에 레지스터가 왜 필요?

  • CPU는 굉장히 빠른 속도로 연산을 처리하는데, 이를 위해 데이터의 빠른 교환이 필요
  • CPU의 연산속도가 기억장치와의 데이터 교환속도보다 압도적으로 빠르기 때문에, 기억장치만을 사용하면 병목현상이 발생함
  • 따라서 CPU는 교환속도를 획기적으로 단축하기 위해 레지스터와 캐시라는 저장장치를 내부에 갖고 있음

[x64 아키텍처] : 레지스터 - 명령어 집합 구조

명령어 집합 구조 (ISA) : CPU가 해석하는 명령어의 집합

  • 인텔의 x86-64 - 고성능 프로세서, 많은 전력 소모, 높은 발열 ex) 데스크톱
    x64 아키텍처 = 인텔의 64비트 CPU 아키텍처, 대다수 개인용 컴퓨터 사용
    64는 CPU 가 한 번에 처리할 수 있는 데이터의 양을 말함 -> WORD
  • 위 이유로 전력 소모와 발열이 적은 ARM, MIPS, AVR 주로 사용
    ex) 작은 임베디드 기기 (공유기, 스마트폰)

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

1) 범용 레지스터(General Register) : 8 byte

  • rax(accumulator) : 함수의 반환 값
  • rbx(base) : 주된 용도 없음
  • rcx(counter) : 반복문의 반복 횟수, 각종 연산의 시행 횟수
  • rdx(data) : 주된 용도 없음
  • rsi(source index) : 데이터를 옮길 때 원본 포인터
  • rdi(destination index) : 데이터를 옮길 때 목적지 포인터
  • rsp(stack pointer) : 사용중인 스택의 위치 포인터
  • rbp(stack base pointer) : 스택의 바닥 포인터

2) 세그먼트 레지스터(Segment Register) : 2 byte (16 bit)

  • cs, ds, ss : 코드, 데이터, 스택 메모리 영역을 가리킬 때 사용
  • es, fs, gs : 운영체제 별로 용도를 결정

3) 명령어 포인터 레지스터(Instruction Pointer Register, IP) : 8 byte

  • rip : CPU가 어느 부분의 코드를 실행할 지 가리키는 포인터

4) 플래그 레지스터(Flag Register) : 64 bit (실제로는 20여개 비트만 사용)

  • CF(Carry) : 부호 없는 수의 연산에서 연산 결과가 비트 범위를 넘을 경우
  • ZF(Zero) : 연산 결과가 0일 경우
  • SF(Sign) : 연산 결과가 음수일 경우
  • OF(Overflow) : 부호 있는 수의 연산에서 연산 결과가 비트 범위를 넘을 경우

    레지스터 호환
    < 16진수 8자리 >
    상위 32비트 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp
    하위 32비트 eax, ebx, ecx, edx, esi, edi, esp, ebp
    < 16진수 4자리 >
    상위 16비트 eax, ebx, ecx, edx, esi, edi, esp ,ebp
    하위 16비트 ax, bx, cx, dx, si, di, sp, bp
    < 16진수 2자리 >
    상위 8비트 / 하위 8비트 - ah/al, bh/bl, ch/cl, dh/dl

| rax (32) | eax (32) |
---------- | eax (16) | ax (16) |
--------------------- | ah (8) | al (8) |

0개의 댓글