Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
6539ed3
docs(harness): establish project guidance and ignore local worktrees
mistcoversmyeyes Sep 21, 2026
6b25072
docs(lmbench): define runner architecture and full-suite implementati…
mistcoversmyeyes Sep 21, 2026
0bba884
feat(lmbench): add portable full-suite runner and regression tests
mistcoversmyeyes Sep 21, 2026
4826b83
build(lmbench): package benchmark binaries and guest scripts
mistcoversmyeyes Sep 21, 2026
a11945a
feat(lmbench): integrate qemu execution and result collection
mistcoversmyeyes Sep 21, 2026
0acb0d9
ci(lmbench): add benchmark workflow
mistcoversmyeyes Sep 21, 2026
c06385e
docs(lmbench): record recovery validation and remaining limitations
mistcoversmyeyes Sep 21, 2026
573bcfa
fix(dadk/ubuntu2404): append lmbench install config for ubuntu2404 ro…
mistcoversmyeyes Sep 22, 2026
6108fc7
fix(lmbench): restore terminal output newline handling
mistcoversmyeyes Sep 22, 2026
edebb08
chore(gvisor): 启用 alarm_test 测试集
mistcoversmyeyes Sep 23, 2026
3413080
feat(app-blocklist): enable lmbench app installation
mistcoversmyeyes Sep 25, 2026
9eb6169
fix(init): include system administration directories in path
mistcoversmyeyes Sep 25, 2026
8eddcaf
docs(harness): authorize atomic commits in agent workflow
mistcoversmyeyes Sep 27, 2026
4abd26a
docs(harness): simplify workflow map description
mistcoversmyeyes Sep 27, 2026
b38f940
test(lmbench): exclude observed guest runtime blockers
mistcoversmyeyes Sep 30, 2026
19d2ce4
chore(lmbench/whitelist): 屏蔽 block 的测试用例
mistcoversmyeyes Sep 30, 2026
dd54d71
chore(config/app-blocklist): 将 lmbench app 移除 DADK 全局安装黑名单
mistcoversmyeyes Sep 30, 2026
b069390
chore(/): 添加测试目录软链接
mistcoversmyeyes Sep 30, 2026
685c8d6
fix(qemu): align nix guest memory with 2g default
mistcoversmyeyes Sep 30, 2026
35e2324
fix(lmbench): use temporary disk writes for benchmark runs
mistcoversmyeyes Sep 30, 2026
005ead6
docs(lmbench): move harness plans into benchmark directory
mistcoversmyeyes Oct 1, 2026
24eeae8
fix(lmbench): install and enable fifo cleanup in the suite runner
mistcoversmyeyes Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: LMbench Benchmark x86_64

# MVP scope: build DragonOS, run the lmbench performance suite under QEMU, and
# archive the per-run result JSON + serial log. No regression gating / charts yet.
on:
workflow_dispatch:
push:
branches: ["feat/lmbench*", "feat-lmbench*"]

env:
ARCH: x86_64
HOME: /root
RUSTUP_DIST_SERVER: "https://rsproxy.cn"
RUSTUP_UPDATE_ROOT: "https://rsproxy.cn/rustup"

jobs:
benchmark:
name: LMbench
runs-on: ubuntu-latest
# Benchmarks are slow: monitor allows up to a 60-minute run, plus build/cleanup.
timeout-minutes: 90
container:
image: dragonos/dragonos-dev:v1.23
options: --privileged -v /dev:/dev
steps:
- name: Checkout DragonOS code
uses: actions/checkout@v4

- name: Change source
run: |
find . -type f \( -name "*.toml" -o -name "Makefile" \) -exec sed -i 's/git\.mirrors\.dragonos\.org\.cn/github\.com/g' {} +

- name: Ensure jsonschema for the result collector
run: pip3 install --quiet jsonschema || true

- name: Build DragonOS
shell: bash -ileo pipefail {0}
run: |
make clean
make -j$(nproc) all

- name: Run lmbench benchmark
shell: bash -ileo pipefail {0}
env:
DISK_SAVE_MODE: "1"
run: |
make test-benchmark

- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: lmbench-results-x86_64-${{ github.run_id }}-${{ github.run_attempt }}
path: |
user/apps/tests/benchmark/lmbench/results/**
if-no-files-found: warn

- name: Preserve benchmark serial log
if: always()
uses: actions/upload-artifact@v4
with:
name: lmbench-serial-x86_64-${{ github.run_id }}-${{ github.run_attempt }}
path: serial_opt.txt
if-no-files-found: error
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,9 @@ __pycache__/
*.cpio.xz
*.cpio*
.direnv/

# worktrees
*worktree*/

