일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Variable Partition
- Whois #정보보안교육 #Ajou
- N0Named
- 사이버보안학과
- webhacking
- N0NamedWargame #mandu-mandu #forensics #left_side_B
- hackerschool
- Pwnable
- Dreamhack
- 운영체제
- Whois #정보보안교육 #AjouUniv #Pwnable
- ftz
- N0NamedWargame #AjouUniv #mandu-mandu #forensics
- AjouUniv #SuniNatas #Web
- Whois #정보보안교육 #webhacking.kr
- SuNiNaTaS #mandu-mandu #AjouUniv #forensics
- AjouUniv #Whois #정보보안교육 #Pwnable
- 아주대학교 #Whois #정보보안교육 #4주차
- Whois #AjouUniv #정보보안교육 #Pwnable
- 아주대학교
- 코딩도장
- 스케줄링
- HackCTF
- Allocation Starategy
- systemhacking
- python
- N0NamedWargame #mandu-mandu #forensics #길에서주어온만두
- AjouUniv #Whois #Reversing
- AjouUniv #Whois #정보보안교육
- Memory Virtualization
- Today
- Total
chipkkang9's story
[컴퓨터 구조] 21세기 컴퓨터의 구조(CPU 위주의 구조) 본문
21세기 현대의 모든 컴퓨터는 '폰 노이만(Von Neumann) 구조'로 이루어져 있다.
아마 어느 나라에서나, 어느 학교에서나 컴퓨터 구조를 배우게 된다면 가장 처음 듣게 될 말일 것이다.
폰 노이만 구조라고 해서 기겁할 수 있겠지만, 오히려 단순한 구조로 우리가 내리는 명령을 처리한다고 생각하면 된다.
바로 중앙처리장치(CPU; Central Processing Unit), 기억 장치(Memory), 주변 입출력 장치(Input/Output device)의 구조이다.

🧠 중앙처리장치(CPU)란?
CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 이른바 '컴퓨터의 두뇌'와 같은 역할을 한다.
프로세스(실행되는 프로그램(.exe 파일)의 분신)의 코드를 불러오고, 실행하고, 결과를 저장하는 모든 과정이 CPU에서 일어난다.
CPU는 산술/논리 연산을 처리하는 산술논리장치(Arithmetic Logic Unit, ALU)와 CPU를 제어하는 제어장치(Control Unit), CPU에 필요한 데이터를 저장하는 레지스터(Register) 등으로 구성된다.
💾 기억장치(Memory)란?
Memory는 컴퓨터가 동작하는 데 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류된다.
주기억장치는 프로그램 실행 과정에서 필요한 데이터들을 임시로 저장하기 위해 사용되며, 대표적으로 RAM(Random-Access Memory)이 있다.
보조기억장치는 운영체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용되며, 대표적으로 HDD(Hard Disk Drive), SSD(Solid State Drive)가 있다.
🚌 버스(Bus)란?
버스는 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로를 말한다.
대표적으로 데이터가 이동하는 데이터 버스(Data Bus), 주소를 지정하는 주소 버스(Address Bus), 읽기/쓰기를 제어하는 제어 버스(Control Bus)가 있다.
이외에도, 랜선이나 데이터 전송 소프트웨어, 프로토콜 등도 버스라고 불린다.
CPU는 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리로부터 읽어오고, Instruction Set Architecture(ISA)에 따라 이를 처리하는 구조인 것이다.
그리고 해당 연산의 결과를 다시 메모리에 적재한다.
위 구조에서도 중요한 것이 CPU와 Memory인데, Memory에 대한 처리 로직은 현재 듣고 있는 운영 체제 수업에서 더 공부한 다음 추가하는 것으로 하고 우선은 CPU를 먼저 자세히 들여다보도록 하겠다.
명령어 집합 구조(ISA, Instruction Set Architecture) : x86-64 Architecture
명령어 집합 구조는 CPU가 해석하는 명령어의 집합을 말한다.
프로그램은 모두 기계어로 이루어져 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고 처리하는 것이다.
ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재한다.
ISA가 다양하게 개발되고 사용되는 이유는, 모든 컴퓨터가 동일한 수준의 연산을 요구하지 않으며, 컴퓨팅 환경도 다양하기 때문이다.
그 중에서도 x86-64 구조는 Intel의 64bit-CPU 아키텍처를 말하는 것이다.
쉽게 말해서 64bit라는 뜻은, CPU가 한 번에 처리할 수 있는 데이터의 크기가 64bit(8byte)라는 것이다.
32bit-CPU 아키텍쳐라면? 마찬가지로 CPU가 한 번에 처리할 수 있는 데이터의 크기가 32bit(4byte)라는 것이다.
Computer Science에서 CPU가 이해할 수 있는 데이터의 단위로 WORD라고 부른다.
현재 WORD의 크기는 2byte, 32bit-CPU부터 사용되는 단위인 DWORD는 4byte, 64bit-CPU에서는 QWORD, 8byte로 쓰인다.
WORD라는 단위가 클수록 유리한 점은 현대 PC에서 지원하는 프로그램의 가상 메모리의 크기도 커지는 데에 유리하기 때문이다.
이론상 64bit-CPU에서는 16EB(2^60 byte)의 가상 메모리를 제공할 수 있다. (어마어마하게 크다)
Register(레지스터)
레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이며, 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등의 용도로 사용된다.
x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register)가 존재한다.
🌏 범용 레지스터(General Register)란?
각각의 주용도가 정해져 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터이다.
x86-64에서 각각의 범용 레지스터는 8byte를 저장할 수 있으며, 2^64-1까지의 수를 나타낼 수 있다.
자주 쓰이는 범용 레지스터의 용도는 다음과 같으며, 이 외에도 r8, r9, ... , r15까지 존재한다.
이름 | 주용도 |
rax (accumulator register) | 함수의 반환 값 |
rbx (base register) | x64에서는 주된 용도 없음 |
rcx (counter register) | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
rdx (data register) | x64에서는 주된 용도 없음 |
rsi (source index) | 데이터를 옮길 때 원본을 가리키는 포인터 |
rdi (destination index) | 데이터를 옮길 때 목적지를 가리키는 포인터 |
rsp (stack pointer) | 사용 중인 스택의 위치를 가리키는 포인터 |
rbp (stack base pointer) | 스택의 바닥을 가리키는 포인터 |
📁 세그먼트 레지스터(Segment Register)란?
x64 기준, cc, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하고, 각 레지스터의 크기는 16bit이다.
세그먼트 레지스터는 x64로 아키텍쳐가 확장되며 용도에 큰 변화가 생긴 레지스터이다.
현대 x64에서 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다.
☝️ 명령어 포인터 레지스터(Instruction Pointer Register)란?
프로그램은 일련의 기계어 코드로 이루어져 있다.
이 중에서 CPU가 어느 부분의 코드를 실행할 지 가리키는게 명령어 포인터 레지스터의 역할이다.
x64 아키텍쳐의 명령어 레지스터는 rip이며, 8byte 크기이다.
🚩 플래그 레지스터(Flag Register)란?
플래그 레지스터는 프로세스의 현재 상태를 저장하는 레지스터이다.
x64 아키텍처에서는 RFLAGS라고 불리는 64bit 크기의 플래그 레지스터가 존재하며, 과거 16bit 플래그 레지스터의 확장형이다.
RFLAGS는 64bit이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 20여개의 bit만 사용한다.
깃발을 올리고, 내리는 행위로 신호를 전달하듯, 구성된 비트들로 CPU의 현재 상태를 표현한다.

