[fix][lwp]Update the vdso framework#11340
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
📌 Code Review Assignment🏷️ Tag: componentsReviewers: Maihuanyi Changed Files (Click to expand)
🏷️ Tag: components_libcReviewers: GorrayLi mysterywolf Changed Files (Click to expand)
🏷️ Tag: components_lwpReviewers: xu18838022837 Changed Files (Click to expand)
📊 Current Review Status (Last Updated: 2026-04-24 17:48 CST)
📝 Review Instructions
|
There was a problem hiding this comment.
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 |
|
@BernardXiong 熊大,帮忙review下~ |
|
请确认下这个: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了 |
|
可能的 3 个问题,请注意下:
|
拉取/合并请求描述:(PR description)
[
为什么提交这份PR (why to submit this PR)
riscv 架构开启 RT-SMART 后,用户态调用
time/clock_gettime一类接口时会进入 vDSO 路径,触发任务崩溃。同时,原有 vDSO 相关文件命名和职责划分不清晰,内核侧、用户侧、共享数据页定义分散,后续维护和定位问题成本较高。
你的解决方案是什么 (what is your solution)
本次修改对 RT-Thread 的 vDSO 进行了整理和修复,主要包括:
vdso.h、vdso_data.h、vdso_datapage.h、vdso_sys.*等历史实现,避免同一能力存在多套命名和逻辑。seq_counter、counter_last、counter_freq、base_time[]等共享时间数据;base_time与counter_last不是同一采样点,用户态按base_time + (now - counter_last)计算时会产生固定偏差;base_time和counter_last,保证CLOCK_MONOTONIC计算一致。realtime_offset缓存与RT_VDSO_FLAG_REALTIME_VALID标志;settimeofday()/clock_settime()成功后同步刷新 vDSO realtime 数据;CLOCK_REALTIME返回-ENOSYS,由 musl 自动回退到 syscall 路径,避免用户态拿到错误时间数据。components/lwp/vdso/user/SConstruct;请提供验证的bsp和config (provide the config and bsp)
qemu-virt-aarch64 与 qemu-virt-riscv
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up