---
# System prepended metadata

title: 'Linux Kernel 設計:記憶體管理心得'

---

# Linux 核心設計:作業系統術語及概念心得 
1. 即使 malloc() 後獲得非 0 的值，在開始使用這塊記憶體空間前，也有可能會收到記憶體不足的警告。即 Linux 在分配記憶體時有 overcommit 的特性，就像是拿到支票，但直到要兌現前才知道有沒有錢。

2. Guest OS 的目標和 Host OS 不同， Guest OS 重視快速重啟服務; Host OS 在意如何安全可靠地驅動硬體的 divice driver 。 

3. Interrupt context : 當收到中斷時（鍵盤輸入之類）， Interrupt controller 會告知處理器中斷發生並接續執行一連串的軟體處理。

# Linux Kernel 設計:記憶體管理心得

## 直播內容

OS : 解決人類的問題，在意工作分配

### Bottom up perspection
Process 為作業系統中最小的單位，以 process 的觀點來看，記憶體可以分為核心模式和使用者模式。兩者的大小總計為4GB (在32位元架構下， $2^{32}$ byte = 4GB)，常見配置為核心模式:使用者模式 = 1:3。但在手機上的配置比例則為2:2，係因手機需要支援拍照功能，其影像處理需要使用較大的記憶體空間，所以才增加核心模式的比例。

64位元架構下，僅由48位元定址

brk sbrk(屬於系統呼叫) 用在變更 data segment 的大小。舉例來說，當使用 malloc 配置記憶體， malloc 會透過 sbrk 改變 Heap 的邊界。
參考連結器篇

buddy system:核心概念為避免線性查找，所以以$2^n$ (page)作為單位切割記憶體 ，所以憑記憶體地址中1的位置就知道其對應的空間大小。

避免因配置記憶體產生的碎裂(fragmentation)，使用 vmalloc 蒐集碎裂，並從虛擬的角度組合成連續的記憶體，然這些碎裂在實體記憶體上仍為不連續的。

slab caching 

### Top down perspection
mmap => private anonymous mapping

malloc 呼叫後不會立即分配實體記憶體空間，而是只更新虛擬地址，當真正寫入才會透過 page fault 分配實體記憶體，即 Cow(Copy on Write)。

Page fault:

當 invalid page fault ， kernel 可以從暫存器狀態回推 call trace ，
參考函式呼叫篇 、 unwinding  




## Linux 核心設計: 不只挑選任務的排程器

### 內容摘要

Linux 不明確區分行程(process)和執行緒(thread)是因為可以重複使用程式碼。舉例來說，fork()、vfork() 底層都使用 clone() 建立執行緒和行程。

Linux 用 task 抽象行程和執行緒。

Hlist 和 Hash Table 搭配使用，若發生 conflict 時，使用 hlist 查找。

用 Lockless 概念解決 CPU 互相干擾的問題。

Everything is a file descriptor，優點是可以透過 epoll 等 API 監控追蹤 timer 、 PID 等等，藉此回收再利用。

Signal : 一種抽象化概念，在行程間的傳遞，可能來自系統外部或內部，例如 I/O 中斷、 0/0 等等會影響程式執行的狀況發生時，就會透過 signal 告知行程。

Macro : current 目的是為了使存取更容易，對應到 get current ，因應多 CPU 的環境，從指標轉變為 inline function ，會回傳此 CPU 的 current task。

Context switch : 包括 hardward context(program counter, registor) 和 process descriptor 等等

2 steps of CS : 
1. switching Page Global Directory to install a new address space.
2. switching kernel mode stack and hardware context.


