# COSCUP 2025 $4 的個人筆記 https://coscup.org/2025/sessions/ ## 議程資料 https://coscup.org/2025/json/session.json https://opass.app/ ## SNS https://t.me/coscupchat ## 有興趣的議程 系統程式、Rust 和 Go 語言相關議程列表 ### **Go** | 時間 | 地點 | 議程名稱 | 講者 | | :--- | :--- | :--- | :--- | | 08-09 10:10 - 10:40 | TR212 | Building RESTful APIs with gRPC-gateway in Go | Erica Lin | | 08-09 11:10 - 11:40 | TR212 | Golang clean arch framework for beginners | 查理 | | 08-09 14:10 - 14:40 | TR212 | [使用 Golang 開發 Linux Scheduler!(Develop a Linux Scheduler using Golang!)](https://www.facebook.com/groups/269001993248363/posts/3265002346981631/) | 陳毅 | | 08-09 15:10 - 15:40 | TR212 | 從連線到效能:SQL 套件 Connection Pool 的底層設計與優化技巧 | vic | ### **Rust** | 時間 | 地點 | 議程名稱 | 講者 | | :--- | :--- | :--- | :--- | | 08-09 14:30 - 15:00 | TR214 | 貢獻 rust-clippy 的土魠利歐 (tutorial) | WeiTheShinobi | | 08-10 10:00 - 10:30 | TR210 | tmux-rs: porting 67k lines of C to (unsafe) Rust | Collin Richards | ### **系統程式 (System Programming)** #### **核心與作業系統 (Kernel & OS)** | 時間 | 地點 | 議程名稱 | 講者 | | :--- | :--- | :--- | :--- | | 08-09 10:00 - 10:30 | TR213 | Shim and things related to it | Joey Lee | | 08-09 10:40 - 11:10 | TR409-2 | [Let's Tracing Linux Kernel, MGLRU 實作與分析](https://hackmd.io/@hank20010209/HyDVgwjyll) | 吳承翰 (吳他,惟手熟爾) | | 08-09 10:45 - 11:15 | TR213 | Exposing an Open Source Kernel using an Open Source Database The OSDB Project | George Neville-Neil | | 08-09 11:20 - 11:50 | TR409-2 | How the Android Keystore works - A Hardware-backed Crypto Service | Mikucat | | 08-09 11:30 - 12:00 | TR213 | 利用 Linux 和 RTOS 進行異質多核處理器之間的通訊 | 江冠霆 | | 08-09 13:30 - 14:00 | TR213 | 自旋鎖大進化:為你的多核電腦量身打造高效同步術! | 曾俊瑋, 郭明穎 (Duck Cone), 潘頤婕 | | 08-09 14:15 - 14:45 | TR213 | 深入解析 Linux Kernel 的 Min Heap 實作細節與效能考量 | 邱冠維 Kuan-Wei Chiu | | 08-09 15:00 - 15:30 | TR213 | 藉由 sched_ext 實作客製化 Linux CPU 排程器 | EricccTaiwan (周呈陽), 邱柏穎 | | 08-09 15:10 - 15:40 | TR511 | 探索輕量級 AI 系統的可能性:在簡易 OS 上運行 LLM | yilin | | 08-09 15:45 - 16:15 | TR511 | GKI Kernel: 終結 Android Kernel 的碎片化時代 | EdwardWu | | 08-09 16:00 - 16:30 | TR211 | CPU resource allocation with cgroups v2 and systemd | James Thomas | | 08-10 09:30 - 10:00 | TR213 | 4色小尺寸電子紙的DRM驅動程式開發之旅 | 王良丞/LCWang | | 08-10 10:15 - 10:45 | TR213 | 不依賴 FPU、2D 加速器與 GPU 的精簡現代視窗系統 | Wei-Hsin Yeh | | 08-10 13:00 - 13:30 | TR213 | 一個初學者在 Linux 核心系統休眠與回復的踩坑紀錄:基於 x86-64 之效能瓶頸分析與改進評估 | Daniel Tzou | #### **韌體 (Firmware)** | 時間 | 地點 | 議程名稱 | 講者 | | :--- | :--- | :--- | :--- | | 08-10 10:15 - 10:30 | TR513 | An Introduction to the Open-Source Firmware Foundation | Christian Walter | | 08-10 10:30 - 11:00 | TR513 | The State of Open-Source Firmware | Christian Walter | | 08-10 11:00 - 11:30 | TR513 | Open Software On An Open Convertible Laptop | Daniel Schaefer | | 08-10 11:30 - 12:00 | TR513 | 探索 AMD SEV-SNP 在韌體層級的安全性 | Richard Lyu | | 08-10 13:30 - 14:00 | TR513 | No Hardware, No Problem: Exploring OpenBMC and Host SoC Communication on Arm FVP | Ann Cheng | | 08-10 14:00 - 14:30 | TR513 | Server system firmware in open-source solution | 紀煜豪/Samba Chi | | 08-10 14:30 - 15:00 | TR513 | Tracing embedded systems for holistic debugging | Marvin Drees | | 08-10 15:00 - 15:30 | TR513 | 使用GDB來針對BMC做除錯 | alanhc | #### **虛擬化與系統管理 (Virtualization & System Management)** | 時間 | 地點 | 議程名稱 | 講者 | | :--- | :--- | :--- | :--- | | 08-09 13:00 - 13:30 | TR514 | Turning Spare Mini PCs into an Incus Cluster | Mitsuya Shibata | | 08-09 14:35 - 15:05 | TR511 | Gitlab CI workflows for full system testing using openQA | James Thomas | | 08-09 16:00 - 16:30 | TR213 | Build a system with the filesystem maintained by OSTree | Jian-Hong Pan (StarNight) | | 08-10 14:10 - 14:40 | TR210 | 在系上搞運算服務的那檔事 | Ray Huang | | 08-10 15:30 - 16:00 | TR210 | 如何縮小我們與 PVE 間的距離 | Joshua / 曾祺元 | ## 請 Gemini AI 2.5 Pro 幫忙產生的列表 好的,這是在優先考量系統程式、Rust 和 Go 語言主題下,能參加最多場次的議程列表,並附上每個議程的地點與講者。 **優先主題** 將以 **粗體** 標示。 ### 8月9日 (星期六) | 時間 | 議程名稱 | 地點 | 講者 | | :--- | :--- | :--- | :--- | | 09:00 - 09:35 | COSCUP 2025: Welcome Day 1 | RB105 | COSCUP Team | | 10:00 - 10:30 | **Shim and things related to it** | TR213 | Joey Lee | | 10:40 - 11:10 | **Let's Tracing Linux Kernel, MGLRU 實作與分析** | TR409-2 | 吳承翰 (吳他,惟手熟爾) | | 11:20 - 11:50 | **How the Android Keystore works - A Hardware-backed Crypto Service** | TR409-2 | Mikucat | | 12:00 - 13:00 | 【BoF】Product folks BoF at COSCUP ver.3 開源圈子裡的產品人 | TR310-2 | | | 13:10 - 13:40 | **使用 Golang 開發 Linux Scheduler!(Develop a Linux Scheduler using Golang!)** | TR212 | 陳毅 | | 14:00 - 14:30 | **深入解析 Linux Kernel 的 Min Heap 實作細節與效能考量** | TR213 | 邱冠維 Kuan-Wei Chiu | | 14:35 - 15:05 | **Gitlab CI workflows for full system testing using openQA** | TR511 | James Thomas | | 15:10 - 15:40 | **探索輕量級 AI 系統的可能性:在簡易 OS 上運行 LLM** | TR511 | yilin | | 15:45 - 16:15 | **GKI Kernel: 終結 Android Kernel 的碎片化時代** | TR511 | EdwardWu | | 16:45 - 17:00 | Recap Day 1 | RB105 | COSCUP Team | ### 8月10日 (星期日) | 時間 | 議程名稱 | 地點 | 講者 | | :--- | :--- | :--- | :--- | | 09:00 - 09:10 | COSCUP 2025: Welcome Day 2 | RB105 | COSCUP Team | | 09:30 - 10:00 | **4色小尺寸電子紙的DRM驅動程式開發之旅** | TR213 | 王良丞/LCWang | | 10:00 - 10:30 | **tmux-rs: porting 67k lines of C to (unsafe) Rust** | TR210 | Collin Richards | | 10:30 - 11:00 | **The State of Open-Source Firmware** | TR513 | Christian Walter | | 11:00 - 11:30 | **Open Software On An Open Convertible Laptop** | TR513 | Daniel Schaefer | | 11:30 - 12:00 | **探索 AMD SEV-SNP 在韌體層級的安全性** | TR513 | Richard Lyu | | 12:00 - 13:00 | 【BoF】開源社群經營閒聊房 | TR310-2 | | | 13:00 - 13:30 | **一個初學者在 Linux 核心系統休眠與回復的踩坑紀錄:基於 x86-64 之效能瓶頸分析與改進評估** | TR213 | Daniel Tzou | | 13:30 - 14:00 | **No Hardware, No Problem: Exploring OpenBMC and Host SoC Communication on Arm FVP** | TR513 | Ann Cheng | | 14:00 - 14:30 | **Server system firmware in open-source solution** | TR513 | 紀煜豪/Samba Chi | | 14:30 - 15:00 | **Tracing embedded systems for holistic debugging** | TR513 | Marvin Drees | | 15:00 - 15:30 | **使用GDB來針對BMC做除錯** | TR513 | alanhc | | 16:15 - 17:00 | ⚡Lightning talk⚡ X Closing Day 2 | RB105 | COSCUP Team | ## MGLRU ### Linux 核心新一代記憶體管理機制:MGLRU 詳解 在 Linux 核心的世界中,記憶體管理一直是至關重要的一環,直接影響系統的效能與穩定性。近年來,一項名為「多世代最近最少使用」(Multi-Generational Least Recently Used, MGLRU)的新機制被引入,並在 Linux 6.1 版本中正式合併,旨在解決傳統 LRU(Least Recently Used)分頁回收演算法的諸多弊病,為系統帶來更高效、更智慧的記憶體管理能力。 #### 傳統 LRU 的困境 長久以來,Linux 核心使用基於「活躍」(active)和「不活躍」(inactive)兩個鏈結串列的 LRU 演算法來判斷哪些記憶體分頁(page)可以被回收。當系統需要釋放記憶體時,會從「不活躍」串列中挑選分頁予以淘汰。這種方法的概念相對簡單,但在現代複雜的工作負載下,卻顯現出一些顯著的缺點: * 掃描成本高昂: 在記憶體壓力大時,核心需要不斷掃描這兩個龐大的鏈結串列,以尋找可回收的分頁,這個過程會消耗大量的 CPU 資源,導致系統效能下降。 * 分頁回收決策不精準: 簡單的活躍/不活躍劃分,難以精確判斷一個分頁的「熱度」。有時,一個短時間內被大量存取但很快就不再使用的分頁會被錯誤地移至活躍串列,而一些長期有用的分頁反而可能被提前回收,造成所謂的「分頁抖動」(thrashing),即分頁被反覆地換入換出,嚴重影響效能。 * 對突發性記憶體需求反應遲鈍: 傳統 LRU 機制對於突發的大量記憶體請求反應不夠靈敏,容易在短時間內觸發大量的回收操作,甚至引發 Out-of-Memory (OOM) killer,強制終止程序。 #### MGLRU 的核心機制:引入「世代」概念 為了解決上述問題,由 Google 工程師開發的 MGLRU 引入了「世代」(generations)的概念,對記憶體分頁進行更精細化的生命週期管理。其核心思想如下: * 多世代分層: MGLRU 不再只有活躍和不活躍兩個狀態,而是將記憶體分頁劃分到多個「世代」中。最新的世代包含了最近被存取過的分頁,而最老的世代則包含了最長時間未被存取的分頁。 * 世代的演進: 當一個分頁被存取時,它會被提升到最新的世代。隨著時間的推移和新世代的產生,未被再次存取的分頁會逐漸「老化」,從較新的世代移動到較老的世代。 * 高效的回收策略: 當系統需要回收記憶體時,MGLRU 會優先從最老的世代中挑選分頁進行回收。因為這些分頁在最長的一段時間內沒有被使用,所以它們是「最冷」的資料,回收它們對系統效能的影響最小。 相較於傳統 LRU 需要掃描整個鏈結串列,MGLRU 的掃描目標明確,只需專注於最老的世代,大幅降低了掃描的成本和複雜度。 MGLRU 帶來的顯著優勢 經過在 ChromeOS 和 Android 等大規模生產環境中的驗證,MGLRU 展現了其卓越的效能優勢: * 降低 kswapd CPU 使用率: 由於掃描效率的提升,負責分頁回收的核心執行緒 kswapd 的 CPU 使用率顯著下降。根據 Google 的數據,整體上可降低約 40%。 * 減少低記憶體下的程序終止(OOM Kills): 由於更精準的分頁回收,系統能更有效地應對記憶體壓力,從而大幅減少因記憶體不足而觸發 OOM killer 的次數。在 ChromeOS 上,低記憶體下的程序終止事件減少了 85%。 * 改善使用者體驗: 記憶體管理的效率提升直接反映在使用者體驗上。例如,應用程式的啟動延遲、介面的渲染延遲等都有明顯改善。 * 提升工作負載效能: 對於資料庫、快取伺服器等記憶體密集型的應用程式,MGLRU 能夠更有效地管理記憶體,保護熱點資料,從而提升整體處理能力和輸送量。 總結 MGLRU 的出現,可以說是 Linux 核心記憶體管理子系統的一次重大革新。它透過引入「多世代」的精細化管理機制,成功克服了傳統 LRU 演算法在效率和準確性上的瓶頸。對於一般使用者而言,這意味著更流暢、更穩定的系統體驗;對於伺服器和資料中心等高效能運算環境而言,MGLRU 則能帶來更佳的資源利用率和應用程式效能。隨著 Linux 核心的不斷演進,MGLRU 的持續優化和普及,將為整個 Linux 生態系注入新的活力。 ## OpenAMP OpenAMP (Open Asymmetric Multi-Processing) 是一個開源框架,主要用於在異構多核系統 (Heterogeneous Multi-core System) 中,實現處理器之間的高效通訊和資源管理。 異構多核系統指的是單一晶片上整合了不同架構的處理器核心,例如常見的 Arm Cortex-A 系列(用於運行 Linux 等複雜作業系統)與 Cortex-M 系列(用於運行即時作業系統或裸機程式)。OpenAMP 的目的就是讓這些不同功能、不同作業系統的核心能夠協同工作,並進行有效率的通訊。 OpenAMP 的核心運作機制 OpenAMP 的運作主要圍繞著三個關鍵的軟體元件:RemoteProc、RPMsg 和 VirtIO。它們共同建立了一套標準化的通訊與管理協議,讓主核心和遠端核心可以協同運作。 * RemoteProc (Remote Processor) * 角色: 負責管理遠端處理器的生命週期。 * 運作: 通常由功能較強的主核心(例如運行 Linux 的 Cortex-A 核)來執行。RemoteProc 驅動程式負責處理遠端核心的啟動、停止、重置等操作。它會將遠端核心的**韌體(firmware)**載入到共享記憶體中,並發出指令啟動遠端核心。這使得主核心能夠動態地管理其他核心的執行狀態。 * RPMsg (Remote Processor Messaging) * 角色: 是一種輕量級的訊息傳遞機制,用於在不同核心之間進行通訊。 * 運作: RPMsg 是一個基於 VirtIO 的通訊協定,它提供了一個類似於管道(pipe)或通訊埠(port)的抽象層。開發者可以在通訊埠上建立通道(channel),並透過這些通道發送和接收訊息。這些訊息通常會被打包成數據包,並在共享記憶體 (Shared Memory) 上的環形緩衝區(ring buffer)中進行傳輸。 * VirtIO (Virtual I/O) * 角色: 是一種虛擬化裝置的框架,在 OpenAMP 中用於管理核心間的通訊緩衝區。 * 運作: 藉由 VirtIO 的機制,OpenAMP 建立了所謂的 vring (Virtual Ring Buffer)。這些 vring 位於共享記憶體中,充當主核心和遠端核心之間共用的數據交換區。VirtIO 負責管理 vring 的讀寫權限,並利用中斷 (Interrupt) 機制通知對方核心有新資料可讀或有緩衝區可用,從而實現高效的雙向通訊,同時減少 CPU 的負擔。 典型的 OpenAMP 通訊流程 以一個 Linux + RTOS 的雙核心系統為例,OpenAMP 的通訊流程大致如下: * 主核心初始化: 運行 Linux 的主核心啟動,並載入 remoteproc 和 rpmsg 驅動程式。它會配置好共享記憶體的區域,並準備好遠端核心的韌體。 * 啟動遠端核心: 主核心透過 remoteproc 驅動,將遠端核心(例如運行 RTOS 的核心)的韌體載入到共享記憶體中,然後發出啟動指令。 * 遠端核心初始化: 遠端核心啟動後,會初始化其上的 OpenAMP 框架(或其輕量級版本 RPMsg-Lite),並與主核心進行協調,建立通訊所需的 vring 和通訊埠。 * 建立通訊通道: 在兩核心都準備就緒後,它們就可以透過 RPMsg 建立虛擬的通訊通道。 * 訊息傳輸: * 當主核心要傳送訊息給遠端核心時,它會將訊息寫入共享記憶體中的 vring,然後觸發一個中斷,通知遠端核心有新資料。 * 遠端核心收到中斷後,會從 vring 中讀取訊息並處理。 * 反之亦然,遠端核心也能以同樣的方式將訊息回傳給主核心。 總結來說,OpenAMP 透過將處理器管理(RemoteProc)、**訊息傳遞協定(RPMsg)和高效緩衝區管理(VirtIO)**這三個核心概念整合在一起,提供了一套標準化的解決方案,讓開發者能夠在複雜的異構多核系統中,更簡單地實現核心之間的協同運作與高效通訊。