Skip to content

feat(starry-kernel): add /proc/self/statm and /proc/loadavg, add procps test#853

Merged
ZR233 merged 3 commits into
rcore-os:devfrom
nina-ysml:feat/starry-app-procps
May 25, 2026
Merged

feat(starry-kernel): add /proc/self/statm and /proc/loadavg, add procps test#853
ZR233 merged 3 commits into
rcore-os:devfrom
nina-ysml:feat/starry-app-procps

Conversation

@nina-ysml

Copy link
Copy Markdown
Contributor

Summary

  • 实现 /proc/self/statm(进程内存页面统计)和 /proc/loadavg(系统负载均值)
  • 新增 procps QEMU 测试用例,验证 ps、free、uptime、pgrep 及 /proc 伪文件系统条目
  • procps-ng 安装成功时额外测试 pmap,未安装时自动跳过

改动

内核 (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 entries
  • 四架构 QEMU 配置(aarch64/riscv64/x86_64/loongarch64)

Test plan

  • cargo xtask starry build --arch aarch64 编译通过
  • cargo xtask starry test qemu --arch aarch64 -g normal -c procps 本地 15 PASS / 0 FAIL
  • CI 四架构测试通过(CI 环境可安装 procps-ng,pmap 也会被测试)

Closes #846

…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

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 = falsetimeout = 600,其他架构 to_bin = truetimeout = 300,合理
  • 测试脚本 procps-test.sh 结构清晰:
    • apk add procps 失败时优雅降级
    • pmap 测试根据 procps-ng 是否安装条件执行
    • 覆盖了 psfreeuptimepgrep/proc 条目
  • success_regex / fail_regex 配置正确

结论

LGTM,可以合并。后续可以考虑:

  1. statm 的 4096 页面大小添加注释或引入常量
  2. loadavgrunning/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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:4096 作为魔法数字出现,虽然在所有目标架构上都是正确的页面大小,但建议加一行注释说明,例如 // Standard page size for all supported architectures (x86_64, aarch64, riscv64, loongarch64)。后续如果引入了统一的页面大小常量,可以替换为该常量。

@@ -785,6 +797,14 @@

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议:1/11 是静态占位值。后续可以考虑用 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

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 符合 Linux statm 规范
  • 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 测试条件执行
  • 覆盖了 psfreeuptimepgrep 及 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 procps 15 PASS / 0 FAIL

重复/重叠分析

  • origin/dev 上不存在 statmloadavg,无重复
  • 搜索了相关 open PR(statm、loadavg、procfs、proc.rs),未发现实现相同功能的 PR
  • PR #837 (kallsyms) 同为 procfs 改动但完全不同的文件,无冲突风险

前次审阅反馈

两处 inline comment 均已在 commit 1e6c28e 中处理:

  1. 为 4096 添加了注释 ✓
  2. loadavgrunning/total 改为动态获取 ✓

结论

LGTM,可以合并。后续可考虑:

  1. 引入统一页面大小常量替换硬编码 4096
  2. 实现真实的负载均值追踪

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.

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 符合 Linux statm 规范(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::Readyrender_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 procps 15 PASS / 0 FAIL

重复/重叠分析

  • origin/dev 上不存在 statmloadavg 的实现,无重复
  • 搜索了相关 open PR(statm、loadavg、procfs、proc.rs),未发现实现相同功能的 PR
  • PR #837 (kallsyms) 同为 procfs 改动但涉及完全不同的文件,无冲突风险

前次审阅反馈

两处 inline comment 均已在后续 commit 中处理:

  1. 为 4096 添加了注释 ✓
  2. loadavgrunning/total 改为动态获取 ✓

后续建议(非阻塞)

  1. 引入统一页面大小常量替换硬编码 4096
  2. 实现真实的负载均值追踪
  3. loadavglast_pid 字段提供动态值

结论

LGTM,可以合并。Closes #846

Powered by glm-5.1

@ZR233
ZR233 merged commit 5a033bf into rcore-os:dev May 25, 2026
43 checks passed
This was referenced May 25, 2026
@github-actions github-actions Bot mentioned this pull request Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[StarryOS] Support procps-ng (ps, top, free, pmap)

2 participants