# Claude Code agent worktrees (local isolation dirs, never for VCS)
.claude/worktrees/
87 changes: 31 additions & 56 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,56 +1,31 @@
# README for AI Agents

## 项目简介

DragonOS是一个面向云计算轻量化场景的,完全自主内核的,提供Linux二进制兼容性的64位操作系统,旨在为容器化工作负载提供轻量级、高性能的解决方案。

## 设计思想

- Linux兼容性:系统调用接口/procfs/sysfs/devfs等的行为应当符合Linux语义。参考Linux 6.6的行为进行实现。
- 轻量:简化复杂的抽象设计,保留合理的、简洁、符合Rust开发最佳实践的的抽象,提升系统性能。
- 安全:注重内存安全、并发安全


## 开发准则

### 交互语言规范

- 所有AI助手在回应DragonOS仓库内的请求时必须使用简体中文。
- 即便用户使用其他语言输入,也需以中文回答,除非更高优先级的指令明确要求使用其他语言。

### 项目目录结构:

- 文档:在`docs/`目录下
- 内核:在`kernel/`目录下
- 自行编写的单元测试程序:在`user/apps/c_unitest`目录下
- gvisor系统调用测试程序:根据用户给出的程序代码片段来读取测试代码。如果用户没有提供,就尝试寻找,如果找不到,则从 https://cnb.cool/DragonOS-Community/gvisor/-/tree/dragonos/release-20250616.0/test/syscalls/linux 下面获取(下载文件然后再尝试读取)


### 开发最佳实践

- 三思而后行!深度研究,掌握解决问题所必要的信息,然后再动手开发/修复。
- 设计要具有合理抽象,避免过度抽象。并且要注意代码复用。
- 实现代码的时候,多问问自己:这代码写在这里合理吗?(架构、正确性等方面)
- 高内聚、低耦合
- 符合Linux语义
- 不得使用workaround的方法绕过问题。要从本质解决问题!


**测试修复相关**

- 符合Linux 6.6的语义
- 结合测例报错、测例代码、DragonOS代码、Linux行为实现来深入分析

### 开发时的一些常见命令

- 编译内核:在项目根目录下运行`make kernel`. 当你想检查你编辑的代码有没有语法错误的时候,请执行这个命令
- Nix开发环境(推荐):`nix develop`激活环境后可使用上述命令;`nix run .#yolo-x86_64`一键编译+启动QEMU。详见`docs/introduction/develop_nix.md`


## WHERE TO LOOK

| 任务 | 位置 | 备注 |
|------|------|------|
| 运行 DragonOS | `docs/introduction/develop_nix.md` | Nix 一键启动流程 |
| OOM Killer | `kernel/src/mm/oom.rs` | 全局状态机,缺页路径触发,详见代码注释 |
| 进程管理重构后 | `kernel/src/process/state.rs`(ProcessFlags)、`kernel/src/process/manager/exit.rs`(exit路径) | mod.rs 已拆分为子模块 |
# AGENTS.md — DragonOS 文档 Harness 地图

> DragonOS 是面向云计算轻量化场景、提供 Linux 二进制兼容性的 64 位自主内核操作系统,目标是为容器化工作负载提供轻量、高性能的运行环境。

本文件只负责路由 Harness 文档。源码布局、工程约束和操作命令分别由下列文档维护,按任务需要读取:

```text
AGENTS.md ← Harness 文档总地图
ARCHITECTURE.md ← 系统边界、目录职责与阅读路由
FORCE_CONSTRAIN.md ← 交互、兼容性、安全与开发强约束
KEY_INFO_REMINDER.md ← 构建、Nix 环境与 QEMU 关键命令
harness/ ← 深层 Harness 文档
├── constraints/ ← 局部操作约束入口
│ ├── COMMIT.md ← 提交上下文与权威规范入口
│ └── WORKFLOW.md ← 开发工作流
├── product-specs/ ← 产品需求文档
│ └── index.md ← 问题、价值、范围与需求索引
├── design-docs/ ← 设计意图文档
│ └── index.md ← 技术方案与权衡索引
├── exec-plans/ ← 执行计划与债务跟踪
│ ├── active/ ← 进行中的实施计划
│ ├── completed/ ← 已完成的实施计划
│ ├── tech-debt-tracker.md ← 技术债跟踪
│ └── product-debt-tracker.md ← 产品债跟踪
├── references/ ← 可复用参考资料
│ └── index.md ← 参考资料索引
└── generated/ ← 生成型文档预留目录
tests/benchmark/lmbench/harness/ ← LMbench 专属 Harness 文档
```

