歡迎編輯本頁面,增添你認為可利用 Linux 核心及其機制達到的效果,並附上相關資訊。
提案原則:
在Linux上利用 huge pages 來提升 BitNet 大型語言模型的推理速度。
BitNet 藉由 1.58 bit 權重大幅降低記憶體需求,從而提高能源效率,其推理速度可達 FP16 的 2.7 至 4 倍。huga page 可減少 TLB miss、加速記憶體存取及降低 CPU page table 管理負擔,預期有以下益處:
相關討論:
藉由 Linux 核心模組,提供寫入時複製 (Copy-on-Write, CoW) 的快照機制與掛載前狀態還原能力,特別適合在需要保留區塊裝置原始狀態的情境下使用,例如以下:
/dev/sda1
)註冊至 bdev-snapshot-service
,並在檔案系統掛載時建立 CoW 快照。使用者進行變更(如安裝軟體或修改設定),完成後卸載該裝置,模組即還原至掛載前狀態,僅復原被修改的區塊。這樣可在不需手動備份的情況下,安全進行實驗。以下是典型測試案例的流程:
/dev/sdb1
或 /dev/loop0
註冊至快照服務/mnt/test
/mnt/test
開發運行於 Linux 核心層級 (Ring 0) 的 rootkit,具備命令記錄與隱匿功能,能在系統中悄無聲息地追蹤所有執行過的命令。其主要功能如下:
lsmod
等常見管理工具的輸出中,難以被偵測/var/log/cmd.log
,紀錄內容包含:
execve
與 execveat
系統呼叫以攔截程式執行操作,並額外攔截 init_module
與 finit_module
系統呼叫,以阻擋其他 rootkit 模組的插入2015 年 MIT CSAIL 發表〈Capturing the Human Figure Through a Wall〉和後繼的 Through-Wall Human Pose Estimation Using Radio Signals,將 Wi-Fi 當作聲波使用,藉而來定位某個人的身形、動作,也能透過顯示的影像來辨識他人,能準確辨識人體形狀、手勢移動等。這項應用的原理,是先使用 3D 空間掃描,來接收某空間中所有物體的 Wi-Fi 訊號反射,包含人體,再在人體移動的情況下繼續重複操作,如此過程下來就能辨識某個移動物體的特定反射訊號,並重建成單一影像,再加入身高、身形等變因,就能獲得特定人物的所屬的「Wi-Fi 訊號紋路」,進行身份辨識。
本任務嘗試修改現有的 Wi-Fi 裝置驅動程式,以達成動作追蹤的基礎建設。
基於電腦視覺方法利用無線網路訊號實現動作辨識 (2016 年)
由於無線網路訊號的普及性,低成本及不侵犯隱私性,利用無線網路訊號實現動作辨識在近幾年來受到相當程度的重視。通道狀態訊息(Channel State Information, 簡稱
CSI
) 是一種可從接收到的無線網路訊號預估出來的資訊,提供了詳細的環境如何影響訊號的訊息 … 基於奇異值分解(Singular Value Decomposition) 的方法,能夠將地點資訊從 CSI 中移除,使得留下的資訊就是人的動作的影響。實驗結果顯示,在跨房間(地點)的動作辨識上,我們的方法在分類 6 個不同動作能夠達到 90% 的準確率。
定位環境建立在使用者原本的使用方式上,以一般使用 WiFi 上網的習慣,不需要安裝任何軟體程式,或配戴額外任何裝置,就能精準找出手機、平版等行動裝置的位置。目前已成功導入國內大型企業、國營企業及國內大型醫療院所,用以進行人員及設備定位與管理。未來也將應用於大型零售業賣場環境,提供發展人流追蹤分析與顧客購買習慣分析,可優化消費者實體通路購物體驗。
People counting using WIFI and Bluetooth
WIFI and Bluetooth scanning data can be used directly to develop insights directly or to support, enhance or reinforce data sources derived through other means. We highlight many potential applications of the technology below.
- WiFi People and Crowd Counting
- Vehicle Counting
- Commute Times and Traffic Flow
- Vehicle Passenger Occupancy
- Event Attendance
- Sporting Event and Stadium Attendance
- Outdoor Sport Events
We use existing WiFi waves in an environment to detect motion and send meaningful alerts or notifications.
這項創新建立在 Mostofi 實驗室先前的研究基礎上,該實驗室自 2009 年以來率先使用日常生活中的射頻訊號 (如 Wi-Fi) 進行感測。例如,研究人員在 2018 年的論文中即展示 Wi-Fi 訊號如何計算移動中人群的數量。然而,人們必須四處走動才能被計算到。
研究人員們將「人群煩躁期」(Crowd Fidgeting Periods; CFP) 定義為在一個 Wi-Fi 區域中至少有一個人煩躁的時間長度,並定義「人群沉默期」(Crowd Silent Periods; CFP) 為完全無人煩躁的時間長度。
ESP-WIFI-CSI detects humans with WiFi signals only, no sensor needed
This project allows you to extract channel state information (CSI) of OFDM-modulated Wi-Fi frames (802.11a/(g)/n/ac) on a per frame basis with up to 80 MHz bandwidth on the Broadcom Wi-Fi Chips.
支援 Raspberry Pi 3B+/B4 (bcm43455c0
晶片)
This testbed records Wi-Fi traffic and retrieves the channel state information (CSI). For this purpose, the RF signal is passively tapped at one of the network nodes, i.e. access point (AP) or client, and decoded in Matlab.
Human Activity Recognition using Channel State Information for Wifi Applications.
A simple Tensorflow 2.0+ model using Bidirectional LSTM stacked with one Attention Layer.
The main purpose of this project is to show the use of ESP-WIFI-CSI. The human body detection algorithm is still being optimized. You can get more accurate results through machine learning, neural network and other algorithms based on the original CSI data.
These are the code and data for the paper: DeepSeg: Deep Learning-based Activity Segmentation Framework for Activity Recognition using WiFi, IEEE Internet of Things Journal, 2020.
The purpose of this project is to allow for the collection of Channel State Information (CSI) from the ESP32 Wi-Fi enabled microcontroller. By collecting this data rich signal source, we can use this information for tasks such as Wi-Fi Sensing and Device-free Localization directly from the small, self contained ESP32 microcontroller. (web)
camblet-driver 將 WebAssembly 模組引入核心層級,強化傳統 UNIX TCP socket 的安全能力,並達成 zero-trust 的加密通訊。該設計讓應用開發者無需修改原有應用程式碼、重新編譯或重新部署,就能享有現代化的安全保障,將心力集中於業務邏輯的實作。Camblet 主要應用與特點如下:
相關專案:
kSFTP 是個運作於 Linux 核心層的 SFTP 伺服器,提供低延遲的安全檔案傳輸機制。它基於 SSH 通訊通道,將 SFTP 協定的資料操作端點下沉至核心空間,藉此降低 context switch 成本,提升效能並加強系統隔離能力。
kSFTP 採用內建於核心模組的協定解析器,能直接處理如 OPEN、READ、WRITE、STAT、OPENDIR 等 SFTP 子命令,並呼叫對應的 VFS 操作介面來執行實際檔案讀寫。所有檔案操作均限定在個別 mount namespace 中,透過與使用者空間協助程式協同初始化,可防止目錄竄逃與未授權存取,並支援結合 cgroup、AppArmor、seccomp 等安全機制。
在連線建立方面,kSFTP 不直接處理完整 SSH handshaking,而是與使用者空間之 SSH server (如 OpenSSH 或 dropbear) 協作,由後者建立安全 channel,並透過 netlink 或 io_uring 將該 channel 的 payload 委派給核心模組處理。該設計保留現有 SSH 工具的相容性,並將資料面操作完全轉由核心處理。
此外,kSFTP 支援 TLS offload,可選配 kernel TLS (kTLS) 達成效能改進。
相關專案:
運作於 Linux 核心中的 QUIC 通訊協定實作,是為了回應越來越多核心層應用需求所提出的現代化通訊解決方案。主體想法是,TLS 交握流程應保留於使用者空間,並透過 up-call 機制由核心呼叫使用者空間來完成資料流程。儘管 TLS 交握過程仍由使用者空間處理,但 QUIC 協定的主要邏輯與封包處理則完全位於核心空間,以兼顧效能與安全性。考量因素:
相關專案:
提案人: 鄭聖文
剪貼簿共享是主流虛擬機軟體必備功能, 需要 Host OS 以及 Guest OS 之間的合作以及許多基礎建設, 此題目需要以下貢獻:
此題目僅在概念層面上發想, 實際設計上較大機率需要再行調整,。因作為期末專題不一定能完成所有工作事項,建議有興趣學員挑選出可行部份在本學期內協助實作。
提案人: 鄭聖文
The virtio file system device provides file system access. The device either directly manages a file system or it acts as a gateway to a remote file system. The details of how the device implementation accesses files are hidden by the device interface, allowing for a range of use cases.
目標: 透過實作 virtio-fs 達成 Host / Guest 之間的無縫/即時檔案操作
提案人: 鄭聖文
目前 semu 僅支援:
此題目需要學員進一部完善 semu 的 virtio-gpu 實作。
提案人: 鄭聖文
virtio-input 是 semu 上搭配 virtio-gpu 所需要的輸入裝置虛擬化程式, 可以將鍵盤/滑鼠資訊輸入 Guest OS 中。目前 semu 的鍵盤事件處理並不完整, 需要學員協助實作更多鍵盤事件。
提案人: 鄭聖文
提案人:簡志瑋
一個 GPU 工作的產生可以粗略的分成兩個部份,首先是 Shader 或解碼工作被編譯器編譯成 GPU 命令[1] 後,再來會被打包為命令封包 (command packet) 送往 GPU 執行。為了盡可能塞滿 GPU pipeline 不使其飢餓,在繪圖引擎 (或是影片播放器) 以及 mesa 中會使用多個執行緒盡可能增加發送工作量的 throughput。第一個部份中,其實整個過程與網頁瀏覽器向伺服器發送請求十分相仿,有多個執行緒在發送 GET 請求給伺服器 (在這裡是 GPU),且請求是非同步的,即發送完不會停頓在原地等資源回傳,會繼續準備發送更多請求。在 mesa 中這與命令打包並發送拆成兩個部份主要有以下幾個考量
因此在這兩個部份之間,mesa 使用了一個 MPMC queue 來存放工作,繪圖引擎或解影片播放器使用多著執行緒作為多個生產者往 queue 塞工作,而另一個 thread pool 會有多個執行緒將工作取出,打包並送往 GPU 執行。MPMC queue 有一個顯著的挑戰是不管是 enqueue 還是 dequeue,多個執行緒對於 enqueue 的進度要同步,對於 dequeue 的進度也要同步,因此會對共享資源造成頻繁競爭,競爭某個 job slot 存取權的成本過高則會影響到 throughput。為了避免對於共享資源的競爭,那乾脆就不要共享資源,如老師在上課提到的 per-CPU 資料結構。以此為出發點,我們可以使用 SPMC, MPSC 或 SPSC 組合出符合需求的 MPMC,以下幾個問題可以思考
目前 mesa 的 MPMC queue 有以下幾個特性
SCHED_BATCH
目前我沒有找到對 mesa 這個 MPMC queue 的詳細 benchmark,CI 上也沒有相關的 monitoring,可以先從此處如何評估 throughput 下手,或許目前的就已經夠好了也說不定。這個 queue 會造成效能瓶頸的場景是 GPU 很強但 CPU 相對很弱,發送工作給 GPU 的速度不夠快使其飢餓 (不過現在桌面系統使用者普遍大家都有很強的 CPU 反而是 GPU 沒那麼強),對此問題還有另一個解決的方向是 GPU hardware scheduler,不過那又是另一個很大的問題了
至於 vulkan,又是另一個完全不一樣的 runtime 了。一樣也有類似功能的基礎建設,近期也有維護者在 vulkan 解決類似問題
[1]: 你可能會覺的奇怪怎麼一下指令 (instruction) 一下命令 (command),GPU 上每個 IP block 都有自己的 ISA,例如 AMD 剛上市的 RDNA4 GPU 9070XT 是使用 RDNA4 ISA,但整個 mesa 中我們還是稱之為命令,詳細典故我無法考證,但是就我推測早期的 GPU 或是現在其他比較簡單的 IP block 其 ISA 都偏向聲明式的形式,因此很像是在下命令。
前面提到 Shader 或解碼工作被編譯器編譯成 GPU 命令發送工作請求的過程很像網頁瀏覽器的行為,以多執行緒繪圖引擎為例,其中會使用到非同步 runtime 來發送請求。可以嘗試使用 coroutine 建構一個適合繪圖引擎使用場景的非同步執行環境
此處會需要注意的是整個 graphics stack 中 job synchronization 的方式,也就是對於一個送出的工作,我要如何知道他已經完成,並且有照著我期望執行順序執行 (我們允許 reorder 以最大化硬體使用率)?Android 的繪圖同步框架對此提出了 dma_fence
,目前已經被整合進 kernel,也就是對於一塊即將被繪製的 buffer,提出請求者可以對其 wait,並等待繪製完成後來自 GPU 的中斷,由 kernel 對其 signal,對其等待的人則會收到當初註冊的 callback 的通知。在 install fence 時再搭配預期的工作 sequence number ,則可作為命令相依的檢查方式。目前 mesa 的 vulkan runtime 有在進行相關的重整及最佳化,gallium (OpenGL, VA-API) 這邊也可能尚有改進或借鏡 vulkan 的改進空間,並留意再更上層的繪圖引擎該如何配合此 job synchronization 方式,如繪圖工作排程,有效率且低延遲的呈現繪製結果並塞滿 GPU
提案人:林志恩
近期 eBPF 正在探討如何 inline kfuncs 來提昇效能,例如 Zingerman 提出 kfunc inlining 以減少 jumps 並有約 1.53x speed up。目前社群主要在討論要如何實作 kfunc inlining ,其中涉及到 security issues, architecture-specific code, eBPF verifier , auto-inlining 等。而目前最主要的議題在於哪些 functions 有益於 inlining 。
提案人:林志恩
近期 Linux Kernel 社群因為多語言(Rust+C)的開發流程而有一些衝突與討論。目前最主要討論的是現有開發者以及維護者不熟悉 Rust 語言並且可能會需要更多的心力來處理開發上語言之間的修改。而引入 Rust 語言的其中一個因素就是因為它的 memory safety feature (e.g., borrow checker),因此,解決此問題的其中一個方法可以是引入 borrow checker for C 。這個想法,在當初 Rust 要引入進 Linux Kernel 時已經有人提出了,並且也有相對應的實作,如 Cake 。但是要整合進 Linux Kernel 裡還需要更多的討論與改進。
近期 gccrs 支援了 borrow checker [1, 2],從其中的 Design goals 可以看到此 borrow checker 是 no language-specific information :
Rust GCC project aims to use the Polonius project as its borrow-checker. Polonius operates on a set of facts about the program to determine the actual lifetimes of borrows. As Polonius's primary analysis is location sensitive, the facts are tied to the program's control flow graph (CFG). Unlike rustc, which has its own three address language specific representation called MIR, gccrs uses gcc's AST based representation GENERIC. GIMPLE (the three address IR) is generated from GENERIC inside GCC and can carry no language-specific information. Therefore, we need to generate our own representation of the program's CFG. Since gccrs has no intention of having a MIR-like IR, the BIR is not to be used for code generation. Therefore, BIR carries only minimal information that is necessary for the borrow-checker and for BIR debugging.
然而此開發過程有點緩慢,要想把此機制用於 Linux Kernel 還需要一段時間。因此,我們可以先以 RCU pointer 以及 locking 檢測機制為例,以 Sparse 來開發一個 borrow checker for C 。
提案人: RinHizakura
Kdump 是 Linux 核心的一個特殊功能。當核心出現異常而發生核心錯誤(kernel panic) 時,將觸發 Kdump。藉由 Kdump,核心可以匯出記憶體的 image,即所謂 Core Dump。Core Dump 可用於除錯和確定崩潰的原因。這個 image 會以 ELF 格式匯出,可以在處理核心崩潰時通過 /proc/vmcore
直接存取,或者可以也可將其自動儲存到本地或遠端檔案系統。關於 Kdump 的更多細節,可參閱 Linux 核心設計: Kernel Debugging(1): Kdump 的解說。
而對於產生的 Core Dump,一種常見的作法是使用 crash 工具分析。然而,當在最新版本的 Linux 使用這款工具時,我們會發現 DATE
一欄可能無法顯示正確的時間。其原因可能來自於 Linux 在 timekeeper 子系統之相關資料結構上隨版本的演進。
嘗試認識 Kdump 的運作,並了解 crash 是如何分析 Core Dump,以修正在最新版本的 Linux 中的上述時間錯誤,提交到 crash 專案中。
提案人: RinHizakura
PCI 配置空間(Configuration Space) 是一段與 PCI 裝置的功能、設定相關的結構。硬體層面上,通常我們會以 Bus, Device, Function(BDF) 做為 PCI 裝置的唯一位址,並以此透過晶片廠商提供的方式存取之。以 Intel 的晶片組為例,其使用 I/O 空間的 0xCF8 來設定 Configuration Address Register 來決定要存取的 BDF,最後再以 0xCFC 位址來讀取或寫入 Configuration Data Register 以得到想存取的 Configuration Space 內容。關於 PCI Configuration Space 的更多細節,可閱讀 PCIe 規格書的相關章節,搭配 PCI/PCIe(1): 基礎篇的說明閱讀。
在 Linux 系統上,有兩種介面能提供 configuration space 的存取,一種是透過 sysfs,另一種則是 procfs。仔細觀察可以發現,兩段程式碼有需多重複之處。如此設計是否是受制於兩種檔案系統的限制,或者有可能重構來減少重複的程式碼,強化未來維護的方便性? 可能是有機會貢獻程式碼到核心的機會。
提案人: RinHizakura
除了在伺服器領域的應用,Linux 作業系統在移動式裝置上也佔有一席之地。針對移動式裝置,如何於達到合理效能的前提下,減少電源的耗損是相當重要的課題。因此在 Linux 中有電源管理(Power Management) 子系統來滿足該需求。
System Suspend/Resume 是電源管理中一個重要功能。
以筆記型電腦為例: 在觀賞影片到一半時,突然有事必須暫時離開,這時如果可以關閉顯示畫面和暫停 CPU 的運作等,就可以減少電源的損耗; 但同時使用者又不希望完全關閉電源,導致丟失影片的進度或是過長的復原時間。這時,Suspend/Resume 就可以作為比完全運作更為省電,同時能相對重新開機快速回復到完全運作的狀態,以滿足上述的需求。請閱讀 System Sleep States 和參考 Linux 核心設計: Power Management(1): System Sleep model 來得知更多細節。
在目前的 Linux 的設計中,Suspend/Resume 各自可以被分為數個小階段,以滿足不同的目的與限制:
Suspend/resume 的流程除了需要運作正確,整體的速度也很重要,因為這影響了使用體驗。參考 Google 工程師 Saravana Kannan 在 LPC 上的演講: Optimizing suspend/resume,他發現了在當前 Linux 裡 suspend/resume 的諸多優化可能性。總結來說,大致有以下幾點發現:
針對此議題,學員可以嘗試從以下方向去突破:
另一方面,virtme-ng 是一款基於 QEMU,可以用來有效建立虛擬的 Linux 環境,加速 Linux 的開發與測試的工具。可以參考 Linux 核心設計: 開發與測試環境#virtme-ng 知道相關的使用方式。
參考 Linux 核心設計: Power Management(3): 測試工具#PM-on-QEMU,在 QEMU 上,我們可以根據文中所述的步驟讓 Linux 系統進入睡眠狀態,然後將之喚醒。而 virtme-ng 是基於 QEMU 打造的虛擬環境,理論上也要具備相同效果。然而實際使用時,我們會發現在喚醒系統之後,Resume 無法順利完成,無法觀察到 console 的復原。
探究 virtme-ng 的啟動方式,以理解其中所缺少的實作,並嘗試貢獻程式碼到原始專案中。
提案人: RinHizakura
mini-gdbstub
是一個針對模擬器開發的具體而微 Gdbstub/Gdbserber 實作。藉由整合此函式庫,能夠很容易地在模擬器上引入 GDB 的除錯功能。如 rv32emu
與 semu
皆導入此專案來獲得 GDB 的支援。
目前,mini-gdbstub
在功能性上大致正確,但仍有許多可行的優化與改進空間。舉例來說:
pktbuf
作為儲存接收到的封包之佇列,但此設計仰賴許多記憶體的移動與複製,可能造成較差效能。是否有更好的設計方式?mini-gdbstub
目前提供的介面是否已足夠提供完整支援?(e.g. Vectorization (SIMD/SIMT) 是否可支援?)mini-gdbstub
尚無法支援的?(e.g. watchpoint?)請留意:
mini-gdbstub
作為與除錯功能相關,並且以具體而微為目標的函式庫,我們將程式碼的簡潔與易讀性放在第一位。引入艱澀的演算法卻只能提升些許效能的情況下,該改動可能不被接受。
提案人: Damien
WSL2(Windows Subsystem for Linux version 2)是微軟提供的一項技術,讓使用者可以在 Windows 10 和 Windows 11 系統中原生執行 Linux 作業系統,無需使用虛擬機或雙系統。
然而原生的 WSL2 無法在其環境中存取 host 端 USB 裝置,必須透過第三方工具 UsbIpd ,重新編譯 WSL2 linux 核心後才可使用。
近期微軟開源 WSL2 的原始程式碼(並非 100% 開源),根據其 Github Repo 的 Issue#12964 描述
可嘗試研究整合 UsbIpd 進 WSL2 的可行性,如此一來,WSL2 即可原生支援 USB 裝置。