子 issue #7:LoongArch ELF 重定位支持
描述
为可加载内核模块(LKM)添加 LoongArch64 的 ELF 重定位类型处理。
依赖
优先级
低于 #3 (closed)~#6。需要先有可运行的 LoongArch 内核才能完整测试模块加载。代码编写可以提前,但验证需等基础功能就绪。
需要实现的文件
| 文件 |
说明 |
kernel/src/lkm/const_reloc/loongarch64.rs |
新建:LoongArch 重定位类型处理函数 |
kernel/src/lkm/const_reloc/mod.rs |
修改:添加 #[cfg(target_arch = "loongarch64")] 条件编译引入 loongarch64 模块 |
关键重定位类型
核心类型(必须支持)
| 类型 |
值 |
计算方式 |
说明 |
R_LARCH_NONE |
0 |
- |
无操作 |
R_LARCH_32 |
1 |
S + A |
32 位绝对地址 |
R_LARCH_64 |
2 |
S + A |
64 位绝对地址 |
R_LARCH_RELATIVE |
3 |
B + A |
动态链接相对重定位 |
R_LARCH_JUMP_SLOT |
5 |
- |
PLT 跳转槽 |
绝对地址指令序列(la.abs)
| 类型 |
值 |
说明 |
R_LARCH_ABS_HI20 |
67 |
lu12i.w 的立即数 [31:12] |
R_LARCH_ABS_LO12 |
68 |
ori 的立即数 [11:0] |
R_LARCH_ABS64_LO20 |
69 |
lu32i.d 的立即数 [51:32] |
R_LARCH_ABS64_HI12 |
70 |
lu52i.d 的立即数 [63:52] |
PC 相对地址指令序列(la.pcrel / la.got)
| 类型 |
值 |
说明 |
R_LARCH_PCALA_HI20 |
71 |
pcalau12i 的立即数 |
R_LARCH_PCALA_LO12 |
72 |
addi.d/ld.d 的立即数 |
R_LARCH_GOT_PC_HI20 |
75 |
GOT 条目 PC 相对高 20 位 |
R_LARCH_GOT_PC_LO12 |
76 |
GOT 条目 PC 相对低 12 位 |
分支跳转
| 类型 |
值 |
说明 |
R_LARCH_B16 |
64 |
16 位 PC 相对(条件分支) |
R_LARCH_B21 |
65 |
21 位 PC 相对(条件分支) |
R_LARCH_B26 |
66 |
26 位 PC 相对(b/bl 指令) |
实现要点
-
指令修补:LoongArch 的立即数分散在指令的不同位域中,需要正确提取和插入
-
lu12i.w:imm 在 bit[24:5]
-
ori:imm 在 bit[21:10]
-
lu32i.d:imm 在 bit[24:5]
-
lu52i.d:imm 在 bit[21:10]
-
pcalau12i:imm 在 bit[24:5]
-
b/bl:imm 分两段 bit[9:0] 和 bit[25:10]
-
la.abs 序列:通常 4 条指令组成完整 64 位地址加载,重定位需要对齐处理
-
对齐要求:所有 LoongArch 指令 4 字节对齐
- 参考现有 riscv/x86 重定位实现的模式,保持接口一致
参考
完成标准
- 能正确处理
R_LARCH_64、R_LARCH_ABS_* 系列重定位
- 能加载一个简单的 LoongArch 内核模块(如
hello_rust)并执行
- 条件编译正确,不影响 riscv64 构建
父任务:#1