그 중에서도 아래의 4bit를 주로 많이 사용한다.
플래그 | 의미 |
CF (Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정된다. |
ZF (Zero Flag) | 연산의 결과가 0일 경우 설정된다. |
SF (Sign Flag) | 연산의 결과가 음수일 경우 설정된다. |
OF (Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정된다. |
레지스터 호환성
특히 아이폰 유저라면 공감할 상황인데, iPhone 20이 출시되었는데 혁신이랍시고 iCloud 기술 등등을 갈아엎고 새로운 스타일을 내놓았다고 치자. 그러면 애플을 좋아하는 나라도... 20은 구매하지 않을 것 같다.
바로 '호환성'이 떨어지는 것이다. 레지스터도 마찬가지이다. Intel도 32bit-CPU에서 개발된 프로그램이 64bit-CPU에서 돌아가지 않을 경우에 사용하는 고객이 떨어질 것을 우려하여 '레지스터 호환성'을 고려하였다.
Intel 32bit-CPU(IA-32) 아키텍처에서 레지스터들은 32bit 크기를 가지며, 이들 명칭은 eax, ebx, ecx, edx, esi, edi, esp, ebp였다.
호환성을 위해 이 레지스터들은 x86-64에서도 그대로 사용이 가능하다.
x64의 범용 레지스터가 이들의 확장된 형태이며, eax, ebx 등은 확장된 레지스터의 하위 32bit를 가리킨다.
예를 들어, eax는 rax의 하위 32bit와 같은 것을 의미한다.
같은 맥락으로 IA-16과의 호환을 위해 ax, bc, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp, ebp의 하위 16bit를 가리킨다.
백문의불여일견이라고, 그림으로 표현하면 아래와 같다.

출처 : DreamHack - SystemHacking(Computer Architecture)
https://dreamhack.io/lecture/courses/43
Background: Computer Architecture
컴퓨터 구조 및 명령어 집합 구조에 대해 간단히 설명하고, 커리큘럼이 대상으로 하는 인텔 x86-64 아키텍처에 대해 살펴봅니다.
dreamhack.io
'Study > Computer Science' 카테고리의 다른 글
[운영체제] 3. Memory Virtualization - (1) Address Spaces ② (0) | 2023.06.14 |
---|---|
[운영체제] 3. Memory Virtualization - (1) Address Spaces ① (0) | 2023.06.13 |
[운영체제] Process Scheduling 방법 정리(2) - Priority, PIP, PCP (3) | 2023.06.06 |
[운영체제] Process Scheduling 방법 정리 (1) - FCFS, SJF, STCF, RR (0) | 2023.05.06 |