以上路径均相对仓库根目录,按任务读取对应权威文档。
35 changes: 35 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# DragonOS 架构与源码地图

## 系统概览

DragonOS 是一个使用自主内核的 64 位操作系统,面向云计算轻量化场景并提供 Linux 二进制兼容性。系统以容器化工作负载的轻量、高性能运行需求为目标;具体实现必须同时遵守 [FORCE_CONSTRAIN.md](FORCE_CONSTRAIN.md) 中的 Linux 语义、轻量化和安全约束。

## 仓库目录职责

根目录的 `Makefile` 统一编排 `kernel`、`user`、`tools` 和 `build-scripts`。阅读或修改代码时,先按下列职责定位,避免把实现放入职责不相符的目录:

| 路径 | 职责 |
| --- | --- |
| `kernel/` | DragonOS 内核实现及其内核侧构建配置。 |
| `user/` | 用户空间应用、rootfs 组成和用户程序构建配置。 |
| `build-scripts/` | 构建过程使用的 Rust 工具和构建辅助程序。 |
| `config/` | 应用选择、rootfs manifest 等仓库级构建配置。 |
| `tools/` | 构建、镜像制作、运行、调试及开发环境辅助工具。 |
| `docs/` | 项目文档与开发指南。 |
| `harness/` | 二级 Harness 文档,包括规格、设计说明、执行计划、约束入口和参考资料。 |

## 测试代码路由

自行编写的单元测试程序位于 `user/apps/c_unitest/`。

分析 gVisor 系统调用测试时,优先读取用户提供的测试程序代码片段;用户未提供时,先在仓库及现有材料中查找。仍然找不到时,再从 [DragonOS-Community/gvisor 的指定测试目录](https://cnb.cool/DragonOS-Community/gvisor/-/tree/dragonos/release-20250616.0/test/syscalls/linux) 获取对应文件,下载后再读取和分析。这个顺序可以保证分析优先基于调用上下文和本地证据,同时保留外部测试源作为最后的权威补充。

## 高频阅读路由

| 任务 | 入口 | 局部上下文 |
| --- | --- | --- |
| 运行 DragonOS | [docs/introduction/develop_nix.md](docs/introduction/develop_nix.md) | Nix 开发环境和启动流程;常用命令另见 [KEY_INFO_REMINDER.md](KEY_INFO_REMINDER.md)。 |
| 理解 OOM Killer | `kernel/src/mm/oom.rs` | 全局状态机及缺页路径触发逻辑,细节以源码注释和对应内存管理文档为准。 |
| 理解进程管理重构后的状态与退出路径 | `kernel/src/process/state.rs`、`kernel/src/process/manager/exit.rs` | `ProcessFlags` 位于前者,退出路径位于后者;原 `mod.rs` 职责已拆分到子模块。 |

本文只提供稳定的阅读地图,不展开各子系统内部设计;进入具体模块后,应继续以对应源码和专题文档为依据。
31 changes: 31 additions & 0 deletions FORCE_CONSTRAIN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# DragonOS 强约束

本文件是仓库内开发行为与工程取舍的权威约束。它保留无法仅从代码或构建脚本稳定推导的理由和适用范围;具体源码位置由 [ARCHITECTURE.md](ARCHITECTURE.md) 路由。

## 交互语言

所有 AI 助手回应 DragonOS 仓库内的请求时必须使用简体中文。即使用户使用其他语言输入,也仍应使用简体中文回答,除非更高优先级的指令明确要求使用其他语言。该约束作用于仓库相关的解释、计划、检查结果和交付说明,目的是保持项目协作语言一致。

## 兼容性、轻量化与安全

系统调用接口以及 `/proc`、`/sys`、`devfs` 等用户可见行为必须符合 Linux 语义,并以 Linux 6.6 的行为作为实现参考。兼容性判断应落实到可观察行为,不能只追求接口名称或表面返回值相似。

轻量化要求实现采用合理、简洁并符合 Rust 最佳实践的抽象,避免为了形式完整而过度抽象。抽象应服务于复用、清晰边界和性能,而不是增加无必要的层次。

安全性要求设计和实现同时重视内存安全与并发安全。涉及共享状态、生命周期或并发路径时,必须把安全性作为架构与正确性的一部分分析,不能留给事后补救。

## 开发与修复方法

开始开发或修复前,必须先研究完成判断所需的代码、测试和外部语义证据。这样做是为了避免在未理解调用关系和行为契约时引入局部修补。

设计应保持高内聚、低耦合,优先复用已有的合理能力,并持续检查代码所在模块是否符合架构职责。既要避免重复实现,也要避免为了复用而制造与问题规模不相称的抽象。

禁止使用 workaround 绕过根因。修复必须解释问题为何发生,并在正确的职责边界内解决;如果问题涉及兼容行为,应以 Linux 语义而不是测例偶然通过作为完成标准。

测试修复必须结合测例报错、测例代码、DragonOS 实现和 Linux 行为进行分析,并符合 Linux 6.6 语义。该要求适用于系统调用及相关内核行为的缺陷定位,目的是防止只针对单个输入打补丁。

## 文档职责

需求的权威入口是 [harness/product-specs/index.md](harness/product-specs/index.md),设计意图和权衡的权威入口是 [harness/design-docs/index.md](harness/design-docs/index.md),执行步骤位于 `harness/exec-plans/`。新增内容应进入对应职责的文档,避免在多个位置形成竞争定义。

开始任何会修改仓库的任务前,必须阅读 [harness/constraints/WORKFLOW.md](harness/constraints/WORKFLOW.md),并按其中的原子化提交条件在工作单元完成时直接本地提交,无需再次请求确认,避免变更积压。提交边界和例外以该工作流文档为准。提交消息格式由 [harness/constraints/COMMIT.md](harness/constraints/COMMIT.md) 路由至权威贡献规范。
9 changes: 9 additions & 0 deletions KEY_INFO_REMINDER.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# DragonOS 关键命令

## 构建与运行

在仓库根目录执行 `make kernel` 编译内核;需要检查内核代码是否存在编译或语法问题时,也使用该命令。

推荐先执行 `nix develop` 进入 Nix 开发环境,再运行仓库构建命令。需要一键完成 x86_64 构建并启动 QEMU 时,执行 `nix run .#yolo-x86_64`。

Nix 安装、flake 配置、分步构建和 QEMU 操作方式以 [docs/introduction/develop_nix.md](docs/introduction/develop_nix.md) 为准。可用 flake 目标可能随仓库演进而变化,需要发现其他目标时在根目录执行 `nix flake show`,不要在本文复制完整目标清单。
21 changes: 21 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,27 @@ test-syscall: prepare_rootfs_manifest
exit $$status; \
}

