Skip to content

Commit

Permalink
updated
Browse files Browse the repository at this point in the history
  • Loading branch information
yulmwu committed Oct 24, 2024
1 parent 82affcc commit b2f348b
Show file tree
Hide file tree
Showing 70 changed files with 4,076 additions and 2 deletions.
Binary file modified .DS_Store
Binary file not shown.
47 changes: 47 additions & 0 deletions _posts/computer/2023-03-07-x86-64-arm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
title: x86, x86_64, EM64T 그리고 ARM 간단 요약
description: What is the difference between x86, x86_64, EM64T and ARM?
author: ky0422
date: 2023-03-07 22:53:00 +0900
categories: ["컴퓨터", "하드웨어"]
tags: ["컴퓨터", "하드웨어", "CPU", "x86", "x86_64", "EM64T", "ARM"]
_tistory: https://ky0422.tistory.com/52
---

## x86 (80386, 80586, 80686)

i386 (80386) 이전엔 16비트였으나, i386에서 32비트로 확장되었으며, 16비트 또한 호환되었기 때문에, x86은 인텔이 개발한 마이크로 프로세서 계열이거나, 이들과 호환이 가능한 명령 집합을 의미합니다.

x86은 8086 CPU (x86_16), 즉 인텔이 처음 개발한 8086 부터 후속작인 80386 등의 뒤에 붙은 이름인 x86을 뜻합니다.

80286 또한 x86이 붙으나, 이는 16비트이기 때문에 x86_16이라는 이름이 붙여집니다.

물론 x86(32비트)는 x86_16(16비트)와 호환됩니다. 때문에 x86라는 이름이 붙게 됩니다.

## x86_64 (AMD64)

AMD는 x86과 호환되는 64비트 아키텍쳐를 개발하게 됩니다. 흔히 x86_64라 불리며, x64라 불리기도 합니다.

그리고 인텔에서 x86_64 구조를 구현하여 EM64T를 개발하게 됩니다.

## EM64T

인텔 또한 64비트 아키텍쳐의 프로세스가 존재합니다.

두 종류의 64비트 프로세서가 존재하는데, 바로 Itanium 계열과 EM64T 계열입니다.

Itanium 계열은 HP와 공동개발한 IA-64 프로세서를 구현한 아키텍쳐인데, 기존의 x86과는 구조가 다르기 때문에 기존의 32비트 프로그램을 실행하기 위해선 에뮬레이터가 따로 필요합니다.

반면 EM64T 계열은 AMD에서 개발한 x86_64 구조를 가져와서 구현한 계열입니다. 때문에 기존의 32비트 프로그램과 호환이 가능합니다.

AMD의 x86_64 구조를 구현한것이기 때문에, 아키텍쳐상의 차이는 거의 없다고 봐도 됩니다.

## ARM (ARMv8, AArch64)

Arm Limited라는 곳에서 만들어진 명령 집합입니다.

원랜 ARMv7라는 32비트 아키텍쳐가 존재하나, 이 시기 이미 x86의 시대가 와버렸고, ARM 또한 ARMv8이라는 64비트 아키텍쳐를 개발하게 됩니다.

ARM 아키텍쳐는 임베디드에 사용되기도 합니다.

AMD나 인텔처럼 이름이 여러개가 있다싶이, ARM 또한 ARM64 = ARMv8 = AArch64 라고 생각하시면 됩니다.
80 changes: 80 additions & 0 deletions _posts/computer/2023-03-12-register.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
title: 레지스터
description: What is register? (types of register)
author: ky0422
date: 2023-03-12 21:54:00 +0900
categories: ["컴퓨터", "레지스터"]
tags: ["레지스터", "컴퓨터", "CPU", "Register"]
_tistory: https://ky0422.tistory.com/54
---

## 개요

임시적로 필요한 데이터를 메모리에 저장하기엔 비효율적입니다.
때문에 CPU 내부에 임시적으로 데이터를 저장할 수 있는 메모리가 있으며, 이곳이 바로 **레지스터**(Register)입니다.

주로 연산을 하기 위해 메모리에서 가져온 데이터나 데이터를 임시로 보관하거나, 주소를 저장하기 위해 쓰입니다.
데이터 임시 보관만 하는건 아닌데, 여러가지 레지스터의 종류에 대해 알아보겠습니다.

아래에서 설명하는 레지스터는 통상적으로 불리는 이름들이며, 각각의 아키텍처에 따라 EAX (Extended Accumulator Register)와 같이 다른 이름으로 불릴 수 있습니다.

