🔧 mk-call-merge 项目状态分析

rel4-linux-kit — 在 seL4 微内核上运行 Linux ELF 二进制文件 | 分析日期:2026-07-19

11
Git 提交
~13,400
Rust 代码行
10
Rust Crate
55+
已定义 Syscall
6
开发周期(天)

🎯 项目目标

seL4 微内核 上实现 Linux 兼容层(LCL),使 Linux ELF 二进制文件(如 busybox)可以直接运行。

长期目标

运行 busybox iozone 对 ext4 文件系统进行基准测试 — 即通过 LCL 的文件 syscall 路径实现真实的文件 I/O(open/read/write/lseek/stat)。

root-task (main) ├── lcl (Linux Compatible Layer — syscall 模拟) │ ├── syscall/ — exec, fs, mm, signal, sys, thread 处理器 │ ├── task/ — PCB, runner, memory, file, signal 管理 │ ├── fs/ — DevFS, pipe, IPC client → ext4-srv │ └── arch/x86_64/ — 上下文切换 ├── ext4-srv (IPC 服务 — 文件操作) │ └── 委托给 lwext4-task 执行实际 ext4 I/O ├── blk-task (块设备 — ramdisk 持有 ext4 镜像) └── lwext4-task (ext4 文件系统操作 via lwext4_rust)

🏗️ 系统架构

核心设计决策

  • 无 FFI — 所有 seL4 交互使用纯 Rust 内联汇编
  • 仅 x86_64 — 自定义 target spec,无跨平台
  • #![no_std] — 仅使用 core 和 alloc
  • seL4 系统调用约定 — rdx 传号,rdi/rsi/r10/r8/r9/r12/r13/r15 传参

IPC 通信链

  • LCL → fs/ipc_client.rs → seL4 Endpoint
  • ext4-srv/src/service.rs → lwext4-task
  • → blk-task (ramdisk 持有 ext4 镜像)

工具链

  • Rust nightly-2025-02-01
  • 自定义 target: x86_64-sel4.json
  • musl 交叉编译 (blk-task, lwext4-task)

📋 Syscall 实现状态

总计定义 55+ 个 Linux syscall 号,实际实现情况如下:

类别Syscall状态说明
文件 I/O read (0)✅ 完成 stdin/stdout/stderr + 设备文件 + IPC ext4
write (1)✅ 完成 stdout/stderr → 串口,其他 → IPC ext4
openat (257)✅ 完成 设备文件 + IPC ext4 路径
close (3)✅ 完成 fd 0-2/设备 + IPC ext4
lseek (8)✅ 完成 通过 IPC ext4 实现
文件属性 fstat (5)⚠️ 部分 设备文件返回 0,ext4 仅获取 size
fstatat (262)✅ 完成 构建完整 struct stat(144 字节)
getdents64 (217)✅ 完成 通过 IPC ext4 实现目录遍历
mkdirat (258)✅ 完成 通过 IPC ext4
unlinkat (263)✅ 完成 通过 IPC ext4
faccessat (269)✅ 完成 通过 IPC ext4
内存管理 brk (12)✅ 完成 按页映射堆增长(已修复)
mmap (9)✅ 完成 查找空闲区域 + 按页映射
munmap (11)✅ 完成 解除页映射
mprotect (10)🔶 Stub 返回 0,未实际执行
进程/线程 exit (60)✅ 完成 设置退出码
exit_group (231)✅ 完成 设置退出码
getpid (39)✅ 完成 返回 task.pid
set_tid_address (218)✅ 完成 设置 clear_child_tid
clone (56)❌ ENOSYS 返回 38,未实现
wait4 (61)❌ ECHILD 返回 10
信号 rt_sigaction (13)✅ 完成 信号处理器注册
sigprocmask (14)✅ 完成 SIG_BLOCK/UNBLOCK/SETMASK
kill (62)✅ 完成 信号发送
Stub / 未实现 pipe2 (22)❌ ENOSYS 管道未实现
dup/dup3 (32/33)❌ ENOSYS fd 复制未实现
renameat (264)🔶 Stub 返回 0,未实际操作
mount/umount2❌ EPERM 返回 EPERM
ftruncate (77)🔶 Stub 返回 0,未实际操作

📊 整体进度