test-benchmark: prepare_rootfs_manifest
@set -e; \
cleanup() { bash user/apps/tests/benchmark/lmbench/toggle_compile_lmbench.sh disable; }; \
trap cleanup EXIT; \
echo "构建运行并执行lmbench性能基准测试"; \
bash user/apps/tests/benchmark/lmbench/toggle_compile_lmbench.sh enable; \
$(MAKE) all -j $(NPROCS); \
if [ "$(DISK_SAVE_MODE)" = "1" ]; then \
echo "磁盘节省模式启用,正在清理用户程序构建缓存..."; \
$(DADK) -f $(ROOT_PATH)/dadk-manifest.generated.toml user clean --level in-src -w $(ROOT_PATH); \
fi; \
SKIP_GRUB=1 $(MAKE) write_diskimage; \
$(MAKE) qemu-nographic DRAGONOS_QEMU_SNAPSHOT=1 AUTO_TEST=benchmark BENCHMARK_TEST_DIR=/opt/tests/benchmark/lmbench & \
sleep 5; \
status=0; \
bash user/apps/tests/benchmark/lmbench/orchestrator/monitor_test_results.sh || status=$$?; \
if [ $$status -eq 0 ]; then \
python3 user/apps/tests/benchmark/lmbench/orchestrator/collect_results.py || status=$$?; \
fi; \
exit $$status

test-dunit: prepare_rootfs_manifest
@echo "构建运行并执行dunitest测试"
$(MAKE) all -j $(NPROCS)
Expand Down
1 change: 1 addition & 0 deletions config/app-blocklist.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ log_skipped = true
# 屏蔽gvisor系统调用测试
blocked_apps = [
{ name = "gvisor syscall tests", reason = "由于文件较大,因此屏蔽。如果要允许系统调用测试,则把这行取消注释即可" },
# { name = "lmbench benchmark tests", reason = "性能基准套件,默认屏蔽以免拖慢常规构建;make test-benchmark 会临时启用此行(注释即可启用)" },
{ name = "test_ebpf_new", reason = "2025.11.17,aya上游发版有问题,导致ci过不了,暂时禁用" },
{ name = "test_ebpf_tp", reason = "2025.11.17,aya上游发版有问题,导致ci过不了,暂时禁用" },
{ name = "runcell", reason = "依赖项依赖github,可能网络问题导致编不过" },
Expand Down
Loading
Loading