---

## 데이터 레지스터 (DR, Data Register)

위에서 설명한대로 메모리에서 가져온 데이터를 임시적으로 저장할때 쓰이는 레지스터입니다.

아래의 주소 레지스터와 더불어 **일반 레지스터**라 부릅니다.

## 프로그램 카운터 (PC, Program Counter)

CPU가 다음 명령어를 실행하기 위해, 다음 명령어의 주소를 기억하고, 명령어의 흐름을 제어하는 레지스터입니다.

CPU는 이 레지스터에 저장된 주소를 참조하여 다음 명령어를 실행합니다.

명렁어 포인터(Instruction Pointer)라고도 불립니다.

## 명령어 레지스터 (IR, Instruction Register)

현재 실행중인 명령어를 임시적으로 저장하는 용도입니다. 제어장치가 이 레지스터에 저장된 명령어를 해석하고 처리합니다.

## 메모리 주소 레지스터 (MAR, Memory Address Register)

CPU가 메모리에 접근하기 위해, 메모리 주소를 임시적으로 저장하는 용도입니다.

CPU와 메모리 간의 상호작용을 위해 쓰입니다.

## 메모리 버퍼 레지스터 (MBR, Memory Buffer Register)

메모리와 CPU 간의 데이터 전송을 담당하는 레지스터입니다.
메모리로 부터 읽은 데이터를 임시적으로 저장하거나, 메모리에 쓰기 위해 CPU에서 데이터를 임시적으로 저장하는 용도로 쓰입니다.

때문에 성능에 영향을 미치는 레지스터입니다.

## 프로그램 상태 레지스터 (PSR, Program Status Register)

프로세서의 실행 상태 등을 저장하는 레지스터입니다.

프로세서를 제어하기 위한 레지스터로, 이또한 중요한 레지스터입니다.

## 누산기 레지스터 (AC, Accumulator Register)

ALU는 덧셈, 뺄셈, 곱셈 등의 연산을 수행하는 연산 장치인데, 이 레지스터는 ALU의 연산 결과를 임시적으로 저장하는 용도입니다.

AC는 CPU에서 매우 중요한 역할을 하며, CPU의 성능을 결정하는 요소 중 하나입니다.

---

## 범용 레지스터

데이터와 주소 모두 저장 가능한 레지스터로, 이름 그대로 범용적으로 사용할 수 있는 레지스터입니다.

DR, MAR 등이 여기에 포함됩니다.

## 특수 레지스터

프로그램의 상태 등을 저장하는 레지스터로, PC, PSR 등이 여기에 포함됩니다.

---

이밖에도 IO 주소 레지스터(입출력 장치의 주소), IO 버퍼 레지스터(입출력 장치에 대한 버퍼) 등의 레지스터가 존재하지만, 이는 나중에 따로 설명하겠습니다.
68 changes: 68 additions & 0 deletions _posts/computer/2023-05-05-memory.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
---
title: 메모리의 종류
description: What is memory? (types of memory)
author: ky0422
date: 2023-05-05 16:30:00 +0900
categories: ["컴퓨터", "메모리"]
tags: ["컴퓨터", "메모리", "Memory"]
---

## 개요

많은 종류의 메모리가 존재하는데, 크게 읽기/쓰기가 가능한 **RAM**(Random Access Memory)과 읽기만, 가능한 **ROM**(Read Only Memory)으로 나뉩니다.

## RAM (Random Access Memory)

일반적으로 컴퓨터에서 사용하는 메모리로, Random Access는 어떠한 데이터를 읽어도 위치에 상관없이 같은 속도로 읽을 수 있다는 의미입니다.

여기서 말하는 램은 제1차 저장 장치이며, SSD나 HDD와 같은 저장 장치는 제2차 저장 장치입니다.

**휘발성 메모리**(Volatile Memory)와 **비휘발성 메모리**(Non-Volatile Memory)로 나뉩니다.

휘발성 메모리에는 크게 **DRAM**(Dynamic RAM)과 **SRAM**(Static RAM)이 있으며, 비휘발성 메모리에는 **FRAM**(Ferroelectric RAM), **PRAM**(Phase change RAM), **MRAM**(Magnetoresistive RAM), **플래시 메모리**(Flash Memory) 등이 있습니다.

### DRAM (Dynamic RAM)과 SRAM (Static RAM)

**DRAM**에 저장된 데이터는 일정 시간이 지나면 데이터가 사라지기 때문에, 주기적으로 데이터를 갱신해줘야 합니다.

