Skip to content

[fix][lwp]Update the vdso framework#11340

Open
rcitach wants to merge 7 commits intoRT-Thread:masterfrom
rcitach:rcitach/vdso
Open

[fix][lwp]Update the vdso framework#11340
rcitach wants to merge 7 commits intoRT-Thread:masterfrom
rcitach:rcitach/vdso

Conversation

@rcitach
Copy link
Copy Markdown
Contributor

@rcitach rcitach commented Apr 21, 2026

拉取/合并请求描述:(PR description)

[

为什么提交这份PR (why to submit this PR)

riscv 架构开启 RT-SMART 后,用户态调用 time / clock_gettime 一类接口时会进入 vDSO 路径,触发任务崩溃。

同时,原有 vDSO 相关文件命名和职责划分不清晰,内核侧、用户侧、共享数据页定义分散,后续维护和定位问题成本较高。

你的解决方案是什么 (what is your solution)

本次修改对 RT-Thread 的 vDSO 进行了整理和修复,主要包括:

  1. 重构 vDSO 目录结构和命名
  • 统一共享定义、内核侧实现、用户侧实现的文件命名和层次关系;
  • 新增统一的共享头文件、数据页定义、内核接口头文件和用户侧内部实现文件;
  • 删除旧的 vdso.hvdso_data.hvdso_datapage.hvdso_sys.* 等历史实现,避免同一能力存在多套命名和逻辑。
  1. 重写内核侧 vDSO 运行时逻辑
  • 使用独立的 vDSO 数据页保存 seq_countercounter_lastcounter_freqbase_time[] 等共享时间数据;
  1. 修复 monotonic 时间采样不一致问题
  • 原实现中 base_timecounter_last 不是同一采样点,用户态按 base_time + (now - counter_last) 计算时会产生固定偏差;
  • 现在改为基于同一次 counter 快照生成 base_timecounter_last,保证 CLOCK_MONOTONIC 计算一致。
  1. 补齐 realtime 同步和回退逻辑
  • 新增 realtime_offset 缓存与 RT_VDSO_FLAG_REALTIME_VALID 标志;
  • settimeofday() / clock_settime() 成功后同步刷新 vDSO realtime 数据;
  • 当 realtime 尚未就绪时,vDSO 对 CLOCK_REALTIME 返回 -ENOSYS,由 musl 自动回退到 syscall 路径,避免用户态拿到错误时间数据。
  1. 修复用户态 vDSO 构建链路
  • 新增统一的 components/lwp/vdso/user/SConstruct
  • 统一 aarch64/risc-v 的 vDSO 链接脚本和共享页符号定义。

请提供验证的bsp和config (provide the config and bsp)

  • BSP:
    qemu-virt-aarch64 与 qemu-virt-riscv
  • .config:
  • action:

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • [√ ] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • 代码是高质量的 Code in this PR is of high quality
  • 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • 如果是新增bsp, 已经添加ci检查到.github/ALL_BSP_COMPILE.json 详细请参考链接BSP自查

@rcitach rcitach requested a review from BernardXiong as a code owner April 21, 2026 09:55
@github-actions
Copy link
Copy Markdown

👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread!

为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。
To ensure your code complies with RT-Thread's coding style, please run the code formatting workflow by following the steps below (If the formatting of CI fails to run).


🛠 操作步骤 | Steps

  1. 前往 Actions 页面 | Go to the Actions page
    点击进入工作流 → | Click to open workflow →

  2. 点击 Run workflow | Click Run workflow

  • 设置需排除的文件/目录(目录请以"/"结尾)
    Set files/directories to exclude (directories should end with "/")
  • 将目标分支设置为 \ Set the target branch to:rcitach/vdso
  • 设置PR number为 \ Set the PR number to:11340
  1. 等待工作流完成 | Wait for the workflow to complete
    格式化后的代码将自动推送至你的分支。
    The formatted code will be automatically pushed to your branch.

完成后,提交将自动更新至 rcitach/vdso 分支,关联的 Pull Request 也会同步更新。
Once completed, commits will be pushed to the rcitach/vdso branch automatically, and the related Pull Request will be updated.

如有问题欢迎联系我们,再次感谢您的贡献!💐
If you have any questions, feel free to reach out. Thanks again for your contribution!

@github-actions github-actions Bot added Kernel PR has src relate code RT-Smart RT-Thread Smart related PR or issues component: lwp Component labels Apr 21, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 21, 2026

📌 Code Review Assignment

🏷️ Tag: components

Reviewers: Maihuanyi

Changed Files (Click to expand)
  • components/libc/compilers/common/ctime.c
  • components/lwp/SConscript
  • components/lwp/arch/aarch64/common/vdso_data.c
  • components/lwp/arch/common/vdso.c
  • components/lwp/arch/common/vdso_kernel.c
  • components/lwp/arch/risc-v/common/vdso_data.c
  • components/lwp/lwp_elf.c
  • components/lwp/vdso/Kconfig
  • components/lwp/vdso/SConscript
  • components/lwp/vdso/kernel/vdso.h
  • components/lwp/vdso/kernel/vdso_data.h
  • components/lwp/vdso/kernel/vdso_image.S
  • components/lwp/vdso/kernel/vdso_kernel.h
  • components/lwp/vdso/kernel/vdso_kernel_internal.h
  • components/lwp/vdso/user/SConstruct
  • components/lwp/vdso/user/arch/aarch64/SConstruct
  • components/lwp/vdso/user/arch/aarch64/vdso.lds.S
  • components/lwp/vdso/user/arch/aarch64/vdso_arch.h
  • components/lwp/vdso/user/arch/aarch64/vdso_sys.c
  • components/lwp/vdso/user/arch/aarch64/vdso_sys.h
  • components/lwp/vdso/user/arch/arm/vdso.lds.S
  • components/lwp/vdso/user/arch/arm/vdso_arch.h
  • components/lwp/vdso/user/arch/risc-v/SConstruct
  • components/lwp/vdso/user/arch/risc-v/vdso.lds.S
  • components/lwp/vdso/user/arch/risc-v/vdso_arch.h
  • components/lwp/vdso/user/arch/risc-v/vdso_sys.c
  • components/lwp/vdso/user/arch/risc-v/vdso_sys.h
  • components/lwp/vdso/user/common/vdso_clock_gettime.c
  • components/lwp/vdso/user/common/vdso_user_internal.h
  • components/lwp/vdso/vdso_config.h

🏷️ Tag: components_libc

Reviewers: GorrayLi mysterywolf

Changed Files (Click to expand)
  • components/libc/compilers/common/ctime.c

🏷️ Tag: components_lwp

Reviewers: xu18838022837

Changed Files (Click to expand)
  • components/lwp/SConscript
  • components/lwp/arch/aarch64/common/vdso_data.c
  • components/lwp/arch/common/vdso.c
  • components/lwp/arch/common/vdso_kernel.c
  • components/lwp/arch/risc-v/common/vdso_data.c
  • components/lwp/lwp_elf.c
  • components/lwp/vdso/Kconfig
  • components/lwp/vdso/SConscript
  • components/lwp/vdso/kernel/vdso.h
  • components/lwp/vdso/kernel/vdso_data.h
  • components/lwp/vdso/kernel/vdso_image.S
  • components/lwp/vdso/kernel/vdso_kernel.h
  • components/lwp/vdso/kernel/vdso_kernel_internal.h
  • components/lwp/vdso/user/SConstruct
  • components/lwp/vdso/user/arch/aarch64/SConstruct
  • components/lwp/vdso/user/arch/aarch64/vdso.lds.S
  • components/lwp/vdso/user/arch/aarch64/vdso_arch.h
  • components/lwp/vdso/user/arch/aarch64/vdso_sys.c
  • components/lwp/vdso/user/arch/aarch64/vdso_sys.h
  • components/lwp/vdso/user/arch/arm/vdso.lds.S
  • components/lwp/vdso/user/arch/arm/vdso_arch.h
  • components/lwp/vdso/user/arch/risc-v/SConstruct
  • components/lwp/vdso/user/arch/risc-v/vdso.lds.S
  • components/lwp/vdso/user/arch/risc-v/vdso_arch.h
  • components/lwp/vdso/user/arch/risc-v/vdso_sys.c
  • components/lwp/vdso/user/arch/risc-v/vdso_sys.h
  • components/lwp/vdso/user/common/vdso_clock_gettime.c
  • components/lwp/vdso/user/common/vdso_user_internal.h
  • components/lwp/vdso/vdso_config.h

📊 Current Review Status (Last Updated: 2026-04-24 17:48 CST)

  • GorrayLi Pending Review
  • Maihuanyi Pending Review
  • mysterywolf Pending Review
  • xu18838022837 Pending Review

📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态
    Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm
    Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认
    PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。
ℹ️ Refresh CI status operation requires repository Write permission.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors and fixes the RT-Thread RT-SMART vDSO time path (notably clock_gettime/time) to avoid user-mode crashes and to make kernel/user/shared-page responsibilities clearer.

本次 PR 对 RT-Thread RT-SMART 的 vDSO 时间路径(主要是 clock_gettime/time)进行重构与修复,避免用户态崩溃,并梳理内核/用户/共享页的职责边界。

Changes:

  • Reworked vDSO shared data page + kernel runtime, and updated tick/realtime synchronization hooks. / 重构 vDSO 共享数据页与内核运行时,并更新 tick/实时钟同步路径
  • Rebuilt user-side vDSO implementation and unified linker scripts/build flow for aarch64 & riscv64. / 重建用户态 vDSO 实现,统一 aarch64/riscv64 链接脚本与构建流程
  • Removed legacy vDSO headers/impl files to reduce duplication. / 删除历史 vDSO 相关文件以减少重复实现

Reviewed changes

Copilot reviewed 32 out of 32 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/clock.c Call new rt_vdso_sync_clock_data() on ticks / 在 tick 增加时同步 vDSO 时钟数据
components/lwp/vdso/vdso_weak.c Removed legacy weak stubs / 删除旧弱符号兜底实现
components/lwp/vdso/vdso_datapage.h Removed legacy shared-page definition / 删除旧共享页定义
components/lwp/vdso/vdso_data_page.h New shared clock data page layout / 新共享时钟数据页结构
components/lwp/vdso/vdso_constants.h New shared constants (page size, image path) / 新公共常量定义(页大小、镜像路径)
components/lwp/vdso/vdso_config.h Removed legacy config header / 删除旧配置头
components/lwp/vdso/user/common/vdso_user_internal.h New user-side seqlock helpers & barriers / 新用户态 seqlock 辅助与屏障
components/lwp/vdso/user/common/vdso_clock_gettime.c New vDSO clock_gettime implementation / 新 vDSO clock_gettime 实现
components/lwp/vdso/user/arch/risc-v/vdso_sys.h Removed legacy arch-specific user code / 删除旧 RISC-V 用户态实现
components/lwp/vdso/user/arch/risc-v/vdso_sys.c Removed legacy arch-specific user code / 删除旧 RISC-V 用户态实现
components/lwp/vdso/user/arch/risc-v/vdso_arch.h New RISC-V arch helpers / 新 RISC-V 架构辅助
components/lwp/vdso/user/arch/risc-v/vdso.lds.S Updated RISC-V vDSO linker script / 更新 RISC-V vDSO 链接脚本
components/lwp/vdso/user/arch/risc-v/SConstruct Removed per-arch build script / 删除按架构拆分的构建脚本
components/lwp/vdso/user/arch/aarch64/vdso_sys.h Removed legacy arch-specific user code / 删除旧 AArch64 用户态实现
components/lwp/vdso/user/arch/aarch64/vdso_sys.c Removed legacy arch-specific user code / 删除旧 AArch64 用户态实现
components/lwp/vdso/user/arch/aarch64/vdso_arch.h New AArch64 arch helpers / 新 AArch64 架构辅助
components/lwp/vdso/user/arch/aarch64/vdso.lds.S Updated AArch64 vDSO linker script / 更新 AArch64 vDSO 链接脚本
components/lwp/vdso/user/arch/aarch64/SConstruct Removed per-arch build script / 删除按架构拆分的构建脚本
components/lwp/vdso/user/SConstruct New unified vDSO user build / 新统一用户态 vDSO 构建脚本
components/lwp/vdso/kernel/vdso_kernel_internal.h New kernel-side seqlock write helpers / 新内核侧 seqlock 写辅助
components/lwp/vdso/kernel/vdso_kernel.h New public kernel vDSO API header / 新内核 vDSO 公共 API 头文件
components/lwp/vdso/kernel/vdso_image.S Embed vDSO image via .incbin / 通过 .incbin 嵌入 vDSO 镜像
components/lwp/vdso/kernel/vdso_data.h Removed legacy kernel vDSO data header / 删除旧内核 vDSO 数据头
components/lwp/vdso/kernel/vdso.h Removed legacy kernel vDSO header / 删除旧内核 vDSO 头
components/lwp/vdso/SConscript Invoke unified user build + compile kernel vDSO sources / 调用统一用户构建并编译内核侧 vDSO
components/lwp/lwp_elf.c Map vDSO via new kernel API & update auxv logging / 使用新接口映射 vDSO 并更新日志
components/lwp/arch/risc-v/common/vdso_data.c Removed legacy per-arch vDSO data sync / 删除旧 RISC-V vDSO 数据同步
components/lwp/arch/common/vdso_kernel.c New common kernel vDSO runtime (mapping + clock snapshots) / 新通用内核 vDSO 运行时
components/lwp/arch/common/vdso.c Removed legacy common runtime / 删除旧通用运行时
components/lwp/arch/aarch64/common/vdso_data.c Removed legacy per-arch vDSO data sync / 删除旧 AArch64 vDSO 数据同步
components/lwp/SConscript Wire vDSO sources/headers into lwp build when enabled / VDSO 启用时纳入构建与头文件路径
components/libc/compilers/common/ctime.c Sync vDSO realtime after settimeofday/clock_settime / 在设置 RTC 成功后同步 vDSO realtime

Comment thread components/lwp/vdso/kernel/vdso_kernel_internal.h Outdated
Comment thread components/lwp/vdso/vdso_data_page.h
Comment thread components/lwp/vdso/kernel/vdso_kernel.h Outdated
Comment thread components/lwp/arch/common/vdso_kernel.c
@rcitach rcitach changed the title 更新 vdso 框架 [fix][lwp]Update the vdso framework Apr 22, 2026
@Rbb666
Copy link
Copy Markdown
Member

Rbb666 commented Apr 23, 2026

@BernardXiong 熊大,帮忙review下~

@BernardXiong
Copy link
Copy Markdown
Member

请确认下这个:components/lwp/arch/common/vdso_kernel.c:320

这版已把 arm 纳入了构建路径(components/lwp/vdso/SConscript:15-20),且 components/lwp/vdso/user/arch/arm/vdso.lds.S:3-4 明确生成的是 elf32-littlearm。但运行时校验仍然把镜像按 Elf64_Ehdr 解析,并强制要求 ELFCLASS64。

结果可能是 AArch32 的 vDSO 会在初始化时被直接判 invalid,rt_vdso_runtime_status 进入错误态,后续进程都拿不到 vDSO。

请检查下是否存在这样的情况。

@rcitach
Copy link
Copy Markdown
Contributor Author

rcitach commented Apr 24, 2026

请确认下这个:components/lwp/arch/common/vdso_kernel.c:320

这版已把 arm 纳入了构建路径(components/lwp/vdso/SConscript:15-20),且 components/lwp/vdso/user/arch/arm/vdso.lds.S:3-4 明确生成的是 elf32-littlearm。但运行时校验仍然把镜像按 Elf64_Ehdr 解析,并强制要求 ELFCLASS64。

结果可能是 AArch32 的 vDSO 会在初始化时被直接判 invalid,rt_vdso_runtime_status 进入错误态,后续进程都拿不到 vDSO。

请检查下是否存在这样的情况。

已经更新了,目前vdso 依赖 Clock Time 子系统,该子系统暂不支持 arm ,所以arm 并不会开启vdso,先保留功能,等日后 arm 也支持DM 就可以开启vdso了

@BernardXiong
Copy link
Copy Markdown
Member

可能的 3 个问题,请注意下:

  • vDSO 锁会在 tick 中断中自旋死锁
    rt_vdso_set_realtime() 在普通线程路径持有 rt_hw_spin_lock,而 rt_vdso_sync_clock_data() 会从 rt_tick_increase_tick() 的 tick 中断路径进入并拿同一把锁。SMP 下 rt_hw_spin_lock 不保存/关闭本地中断;如果线程持锁时本 CPU tick 中断打进来,ISR 会在同一把锁上自旋,线程无法继续释放锁。这里应改成 irqsave 语义的锁,或在两条写路径上显式关本地中断后再拿硬件 spinlock。
    components/lwp/arch/common/vdso_kernel.c:217

  • RISC-V 上共享 vDSO 页可能被用户态写
    当前优先选择 MMU_MAP_U_RWCB_XN 作为数据页属性;在 RISC-V virt64/c906 等实现里这个宏包含用户写权限。这样所有进程映射到同一个内核 vDSO 数据页后,用户态可以改 seq_counter、flags、base_time 等共享时间数据,影响本进程甚至其他进程。应提供/使用用户只读且 XN 的属性;没有只读 XN 时,至少不要退化成用户可写。
    components/lwp/arch/common/vdso_kernel.c:70

  • vDSO fallback errno 可能与用户 libc ABI 不一致
    PR 依赖 vDSO 对 realtime 未就绪返回 -ENOSYS 让 musl 回退 syscall,但这个 vDSO 由 *-none-elf-gcc 构建并直接包含工具链的 <errno.h>,不保证 ENOSYS 数值等于 RT-SMART 用户态 libc/musl 的 ABI 值。若工具链 newlib 给出不同值,musl 不会识别为 -ENOSYS,CLOCK_REALTIME fallback 会失效。建议在 vDSO 共享头里固定使用目标用户 ABI 的 errno 常量,或确保构建显式包含同一套用户态 errno 头。
    components/lwp/vdso/user/common/vdso_clock_gettime.c:33

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component: lwp Component Kernel PR has src relate code RT-Smart RT-Thread Smart related PR or issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants