컴퓨터 구조

Computer Science/OS

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

컴퓨터 구조(Computer Architecture)

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

 

 

1. 기능 구조에 대한 설계

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

2. CPU의 명령어에 대한 설계

명령어 집합구조(Instruction Set Architecture, ISA)라고 불리며, CPU가 처리해야하는 명령어를 설계하는 분야이다. 대표적으론 ARM, MIPS, AVR, 인텔의 x86-64 등이 있다.

3. CPU의 하드웨어적 설계

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

 

 

 

 

 

 

 

폰 노이만 구조와 명령어 집합 구조

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

 

 

중앙처리장치(CPU)

프로그램의 연산을 처리하고 시스템을 제어하는 컴퓨터의 두뇌이다. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 CPU에서 일어난다. CPU는 산술/논리 연산을 처리하는 산술논리장치(ALU)와 제어장치(Control Unit), CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성된다.

 

기억장치(Memory)

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

 

버스(Bus)

컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말한다. 대표적으로 데이터가 이동하는 데이터 버스, 주소를 지정하는 주소 버스, 읽기/쓰기를 제어하는 제어 버스가 있다. 이 외에도 랜선이나 데이터 전송을 목적으로 하는 소프트웨어, 프로토콜 등도 버스라고 불린다.

폰 노이만 구조

 

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

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

 

 

명령어 집합 구조(x86-64 Architecture)

명령어 집합 구조(Instruction Set Architecture, ISA)란 CPU가 해석하는 명령어의 집합을 의미한다. 프로그램의 코드는 기계어로 작성되어 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고 처리한다.

ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재한다. 이렇게 다양한 ISA가 개발되고 사용되는 이유는 모든 컴퓨터가 동일한 수준의 연산능력을 요구하지 안으며, 컴퓨팅 환경도 다양하기 때문이다.

 

 

 

x86-64 Architecture

x64 Architecture는 인텔의 64비트 CPU 아키텍쳐이다. 인텔의 32비트 CPU 아키텍쳐인 IA-32를 64비트 환경에서 사용할 수 있도록 확장한 것으로 대부분의 PC는 인텔의 x64 CPU를 사용하고 있다.

 

n 비트 아키텍져

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

 

WORD가 크면 유리한 점

현대의 PC는 대부분 64비트 아키텍쳐의 CPU를 사용하는데, 그 이유 중 하나는 32비트 아키텍쳐의 CPU가 제공할 수 있는 가상메모리(Virtual Memory)의 크기가 작기 때문이다. 가상메모리는 CPU가 프로세스에게 제공하는 가상의 메모리 공간인데, 32비트 아키텍쳐에서는 4기가 바이트가 최대로 제공 가능한 가상메모리의 크기이다. 따라서 많은 메모리 자원을 소모하는 전문 소프트웨어나 고사양의 게임 등을 실행할 때는 부족할 수 있다.

하지만 64비트 아키텍쳐에서는 이론상 16엑사 바이트의 가상메모리를 제공할 수 있다. 일반적으론 이 용량을 완전히 사용할 수 없기 때문에 가용한 메모리 자원이 부족해서 소프트웨어의 최고 성능을 낼 수 없다거나 소프트웨어의 실행이 불가능한 상황은 거의 발생하지 않는다.

 

 

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

레지스터는 CPU 내부의 저장장치로, CPU가 빠르게 접근하여 사용할 수 있다. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다. x64아키텍쳐에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP) 그리고 플래그 레지스터(Flag Register)가 존재한다.

 

범용 레지스터

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

범용 레지스터들의 용도

세그먼트 레지스터

x64 아키텍쳐에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다. 세그먼트 레지스터는 x64로 아키텍쳐가 확장되면서 용도에 큰 변화가 생긴 레지스터이다.

과거 IA-32, IA-16에서는 세그먼트 레지스터를 이용하여 사용 가능한 물리 메모리의 크기를 키우려고 시도했었다. 예를 들어 IA-16에서 어떤 주소를 cs:offset라고 한다면, 실제로는 cs<<4 + offset의 주소를 사용하여 16비트 범위에서 접근할 수 없는 주소에 접근할 수 있었다. 당시엔 범용 레지스터의 크기가 작아서 사용 가능한 메모리의 주소 폭이 좁았지만, x64에서는 사용 가능한 주소 영역이 굉장히 넓기 때문에 이런 용도로는 거의 사용되지 않는다.

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

 

명령어 포인터 레지스터

프로그램의 코드는 기계어로 작성되어 있는데 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는게 명령어 포인터 레지스터의 역할이다. x64 아키텍쳐의 명령어 레지스터는 rip이며, 크기는 8바이트이다.

 

플래그 레지스터

프로세서의 현재 상태를 저장하고 있는 레지스터이다. x64 아키텍쳐에서는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재하며, 과거 16비트 플래그 레지스터가 확장된 것이다. 깃발을 올리고 내리는 것과 같이 CPU의 현재 상태를 표현한다.

플래그 레지스터의 여러 플래그 비트들
RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 오른쪽의 20여개의 비트만 사용한다.

 

레지스터 호환

x86-64 아키텍쳐는 IA-32의 64비트 확장 아키텍쳐이며, 호환이 가능하다. IA-32에서 CPU의 레지스터들을 32비트 크기를 가지며, 이들의 명칭은 eax, ebx, ecx, edx, esi, edi, esp, ebp이다. 이것들은 호환성을 위해 x86-64에서도 그대로 사용이 가능하다.

앞에 나온 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장된 형태이며 eax, ebx 등은 확장된 레지스터의 하위 32비트를 가르킨다. 예를 들어 eax는 rax의 하위 32비트를 의미한다. 또한 과거 16비트 아키텍쳐인 IA-16과의 호환을 위해 ax, bx 등은 eax, ebx 등의 하위 16비트를 가르킨다.

x86-64의 레지스터

 

 

정리

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

'Computer Science > OS' 카테고리의 다른 글

Windows Memory Layout  (0) 2023.03.27
Binary  (0) 2023.03.27
'Computer Science/OS' 카테고리의 다른 글
  • Windows Memory Layout
  • Binary
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (68)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (14)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (3)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리버싱 핵심원리
    dreamhack.io
    x64dbg
    n^2 배열 자르기
    PE header
    12033
    자료구조
    9421
    19622
    21278
    Spring boot
    bean
    DP
    Reversing
    HTTP
    15973
    servlet
    2539
    16946
    서버 증설 횟수
    프로그래머스
    13265
    소수상근수
    백준
    DB
    Lena tutorial
    리버싱
    Header
    레나 튜토리얼
    n+1
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
컴퓨터 구조
상단으로

티스토리툴바