推荐阅读:
RTIC:零开销抢占式硬件加速调度, 助力 Cortex-M 性能暴涨
libmetal:跨 RTOS、裸机和用户空间 Linux 的抽象层
Picolibc:一款面向资源受限嵌入式系统的标准 C 库实现
TizenRT:一个轻量级实时操作系统 (RTOS) 平台,为低端物联网 (IoT) 设备提供高效、可靠的操作系统支持
什么是 LK
说白了,LK(Little Kernel)就是一个专为小型系统设计、体量极小的操作系统内核,支持多线程、可抢占,还能自动调度多核——完全不逊色于那些“大块头”内核。它从 ARM、RISC-V 到 x86 都能跑,连摩托罗拉 68000、VAX(实验性)都支持。要的是一套可移植、模块化、可按需裁剪的内核?LK 就是你的不二之选。
解决了哪些痛点
-
• 内存吃紧:有时候一整个 Linux 都嫌重,LK 只有几百 KB,FLASH/RAM 占用低得可怜;
-
• 移植麻烦:各种板子、架构都能跑,官方模块化得不要不要的,你要啥拉啥;
-
• 多核利用:SMP 支持相当完善,搞个多核 ARM、RISC-V,LK 能跑满核心;
-
• 构建复杂:Linux 工具链、插件一大堆,LK 用纯 gmake/clang 就能搞定,没那么多花里胡哨。
-
核心特性和代码示例
LK 的亮点不少,简单列几条:
-
• Fully-reentrant 多线程抢占式内核
-
• 支持 ARM32/ARM64/RISC-V/x86/MIPS……几乎你能想得到的主流架构
-
• 强大的模块化构建系统(BUILD.gn + gmake)
-
• 丰富的可选组件:文件系统、网络、设备驱动、调试工具……
下面给你个最简单的线程例子,演示一下多核打印小笑话:
#include <kernel/thread.h>
#include <stdio.h>
static int worker(void* arg){
int id =(int)(intptr_t)arg;
while(1){
printf("Hello from core %d!\n", id);
thread_sleep(1000);
}
return0;
}
void lk_main(void){
int cpu_count = platform_get_num_cpus();
for(int i =0; i < cpu_count; i++){
thread_t* t = thread_create("worker",&worker,(void*)(intptr_t)i, DEFAULT_PRIORITY);
thread_set_cpu_affinity(t,1u<< i);
thread_resume(t);
}
/* 主核继续干自己的 */
worker(0);
}
编译运行,用 QEMU 模拟一个 64 位 RISC-V:
# 假设 LLVM 在 /opt/llvm/bin
gmake qemu-virt-riscv64-test \
CC="/opt/llvm/bin/clang --target=riscv64-unknown-elf" \
CXX="/opt/llvm/bin/clang++ --target=riscv64-unknown-elf" \
LD=/opt/llvm/bin/ld.lld \
TOOLCHAIN_PREFIX=/opt/llvm/bin/llvm- \
CPPFILT=/opt/llvm/bin/llvm-cxxfilt
看,启动后屏幕就不停冒出 “Hello from core X”——多核效果立竿见影。
优缺点分析
优点:
-
• 极致轻量,占用少,启动快,适合资源受限场景;
-
• 架构覆盖广,移植成本低;
-
• 代码简单易懂,调试方便;
-
• 模块化设计,按需裁剪,去掉不需要的功能。
缺点:
-
• 功能相对精简,没办法直接拿来跑复杂的用户态应用;
-
• 驱动生态比较小,需要自己写或移植;
-
• 社区、第三方文档不如 Linux 丰富,遇到问题可能要自己啃源码;
-
• 对实时性要求极高的场景,需要手动调优抢占和优先级。
-
总结
总的来说,LK 就是那种“够用就好、瘦而精”的小核。你要做嵌入式设备、Bootloader、微控制器项目,或者想玩玩多核、玩玩系统底层,LK 几百 KB 的身板子配上强大可移植性,简直是神器。不用担心太多复杂依赖,一套小巧的内核就能跑遍各大架构,还能随你随意拆装功能。要是你还在为内核臃肿、移植难、调试烦心,赶紧试试 LK 吧!
项目地址:https/github.com/littlekernel/lk