跳到內容

嵌入式 Linux

來自華夏公益教科書,開放書籍,開放世界


嵌入式 Linux 系統 涵蓋從智慧手機和智慧電視等消費電子產品到工業機械、醫療裝置、汽車系統、通訊裝置等等。Linux 為這些資源受限的裝置帶來了強大的功能、靈活性和穩定性。

嵌入式 Linux 系統的核心元件是 引導載入程式、定製的 Linux 核心根檔案系統。原始碼由 GCC 交叉編譯器 編譯。常見的引導載入程式是 Das U-Boot,即通用引導載入程式。根檔案系統通常基於 BusyBox,這是一個將許多 Unix 實用程式打包到單個可執行檔案中的軟體套件。本地除錯通常受到限制,因此可以使用 gdbserver

基本的嵌入式 Linux 系統可以從上面的模組手動編譯。有一些工具可以從舊的、簡單的 Buildroot 到龐大的 Yocto 專案 生成完整的系統,Yocto 專案會建立定製的嵌入式 Linux 發行版。PC 發行版如 DebianUbuntu 等等都已為 ARM 處理器構建。

樹莓派BeagleBoard英偉達 Jetson 是支援嵌入式 Linux 的流行 單板計算機 的例子。

與常規的桌面或伺服器版 Linux 發行版不同,這些版本的 Linux 通常包含更少的庫和應用程式,韌體 更小,通常從 快閃記憶體SD 卡 引導。


構建框架和環境

[編輯 | 編輯原始碼]
Wear OS,智慧手錶和其他可穿戴裝置的 Android。
AOSP,Android 開放原始碼專案
Buildroot,基於舊的簡單的補丁和 make 的構建環境
Yocto 專案OpenEmbedded,一個基於 BitBake 的構建框架和環境
BitBake,類似 make 的構建工具
OpenWrt,開放無線路由器
嵌入式 Linux 核心子集,適用於古老的 16 位 x86 機器和模擬器


Linux 核心
"init" 實現:OpenRCrunit
GUI:LXQtLXDEXfceFLTK
coreboot,輕量級 BIOS


通用 GNU C 庫 glibc,7.9 MB
uClibc,560 KB
musl,527 KB
dietlibc,185 KB
Newlib
klibc,主要用於引導 Linux 系統
Bionic,最初由 Google 為 Android 嵌入式系統作業系統開發


進一步閱讀

Linux C/POSIX 標準庫實現比較
選擇系統 C 庫

發行版

[編輯 | 編輯原始碼]

用於 ARM 處理器

Arch Linux ARMArch Linux 針對 ARM 處理器的移植版本
Armbian,基於 DebianUbuntu
RedSleeveRed Hat Enterprise Linux 的移植版本
emteria.OS,專有的基於 Android 的系統


輕量級雲面向系統

Alpine Linux,使用 muslBusyBoxOpenRC
Fedora CoreOS
RHCOS,Red Hat Enterprise Linux CoreOS,適用於 OpenShift 容器平臺
https://MicroShift.io/,輕量級 Kubernetes 發行版,專為邊緣和物聯網計算環境而設計


輕量級多平臺發行版

Gentoo Linux
Tiny Core Linux
Kali Linux
Lubuntu
Slackware
Void Linux
Xubuntu


通用多平臺發行版

Debian
Fedora
openSUSE
Ubuntu

嵌入式系統 Linux 核心的功能

[編輯 | 編輯原始碼]
I/O 和匯流排
GPIO
drivers/gpio srctools/gpio src通用輸入/輸出 doc
SPI
drivers/spi src, tools/spi src, 序列外設介面 doc
I2C
⚲ UAPI: 從使用者空間例項化 I2C 裝置 doc
drivers/i2c src, https://i2c.wiki.kernel.org
I2C/SMBus 子系統 doc
drivers/net/can src控制器區域網絡匯流排
drivers/mfd src多功能裝置
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) – 薄膜電晶體液晶顯示器
fbtft_displayid


檔案系統和儲存

[edit | edit source]
UBIFS – 未排序塊映像檔案系統
SquashFS – 一個壓縮的只讀檔案系統,具有低 開銷
drivers/mtd src記憶體技術裝置 塊裝置
更多: YAFFS, JFFS2


無 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 結合起來

  1. 在專用微控制器上執行即時任務;與處理非即時任務的(非即時)PC 通訊。如果您需要低於 1 微秒的即時響應時間,這幾乎是您的唯一選擇。
  2. 在“底層”專用即時作業系統中執行即時任務;在即時作業系統之上在一個低優先順序任務中執行 Linux 作為“巢狀作業系統”。其中一些系統聲稱即時響應時間低於 500 微秒。
  3. 使用旨在強調即時任務的 Linux 核心,並在高優先順序(甚至可能是核心執行緒)下執行即時任務。

RT 發行版的示例

Xenomai
RTAI
RTLinux
MontaVista Linux
Red Hat Enterprise Linux for Real Time
即時 Ubuntu


幾個 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 的排程策略

SCHED_FIFO id, SCHED_RR id
實現於 kernel/sched/rt.c src
SCHED_DEADLINE
實現於 kernel/sched/deadline.c src


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, 原始碼
cyclictest
一些 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
CPU 分割槽和隔離
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 支援
arch/arm 原始碼, ARM 架構 文件
https://lwn.net/Kernel/Index/#Architectures-ARM
arch/arm64 原始碼, ARM64 架構 文件
特定於架構的初始化
學習 vi 編輯器
  1. "即時搶佔鎖定核心合併". {{cite journal}}: Cite journal requires |journal= (幫助)
華夏公益教科書