반면 **SRAM**은 전력이 공급되는 한 데이터가 사라지지 않습니다. SRAM은 내부 구조가 복잡하여 가격은 비싸지만, 속도가 빠르기 때문에 캐시 메모리 등의 고속 메모리로 사용되고, DRAM은 일반적인 메모리에 사용됩니다.

즉, 일반적으로 컴퓨터 부품에서 "램"이라고 불리는 장치는 DRAM입니다.

### 플래시 메모리 (Flash Memory)

일반적으로 가장 널리 사용되는 비휘발성 메모리로, 대부분의 SSD, USB 등에서 사용됩니다.

단, 플래시 메모리의 소자는 많이 사용할 수록 소모되기 때문에, 플래시 메모리는 한정된 수명을 가지고 있습니다.

바이오스 등의 펌웨어가 저장되는 메모리로도 사용됩니다.

### FRAM (Ferroelectric RAM), PRAM (Phase change RAM)과 MRAM (Magnetoresistive RAM)

셋 모두 차세대 메모리로, 발전중에 있는 메모리입니다.

**FRAM**[강유전체](https://ko.wikipedia.org/wiki/%EA%B0%95%EC%9C%A0%EC%A0%84%EC%B2%B4)라는 물질을 사용하는 메모리로, 저전력으로 동작하나, 내구성이 떨어지는 단점이 있습니다.

**PRAM**[상변화](https://ko.wikipedia.org/wiki/%EC%83%81%EC%A0%84%EC%9D%B4)를 이용한 메모리로, 가장 빠르게 발전하고 있는 메모리입니다. 단점으론 쓰는 속도가 느리다는 점이 있습니다.

**MRAM**[자기저항](https://ko.wikipedia.org/wiki/%EC%9E%90%EA%B8%B0%EC%A0%80%ED%95%AD)을 이용한 메모리로, 내구성이 뛰어나지만 상대적으로 비싸다는 단점이 있습니다.

## ROM (Read Only Memory)

램과 다르게 한번 저장된 데이터는 수정할 수 없는 메모리입니다. 때문에 변경 가능성이 없는 소프트웨어 등에서 사용됩니다.

ROM은 크게 **PROM**(Programmable ROM), **EPROM**(Erasable PROM), **마스크 ROM**(Mask ROM)으로 나뉩니다.

### PROM (Programmable ROM)

처음엔 빈 상태로 제공되며, 사용자가 PROM Writer라는 장치를 이용하여 단 1번 데이터를 쓸 수 있습니다.

### EPROM (Erasable PROM)

PROM과 달리, EPROM은 데이터를 여러번 저장할 수 있습니다. 데이터를 수정할 때 EPROM Eraser라는 장치를 이용하여 데이터를 지우고 다시 써야 합니다.

내용을 어떻게 지우는지에 따라 **UVEPROM****EEPROM**으로 나뉩니다.

### 마스크 ROM (Mask ROM)

제조 과정에서부터 프로그램화가 된 ROM으로, 사용자가 데이터를 변경할 수 없습니다
89 changes: 89 additions & 0 deletions _posts/computer/2023-06-06-interrupt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
title: 인터럽트
description: What is interrupt?
author: ky0422
date: 2023-06-06 12:00:00 +0900
categories: ["컴퓨터", "CPU"]
tags: ["컴퓨터", "CPU", "인터럽트"]
---

# 개요

프로그래밍을 하다보면, 가끔 **인터럽트(Interrupt)**라는 용어가 등장합니다.
이 글에선 인터럽트가 무엇이며, 어떻게 동작하는지 알아보겠습니다.

# 인터럽트

인터럽트는 명령어 사이클 중에 발생하는데, CPU가 급하게 처리해야 하는 일이 생겼을 때, 현재 작업을 중단하고 다른 작업을 처리하고자 할 때 발생합니다.

> **명령어 사이클**
>
> CPU가 명령어를 실행하는 과정을 명령어 사이클이라고 합니다.
>
> ```
> |-------------|
> /--> | Fetch Cycle | -->\
> / |-------------| \
> |-----------------| ^ | |----------------|
> | Interrupt Cycle | | | | Indirect Cycle |
> |-----------------| | v |----------------|
> \ |---------------| /
> \<-- | Execute Cycle | <--/
> |---------------|
> ```
>
> **Fetch Cycle (인출 사이클)**는 명령어를 읽어오는 과정이며 (`fetch`), **Execute Cycle (실행 사이클)**은 명령어를 해독하고 실행하는 과정입니다. (`decode`, `execute`) 이 두 과정이 기본 사이클이며, 명령어를 실행중에 메모리 접근이 추가적으로 필요할 경우 **Indirect Cycle (간접 사이클)**이 추가됩니다.
>
> 여기에 후술할 인터럽트가 발생한다면, **Interrupt Cycle (인터럽트 사이클)**이 추가됩니다.
{: .prompt-info }
인터럽트는 크게 **동기 인터럽트**와 **비동기 인터럽트**로 나뉩니다.
## 동기 인터럽트
**예외**라고도 불리며, 명령어를 실행하는 과정에서 발생하는 인터럽트입니다.
예를 들어 0으로 나누는 연산을 수행하려고 할 때(Division by Zero), 동기 인터럽트가 발생합니다.
이때 **폴트(Fault)**, **트랩(Trap)**, **중단(Abort)**, **소프트웨어 인터럽트** 등으로 나뉩니다.
- **폴트(Fault)**: 잘못된 명령어나 데이터 접근 등의 오류로 인해 발생합니다. 이 경우 예외 처리를 통해 방지할 수 있습니다.
- **트랩(Trap)**: 의도적으로 발생시키는 인터럽트입니다. 예를 들어, 디버깅을 위해 의도적으로 트랩을 발생시킬 수 있습니다.
- **중단(Abort)**: 프로그램을 강제로 종료시키는 인터럽트입니다.
- **소프트웨어 인터럽트**: 프로그램이 명시적으로 요청한 인터럽트입니다. 예를 들어, 시스템 콜 등이 있습니다.
## 비동기 인터럽트
**하드웨어 인터럽트**로도 불리며, 주로 입출력 장치 등의 외부 장치에 의해 인터럽트입니다.
키보드로 예를 들면, 어떠한 키를 눌렀을 때, 키보드가 CPU에게 인터럽트를 발생시킵니다.
다른 예로, 프린터가 출력을 완료했을 때, 프린터가 CPU에게 인터럽트를 발생시킵니다.
프린터기는 CPU의 처리 속도에 비해 훨씬 느리기 때문에, 프린터가 출력을 완료했을 때 CPU가 프린터의 출력을 기다리는 것은 비효율적입니다.
그렇기에, 인터럽트를 통해 효율적으로 작업을 처리할 수 있습니다.
만약 인터럽트가 없다면, 주기적으로 확인하는 등의 방법으로 작업을 처리해야 합니다.
# 인터럽트 처리
인터럽트는 주로 아래와 같은 순서로 처리됩니다.
1. CPU에게 **인터럽트 요청 신호**를 보냅니다.
2. CPU는 하나의 명령어 사이클이 끝나고, 명령어를 인출하기 전에 인터럽트 요청 신호를 확인합니다.
3. 만약 인터럽트 요청이 확인됐다면, **인터럽트 플래그** 레지스터를 통해 인터럽트를 받아들일지 말지 결정합니다.
4. 만약 인터럽트를 받아들일 수 있다면, 지금까지의 작업을 스택에 백업하고, **인터럽트 벡터**를 참조하여 **인터럽트 서비스 루틴**을 실행합니다.
5. 인터럽트 서비스 루틴이 끝나면, 백업한 작업을 복구하고 다시 실행합니다.
## 인터럽트 요청 신호, 인터럽트 플래그
**인터럽트 요청 신호**는, 이름 그대로 인터럽트를 요청하는 신호입니다.
CPU가 인터럽트 요청을 받아들이기 위해선, 플래그 레지스터 중 하나인 **인터럽트 플래그**에서 인터럽트를 받아들일 수 있다고 해야 인터럽트를 받아들일 수 있습니다.
다만, 일부 인터럽트는 인터럽트 플래그를 무시하고 실행될 수 있습니다.
## 인터럽트 서비스 루틴, 인터럽트 벡터
**인터럽트 서비스 루틴**은 인터럽트가 발생했을 때, 해당 인터럽트를 어떻게 처리해야 될지 정의한 코드입니다.
인터럽트 서비스 루틴 또한 하나의 프로그램이기 때문에, 메모리에 저장되어 있습니다.
만약 어떠한 인터럽트가 발생했을 때, 인터럽트 서비스 루틴을 실행하기 위해 `jump`를 통해 해당 메모리 지점으로 이동해야 하는데, 이러한 인터럽트 서비스 루틴를 구분하기 위한것이 **인터럽트 벡터**입니다.
Loading

0 comments on commit b2f348b

Please sign in to comment.