核心功能完成度

模块进度条形图
seL4 内核引导100%
ELF 加载器100%
Syscall 分发95%
内存管理 (brk/mmap)90%
文件 I/O (IPC ext4)75%
进程管理 (fork/clone)20%
管道/重定向10%
信号完整支持60%
iozone 端到端30%

🏁 开发时间线

2026-05-10
项目初始化 init
2026-06-02
移植到 x86_64 架构 feat: porting to x86_64
2026-06-03
支持真实 x86_64 机器 | 移植 blk-task 和 fs 任务 | 移除 rel4-linux-kit 符号链接
2026-06-06
添加 busybox 支持 | 修复关机逻辑 | 支持 ls 系统 | 最后一次提交
⚠️ 注意: 项目最后一次提交在 2026-06-06,距今已 43 天 未更新。

🚧 当前阻塞点

1. fork/clone 未实现
busybox 的 shell 需要 fork 来创建子进程。当前 sys_clone 返回 ENOSYS,这意味着:
  • 无法执行 sh -c "command" 以外的交互式 shell
  • 无法运行需要子进程的复杂脚本
  • iozone 本身可能依赖 fork
2. pipe/dup 未实现
shell 管道 cmd1 | cmd2 和 I/O 重定向依赖 pipe2 和 dup/dup3。当前均返回 ENOSYS。
3. fstat 不完整
对非设备 fd,fstat 仅获取文件大小但未写入完整的 struct stat 到用户空间。busybox 的 ls -l 等命令需要完整的 stat 信息。
4. 文件 I/O 路径已打通
好消息:LCL → IPC Client → ext4-srv → lwext4-task → blk-task 的完整路径已建立。 openat, read, write, close, lseek, getdents64, mkdirat, unlinkat 等核心文件操作已通过 IPC 实现。

✅ 已验证工作的功能

系统基础

  • seL4 内核引导和初始化
  • 51 个单元测试全部通过
  • seL4 IPC 通信正常
  • QEMU 软件仿真和 KVM 加速
  • BIOS/UEFI ISO 启动

Busybox 运行

  • ELF 加载(277 页预映射)
  • Shell 脚本执行 sh -c "..."
  • 交互式 shell(/ # 提示符)
  • ls 命令(通过 getdents64 + fstatat)
  • stdout/stderr 串口输出
  • Alpine rootfs ext4 镜像创建

📦 Crate 结构

Crate角色编译目标
root-task主入口,系统初始化,测试,busybox 运行x86_64-sel4 (no_std)
lclLinux 兼容层 — syscall 模拟核心x86_64-sel4 (no_std)
ext4-srvext4 文件系统 IPC 服务x86_64-sel4 (no_std)
blk-task块设备(ramdisk)x86_64-linux-musl
lwext4-taskext4 操作(lwext4_rust)x86_64-linux-musl
sel4-sys底层 seL4 syscall 包装(纯 asm)x86_64-sel4
sel4-ulibseL4 用户空间工具库x86_64-sel4
common共享常量、分配器、slot 管理x86_64-sel4
srv-gate服务门抽象(block, fs, uart)x86_64-sel4
libc-core最小 libc(errno, fcntl, types)x86_64-sel4

🗺️ 建议的下一步

优先级任务复杂度影响
🔴 P0实现 fork/clone(至少 CLONE_VM 模式)解锁交互式 shell 和子进程
🔴 P0实现 pipe2 + dup/dup3解锁 shell 管道和 I/O 重定向
🟡 P1完善 fstat(写入完整 struct stat)修复 ls -l 等命令
🟡 P1实现 renameat文件重命名操作
🟡 P1实现 ftruncate文件截断操作
🟢 P2完善 writev(实际写入数据)某些程序的输出
🟢 P2实现 pread64/pwrite64随机读写支持
🟢 P2实现 sendfile高效文件传输

📝 总结

mk-call-merge 是一个雄心勃勃的项目,目标是在 seL4 微内核上实现 Linux syscall 兼容层。项目在 6 天内从零发展到能运行 busybox shell,进展迅速。

核心成就:

主要差距:

距离 iozone 目标:需要先实现 fork、pipe、完善的文件操作,然后才能运行 iozone 基准测试。预估还需要 2-4 周 的密集开发。