Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • O OSKernel2026-NameNotFound
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 8
    • Issues 8
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • NameNotFound
  • OSKernel2026-NameNotFound
  • Issues
  • #7
Closed
Open
Issue created Apr 02, 2026 by 孙浩宇@shyliuliMaintainer

子 issue #7:LoongArch ELF 重定位支持

子 issue #7:LoongArch ELF 重定位支持

描述

为可加载内核模块(LKM)添加 LoongArch64 的 ELF 重定位类型处理。

依赖

  • #2 (closed)(编译基础设施完成)
  • 测试需要 #3 (closed)~#6 基本功能就绪(但实现可与 #5 并行)

优先级

低于 #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 指令)

实现要点

  1. 指令修补: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]
  2. la.abs 序列:通常 4 条指令组成完整 64 位地址加载,重定位需要对齐处理
  3. 对齐要求:所有 LoongArch 指令 4 字节对齐
  4. 参考现有 riscv/x86 重定位实现的模式,保持接口一致

参考

  • LoongArch ELF ABI 规范
  • Linux Kernel arch/loongarch/kernel/module.c
  • 龙芯架构参考手册卷一 — 指令编码格式

完成标准

  1. 能正确处理 R_LARCH_64、R_LARCH_ABS_* 系列重定位
  2. 能加载一个简单的 LoongArch 内核模块(如 hello_rust)并执行
  3. 条件编译正确,不影响 riscv64 构建

父任务:#1

Edited Apr 04, 2026 by 孙浩宇
Assignee
Assign to
Time tracking