# 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.