feat(starry-kernel): add /proc/self/statm and /proc/loadavg, add procps test#853
Conversation
…ps test Implement /proc/self/statm (memory status in pages) and /proc/loadavg for procps-ng compatibility. Add QEMU test case that validates ps, free, uptime, pgrep, and /proc pseudo-filesystem entries. Closes rcore-os#846
There was a problem hiding this comment.
PR 审阅总结
整体质量很好,代码结构清晰,测试覆盖全面。具体分析如下:
内核改动 (proc.rs)
/proc/self/statm:
- 通过
aspace.lock().size() / 4096计算页面数,格式符合 Linux statm 规范 (size resident shared text lib data dt) ⚠️ 页面大小硬编码为 4096。目前代码库中没有PAGE_SIZE常量,在 StarryOS 支持的所有架构上 4096 都是标准值,所以可以接受。建议添加注释// 4096 bytes per page以增加可读性,或者后续考虑引入架构无关的页面大小常量resident = total_pages是一个合理的简化,没有实际的物理页面追踪
/proc/loadavg:
- 返回静态占位值
"0.00 0.00 0.00 1/1 1\n",格式正确 - 注释明确说明 "No real load tracking yet",诚实且合理
- 建议后续用动态任务计数替代
running/total字段,至少可以反映当前procs_running
测试部分
- 四架构 QEMU 配置(aarch64/riscv64/x86_64/loongarch64)保持一致,与现有测试模式吻合
- x86_64 使用
to_bin = false和timeout = 600,其他架构to_bin = true和timeout = 300,合理 - 测试脚本
procps-test.sh结构清晰:apk add procps失败时优雅降级pmap测试根据procps-ng是否安装条件执行- 覆盖了
ps、free、uptime、pgrep、/proc条目
success_regex/fail_regex配置正确
结论
LGTM,可以合并。后续可以考虑:
- 为
statm的 4096 页面大小添加注释或引入常量 - 将
loadavg的running/total改为动态获取实际运行中任务数
Powered by mimo-v2.5-pro
| let aspace = task.as_thread().proc_data.aspace(); | ||
| let aspace_lock = aspace.lock(); | ||
| let total_pages = aspace_lock.size() / 4096; | ||
| let resident = total_pages; |
There was a problem hiding this comment.
建议:4096 作为魔法数字出现,虽然在所有目标架构上都是正确的页面大小,但建议加一行注释说明,例如 // Standard page size for all supported architectures (x86_64, aarch64, riscv64, loongarch64)。后续如果引入了统一的页面大小常量,可以替换为该常量。
| @@ -785,6 +797,14 @@ | |||
There was a problem hiding this comment.
建议:1/1 和 1 是静态占位值。后续可以考虑用 tasks() 获取实际的运行中任务数和总任务数来填充 running/total 字段,last_pid 也可以用最大 pid。这样即使没有真实的负载均值,至少进程计数是准确的。
- Add comment explaining 4096 page size constant in statm - Use real task counts (running/total) in /proc/loadavg instead of static placeholder
There was a problem hiding this comment.
PR 审阅总结
本 PR 为 StarryOS 内核新增 /proc/<pid>/statm 和 /proc/loadavg 两个 procfs 条目,并添加 procps QEMU 测试用例。整体实现清晰、正确,之前的审阅反馈已在第二个 commit 中全部处理。
内核改动 (proc.rs)
/proc/<pid>/statm:
- 通过
aspace.size() / 4096计算总页面数,格式size resident shared text lib data dt符合 Linuxstatm规范 - 4096 页面大小已有注释说明,在当前支持的所有架构上均正确
resident = total_pages是合理简化(当前无物理页面追踪)
/proc/loadavg:
- 负载均值部分
0.00 0.00 0.00为静态占位(尚无真实负载追踪),可接受 running/total已改为通过tasks()获取真实任务计数,比初版1/1静态值更有实际意义,感谢采纳建议last_pid硬编码为 1,可接受- 格式
avg1 avg5 avg15 running/total last_pid与 Linux 一致
测试部分
- 四架构 QEMU 配置保持一致,
success_regex/fail_regex配置正确 procps-test.sh结构清晰:apk add procps失败时优雅降级,pmap测试条件执行- 覆盖了
ps、free、uptime、pgrep及 8 个/proc条目 - 测试判定逻辑
RET -eq 0 && -n "$OUTPUT"合理
验证
cargo fmt --check:通过git diff --check对 PR 改动文件:通过(drivers/npu/rockchip-npu/tests/test.rs的 trailing whitespace 为 dev 已有问题,非本 PR 引入)- PR 作者声称本地
cargo xtask starry test qemu --arch aarch64 -g normal -c procps15 PASS / 0 FAIL
重复/重叠分析
origin/dev上不存在statm或loadavg,无重复- 搜索了相关 open PR(statm、loadavg、procfs、proc.rs),未发现实现相同功能的 PR
- PR #837 (kallsyms) 同为 procfs 改动但完全不同的文件,无冲突风险
前次审阅反馈
两处 inline comment 均已在 commit 1e6c28e 中处理:
- 为 4096 添加了注释 ✓
loadavg的running/total改为动态获取 ✓
结论
LGTM,可以合并。后续可考虑:
- 引入统一页面大小常量替换硬编码 4096
- 实现真实的负载均值追踪
Powered by glm-5.1
On riscv64, procps-ng installs successfully but pmap fails at runtime because it calls riscv_hwprobe (unimplemented in StarryOS). Probe the tool before running the test to avoid false-negative FAIL.
There was a problem hiding this comment.
PR 审阅总结
本 PR 为 StarryOS 内核新增 /proc/<pid>/statm 和 /proc/loadavg 两个 procfs 条目,并添加 procps QEMU 测试用例,用于验证 ps、free、uptime、pgrep、pmap 及 /proc 条目。整体实现清晰正确,前次审阅反馈已全部处理。
内核改动 (proc.rs)
/proc/<pid>/statm:
- 通过
aspace.size() / 4096计算总页面数,格式size resident shared text lib data dt符合 Linuxstatm规范(man proc) - 页面大小 4096 已有注释说明,在所有当前支持架构(x86_64/aarch64/riscv64/loongarch64)上均正确
resident = total_pages是合理简化(当前无物理页面追踪机制)- 地址空间锁 (
aspace.lock()) 的使用方式与同文件render_thread_maps()一致
/proc/loadavg:
- 负载均值
0.00 0.00 0.00为静态占位,格式avg1 avg5 avg15 running/total last_pid与 Linux 一致 running/total已通过tasks()动态获取,过滤条件TaskState::Running | TaskState::Ready与render_stat()中procs_running的计算逻辑一致last_pid硬编码为 1,可接受
测试部分
- 四架构 QEMU 配置保持一致,
success_regex/fail_regex配置正确 procps-test.sh结构清晰:apk add procps失败时优雅降级,pmap测试条件执行- 覆盖了 ps(3 种参数)、free(2 种参数)、uptime、pgrep、pmap 及 8 个 /proc 条目
- 测试判定逻辑
RET -eq 0 && -n "$OUTPUT"合理,不会误判空输出为通过 - 测试放置位置
test-suit/starryos/normal/qemu-smp1/procps/符合项目测试组织规范
验证
cargo fmt --check:通过git diff --check:通过(无 trailing whitespace、无冲突标记)- PR 作者声称本地
cargo xtask starry test qemu --arch aarch64 -g normal -c procps15 PASS / 0 FAIL
重复/重叠分析
origin/dev上不存在statm或loadavg的实现,无重复- 搜索了相关 open PR(statm、loadavg、procfs、proc.rs),未发现实现相同功能的 PR
- PR #837 (kallsyms) 同为 procfs 改动但涉及完全不同的文件,无冲突风险
前次审阅反馈
两处 inline comment 均已在后续 commit 中处理:
- 为 4096 添加了注释 ✓
loadavg的running/total改为动态获取 ✓
后续建议(非阻塞)
- 引入统一页面大小常量替换硬编码 4096
- 实现真实的负载均值追踪
- 为
loadavg的last_pid字段提供动态值
结论
LGTM,可以合并。Closes #846。
Powered by glm-5.1
Summary
/proc/self/statm(进程内存页面统计)和/proc/loadavg(系统负载均值)改动
内核 (
os/StarryOS/kernel/src/pseudofs/proc.rs):/proc/<pid>/statm: 返回进程地址空间大小(页数),resident 近似为 total/proc/loadavg: 返回静态占位值(尚无真实负载追踪)测试 (
test-suit/starryos/normal/qemu-smp1/procps/):sh/procps-test.sh: 测试 ps/free/uptime/pgrep/pmap + /proc entriesTest plan
cargo xtask starry build --arch aarch64编译通过cargo xtask starry test qemu --arch aarch64 -g normal -c procps本地 15 PASS / 0 FAILCloses #846