技术背景
在内核中,很多 全局变量或指针(如 d_hash_shift、dentry_hashtable)会被频繁访问。
传统方式:编译器需要通过符号解析,把这些变量的地址加载到寄存器,通常需要多条指令。
RISC-V 新增的 Zba/Zbp/Zbkb 扩展指令可以更高效地组合常量地址,但需要一种机制把这些符号和指令序列绑定起来。
runtime const 就是为此设计的:通过链接脚本生成锚点符号,再在运行时用 fixup 修复,把符号地址和常量区间关联。
增加 runtime const 的意义
性能提升
在文件系统等热路径中,减少符号解析开销。比如 d_hash_shift 在目录缓存查找中会被频繁使用,runtime const 可以让它的地址加载更快。
→ 实测在 qemu 上,深目录遍历性能提升约 0.57%。
指令优化
借助 Zba/Zbp 指令,可以用 1–2 条指令生成常量指针,而不是传统的 3–4 条。
→ 在支持扩展的 CPU 上,指令数减少,功耗和延迟也降低。
工具链兼容
如果 CPU 或编译器不支持这些扩展,runtime const 会走 fallback 路径,保证功能正确。
→ 这让内核既能利用新硬件的优化,又能兼容旧硬件。
架构灵活性
通过 fixup 机制,符号和常量区间在运行时绑定,而不是编译期死板固定。
→ 这为未来扩展(比如更多缓存对象、不同指针类型)提供了灵活性。
技术背景
在内核中,很多 全局变量或指针(如 d_hash_shift、dentry_hashtable)会被频繁访问。
传统方式:编译器需要通过符号解析,把这些变量的地址加载到寄存器,通常需要多条指令。
RISC-V 新增的 Zba/Zbp/Zbkb 扩展指令可以更高效地组合常量地址,但需要一种机制把这些符号和指令序列绑定起来。
runtime const 就是为此设计的:通过链接脚本生成锚点符号,再在运行时用 fixup 修复,把符号地址和常量区间关联。
增加 runtime const 的意义
性能提升
在文件系统等热路径中,减少符号解析开销。比如 d_hash_shift 在目录缓存查找中会被频繁使用,runtime const 可以让它的地址加载更快。
→ 实测在 qemu 上,深目录遍历性能提升约 0.57%。
指令优化
借助 Zba/Zbp 指令,可以用 1–2 条指令生成常量指针,而不是传统的 3–4 条。
→ 在支持扩展的 CPU 上,指令数减少,功耗和延迟也降低。
工具链兼容
如果 CPU 或编译器不支持这些扩展,runtime const 会走 fallback 路径,保证功能正确。
→ 这让内核既能利用新硬件的优化,又能兼容旧硬件。
架构灵活性
通过 fixup 机制,符号和常量区间在运行时绑定,而不是编译期死板固定。
→ 这为未来扩展(比如更多缓存对象、不同指针类型)提供了灵活性。