嵌入式 Linux
嵌入式 Linux 系統 涵蓋從智慧手機和智慧電視等消費電子產品到工業機械、醫療裝置、汽車系統、通訊裝置等等。Linux 為這些資源受限的裝置帶來了強大的功能、靈活性和穩定性。
嵌入式 Linux 系統的核心元件是 引導載入程式、定製的 Linux 核心 和 根檔案系統。原始碼由 GCC 交叉編譯器 編譯。常見的引導載入程式是 Das U-Boot,即通用引導載入程式。根檔案系統通常基於 BusyBox,這是一個將許多 Unix 實用程式打包到單個可執行檔案中的軟體套件。本地除錯通常受到限制,因此可以使用 gdbserver。
基本的嵌入式 Linux 系統可以從上面的模組手動編譯。有一些工具可以從舊的、簡單的 Buildroot 到龐大的 Yocto 專案 生成完整的系統,Yocto 專案會建立定製的嵌入式 Linux 發行版。PC 發行版如 Debian、Ubuntu 等等都已為 ARM 處理器構建。
樹莓派、BeagleBoard 和 英偉達 Jetson 是支援嵌入式 Linux 的流行 單板計算機 的例子。
與常規的桌面或伺服器版 Linux 發行版不同,這些版本的 Linux 通常包含更少的庫和應用程式,韌體 更小,通常從 快閃記憶體 或 SD 卡 引導。
- Wear OS,智慧手錶和其他可穿戴裝置的 Android。
- AOSP,Android 開放原始碼專案
- Buildroot,基於舊的簡單的補丁和 make 的構建環境
- Yocto 專案 和 OpenEmbedded,一個基於 BitBake 的構建框架和環境
- BitBake,類似 make 的構建工具
- OpenWrt,開放無線路由器
- 嵌入式 Linux 核心子集,適用於古老的 16 位 x86 機器和模擬器
- 通用 GNU C 庫 glibc,7.9 MB
- uClibc,560 KB
- musl,527 KB
- dietlibc,185 KB
- Newlib
- klibc,主要用於引導 Linux 系統
- Bionic,最初由 Google 為 Android 嵌入式系統作業系統開發
進一步閱讀
用於 ARM 處理器
- Arch Linux ARM,Arch Linux 針對 ARM 處理器的移植版本
- Armbian,基於 Debian 和 Ubuntu
- RedSleeve,Red Hat Enterprise Linux 的移植版本
- emteria.OS,專有的基於 Android 的系統
輕量級雲面向系統
- Alpine Linux,使用 musl、BusyBox 和 OpenRC。
- Fedora CoreOS
- RHCOS,Red Hat Enterprise Linux CoreOS,適用於 OpenShift 容器平臺
- https://MicroShift.io/,輕量級 Kubernetes 發行版,專為邊緣和物聯網計算環境而設計
輕量級多平臺發行版
通用多平臺發行版
- I/O 和匯流排
- drivers/usb/gadget src – 外設 USB 裝置實現
- drivers/iio src – 工業 I/O
- drivers/pwm src – 脈衝寬度調製
- drivers/regulator src – 通用電壓和電流調節器支援
- drivers/fpgasrc
- drivers/slimbussrc
- SLOB – 簡單塊列表記憶體分配器
- 裝置樹 – 描述核心的硬體元件
多媒體
[edit | edit source]- 音訊
- ASoC – ALSA 系統晶片
- snd_soc_cardid
- ASoC – ALSA SoC 層 doc
- https://www.alsa-project.org/wiki/ASoC
- TFT (LCD) – 薄膜電晶體液晶顯示器
檔案系統和儲存
[edit | edit source]
無 MMU
[edit | edit source]Linux 最初是在具有 記憶體管理單元 (MMU) 的處理器上設計的。大多數嵌入式系統都沒有 MMU,正如我們之前討論過的 (嵌入式系統/記憶體),被稱為 微控制器。沒有 MMU 的微控制器更便宜,功耗更低。
使用具有 MMU 的處理器的優勢
- 可以將執行的“不受信任”的機器程式碼與執行的“關鍵”程式碼隔離,因此“不受信任”的程式碼保證(在沒有硬體故障的情況下)不會干擾“關鍵”程式碼
- 使作業系統更容易呈現虛擬記憶體的假象
- 可以執行“普通”Linux(也可以執行“μClinux”,但這有什麼意義呢?)
μClinux – “微控制器 Linux” 是 Linux 核心的一個版本,它支援 Altera NIOS、ARM、Freescale M68K(包括 DragonBall、ColdFire、PowerQUICC 等)、Hitachi H8、MIPS 和 Xilinx MicroBlaze 處理器。
停用引數 CONFIG_MMU 使能 nommu 模式。
即時
[edit | edit source]人們使用各種方法將 即時 任務與 Linux 結合起來
- 在專用微控制器上執行即時任務;與處理非即時任務的(非即時)PC 通訊。如果您需要低於 1 微秒的即時響應時間,這幾乎是您的唯一選擇。
- 在“底層”專用即時作業系統中執行即時任務;在即時作業系統之上在一個低優先順序任務中執行 Linux 作為“巢狀作業系統”。其中一些系統聲稱即時響應時間低於 500 微秒。
- 使用旨在強調即時任務的 Linux 核心,並在高優先順序(甚至可能是核心執行緒)下執行即時任務。
RT 發行版的示例
幾個 RT 功能提供了即時功能
- RT搶佔
- RT排程
- CPU 分割槽和隔離
- Dynticks (Tickless, nohz)
RT搶佔
[edit | edit source]PREEMPT_RT 補丁已部分合併到 mainline Linux 核心中,從 5.15 版本開始 [1]。這意味著即時功能現在作為 mainline Linux 核心的一部分可用,從而使使用 Linux 部署和維護即時系統變得更加容易。
延遲搶佔 (CONFIG_PREEMPT_LAZY) 仍然存在於外部補丁集中。
然而,Linux 的即時功能仍在不斷發展,並且正在不斷努力進一步提高即時效能和降低延遲。 Linux 基金會的即時 Linux (RTL) 協作專案 致力於改善 Linux 的即時功能,並在航空航天、汽車、機器人和電信等各個行業推廣即時 Linux 的應用。
總之,即時 Linux 現在是 mainline Linux 核心的一部分,並且正在不斷努力進一步提高即時效能和降低延遲。
引數 CONFIG_PREEMPT_RT id 使能即時搶佔。
RT 排程策略
[edit | edit source]RT 的排程策略
API
- man 1 chrt – 操作程序的即時屬性
- man 2 sched_rr_get_interval – 獲取指定程序的 SCHED_RR 間隔
- man 2 sched_setscheduler, sched_getscheduler – 設定和獲取排程策略/引數
- man 2 sched_get_priority_min, sched_get_priority_max – 獲取靜態優先順序範圍
測試 RT 功能
[edit | edit source]即時 Linux 的測試過程通常涉及幾個關鍵方面。首先,至關重要的是驗證系統計時機制的準確性和穩定性。精確的時間管理是即時應用的基礎,任何不準確都會導致計時錯誤並損害系統的即時功能。
測試的另一個重要方面是評估系統的排程演算法。即時 Linux 採用高階排程策略來優先處理關鍵任務並確保其及時執行。測試排程器涉及評估其有效分配資源、正確處理任務優先順序以及防止資源爭用或優先順序反轉情況的能力。
此外,延遲測量是即時 Linux 測試中的一個關鍵部分。延遲是指事件發生與系統對其做出響應之間的時間延遲。在即時應用中,最小化延遲對於實現及時和可預測的行為至關重要。測試延遲涉及測量系統對各種刺激做出響應所需的時間,以及識別任何延遲或不可預測性的來源。
此外,壓力測試在評估系統在繁重工作負載下的健壯性中發揮著重要作用。它涉及將即時 Linux 系統置於高水平的併發活動、密集的計算負載和輸入/輸出操作中,以評估其效能、響應能力和穩定性。壓力測試有助於識別潛在的瓶頸、資源限制或可能降低系統即時行為的問題。
- RTLA – 即時 Linux 分析工具:
- rtla timerlat 文件 – 核心 timerlat 追蹤器 文件 的 CLI
- rtla osnoise 文件 – 核心 osnoise 追蹤器 文件 的 CLI。核心函式 run_osnoise id 在迴圈中使用函式 trace_clock_local id 測量時間。
- rtla hwnoise 文件 – 停用中斷的 osnoise 追蹤器 文件 的 CLI
- 實現: tools/tracing/rtla 原始碼 和 kernel/trace/trace_osnoise.c 原始碼
- Linux 排程延遲除錯和分析
- RT-Tests, 原始碼
- 一些 RT-Tests 手冊頁
- cyclictest – 測量 手冊 2 clock_nanosleep 或 手冊 2 nanosleep 延遲
- hackbench – 排程器基準測試/壓力測試
- hwlatdetect – /sys/kernel/tracing/hwlat_detector 文件 / kernel/trace/trace_hwlat.c 原始碼 的 CLI。核心函式 kthread_fn id 在迴圈中使用函式 trace_clock_local id 測量時間延遲。
- oslat – 使用 RDTSC 在繁忙迴圈中測量延遲
- 使用 eBPF 的即時追蹤工具
- realtime ltp
關於即時 Linux 的進一步閱讀
- linux/spinlock_rt.h 包含檔案 透過 linux/spinlock_types.h 包含檔案 使用
- linux/rtmutex.h 包含檔案 透過 linux/mutex_types.h 包含檔案 使用
- linux/rwbase_rt.h 包含檔案 透過 linux/rwlock_types.h 包含檔案 使用
- 即時 Linux 入門: 釋放確定性計算
- Linux 核心中的電源管理和排程 (OSPM)
- 即時 Linux wiki
- Realtime@LWN
- linux-stable-rt.git
- linux-rt-devel.git
- 即時核心補丁集,Arch Linux
- https://kernel.linux.club.tw/pub/linux/kernel/projects/rt/ - 上游核心的 RT 補丁
- 高精度事件定時器 (HPET)
- 揭秘即時 Linux 排程延遲
- RHEL 9 中的即時核心調優
- 與即時相關的 Linux 子系統
- Linux 核心排程和搶佔
- 中斷
- 延遲工作
- 不可遮蔽中斷處理程式 (NMI)
- 系統管理中斷 (SMI)
- 手冊 7 sched
- 延遲 @ LKML
- PREEMPT_RT @ LKML
- 關於 PREEMPT_RT 的問答,LPC'23, 洋蔥狀態,pdf
關於嵌入式 Linux 的進一步閱讀
- 嵌入式 Linux 大會 (ELC) @ EOSS 2023
- https://elinux.org
- 類別:嵌入式 Linux
- Linux 核心介面
- ARM 支援
- 特定於架構的初始化
- 學習 vi 編輯器
- ↑ "即時搶佔鎖定核心合併".
{{cite journal}}: Cite journal requires|journal=(幫助)