# 再觀電腦! ep.1
###### tags: `csst`
## 黃恩明
---
## 電腦基礎架構
- 硬體:CPU 、RAM 、Storage 、GPU
- 軟體:OS、核心、呼叫、中斷
----
### CPU
- Central Processing Unit
- 中央處理器
- 電「腦」
![](https://tpucdn.com/review/intel-core-i9-10900/images/title.jpg =540x)
----
### RAM
- Random Access Memory
- ~~隨機存取存儲器~~ 記憶體
- 家用量級:4~128GB
![](https://www.cclonline.com/images/avante/KVR16N118.jpg?width=1600&height=1600 =720x)
----
### 硬碟
- 傳統硬碟 HDD(有馬達)
- 固態硬碟 SSD(隨身碟)
- 家用量級: 256GB~4TB
![](https://i2.wp.com/topwinfix.com.tw/wp-content/uploads/2019/01/001.jpeg =240x) ![](https://static.techspot.com/images/products/2018/storage/ssd/org/2018-10-02-product.jpg =360x)
----
### 科普 - 資料有無重量?
![https://www.facebook.com/WDTaiwan/photos/a.139527342788549/2706635449411046/](https://i.imgur.com/MGSDDlA.png =260x)
> <span> ~~資料有重量,不信的話把硬碟拿掉看電腦會不會變輕~~ <!-- .element: class="fragment" data-fragment-index="1" --></span>
----
### 科普 - 資料有無重量?
- 若電子在 Floating Gate ,代表 0 ;反之為 1
- 電荷守恆
![](https://i.imgur.com/uYOwmXJ.png =720x)
----
### RAM vs. 硬碟
|| 記憶體 (RAM) | 硬碟 (HDD, SSD) |
|:---:|:---:|:---:|
| 用途 | 快速讀寫資料 | 長期儲存資料 |
| 關機後資料 |消失 | 還在 |
| 存取速度 | 快 | 慢 (SSD > HDD) |
| 舉例 | 書桌 | 書櫃 |
----
### GPU
- Graphics Processing Unit
- 圖形處理器
![](https://www.nvidia.com/content/dam/en-zz/Solutions/geforce/ampere/rtx-3080/geforce-rtx-3080-product-gallery-full-screen-3840-1.jpg =480x) ![](https://cdn.vox-cdn.com/thumbor/AzpGNWNKmFM1vOoHiHER7bPnrfs=/1400x1050/filters:format(jpeg)/cdn.vox-cdn.com/uploads/chorus_asset/file/19970190/2555435ebae590030837.15346566_NVIDIA_A100_GPU.jpg =360x)
----
### 作業系統 (Operating System)
![](https://i.imgur.com/ocwYqOs.jpg)
----
#### 使用者模式/核心模式
- 避免使用者覆寫系統資料
- 需要執行特殊指令時透過 *System Call 系統呼叫* 轉移至核心模式(Ex: 關機)
----
#### 系統呼叫 (System Call)
![](https://www.tutorialspoint.com/assets/questions/media/11194/User%20Mode%20vs%20Kernel%20Mode.PNG)
----
#### 中斷 (Interrupt)
- 暫停目前的工作,做完中斷事件後再繼續處理目前的工作。**不一定是出錯**
- 硬體中斷:
- 按下鍵盤
- 插入隨身碟
- 軟體中斷:
- System Call
- $\div0$ 、存取非法記憶體
---
## 程式之旅
- 編輯器
- 開發整合環境
- 編譯器
----
### 編輯器
- Text Editor (Notepad, VS Code, etc.)
- 原始用途純粹為打字
![](https://i.imgur.com/QuoJy37.png =360x) ![](https://i.imgur.com/fcXi2Ak.png =480x)
----
### 開發整合環境
- IDE (**I**ntegrated **D**evelopment **E**nvironment)
- 編輯器 + 編譯器 + 除錯工具等...
- Ex: Code::Blocks、安裝套件後的 VS Code
- [VS Code C語言環境設定教學](https://hackmd.io/@tangerine1202/rJtDbme3H)
![](https://i.imgur.com/fsvxwFo.png =540x)
----
## 編譯器 (Compiler)
1. 預處理 (Preprocessing)
2. 編譯 (Compilation)
3. 組譯 (Assembly)
4. 連結 (Linking)
----
### Example
```c=
#include <stdio.h>
#define BANG(x) printf(x)
int main() {
/* Hello World! */
BANG("Hello World!\n");
return 0;
}
```
----
### 預處理 (Preprocessing)
1. 處理define、註解
2. 新增行號和檔案標識
```bash
gcc -E -ansi hello.c
```
```c=
# 874 "/usr/include/stdio.h" 3 4
# 3 "hello.c"
int main() {
printf("Hello World!\n");
return 0;
}
```
----
### 編譯 (Compilation)
1. 詞法分析 - 產生單字
2. 語法分析 - 組成句子
3. 語義分析 - 理解語意
4. 轉成 *組合語言*
----
### 編譯 (Compilation)
```bash
gcc -S -ansi hello.c
```
```bash
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
leaq L_.str(%rip), %rdi
movb $0, %al
callq _printf
xorl %ecx, %ecx
movl %eax, -8(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "Hello World!\n"
```
----
### 組譯 (Assembly)
將組合語言轉成*目標檔案 (object file)* : 機器碼 / binary
```0101010101```
----
### 連結 (Linking)
將目標檔案 (object file) 與標頭檔等其他檔案連結起來,產生可執行檔
![](https://i.imgur.com/jjLtu0n.png)
----
### 總結
![](https://karthikdega.files.wordpress.com/2013/10/compile.gif)
{"metaMigratedAt":"2023-06-15T12:54:09.695Z","metaMigratedFrom":"Content","title":"再觀電腦! ep.1","breaks":true,"contributors":"[{\"id\":\"2308ee1b-d046-4851-80ab-090ecbeaf503\",\"add\":5317,\"del\":1430}]"}