子 issue #2:构建系统与 target 基础设施
子 issue #2 (closed):编译基础设施与架构抽象解耦
描述
为 LoongArch64 搭建 cargo check 级别 可编译的最小骨架,同时完成 trapframe 依赖解耦。不要求链接通过,不要求能运行。
前置条件
- 安装内建 target:
rustup target add loongarch64-unknown-none - 将
trapframe-rsvendor 到仓库内crate/trapframe/,通过[patch]接管依赖
需要修改的文件
构建系统
| 文件 | 动作 | 说明 |
|---|---|---|
kernel/Makefile |
修改 | 添加 ifeq ($(ARCH), loongarch64) 分支:设置 target、qemu 路径、QEMU 选项 |
kernel/build.rs |
修改 | 添加 loongarch64 条件:cargo:rustc-cfg=loongarch64、linker script 路径 |
kernel/Cargo.toml |
修改 | 添加 [target.'cfg(target_arch = "loongarch64")'.dependencies] 段 |
kernel/src/lib.rs |
修改 | 添加 #[cfg(target_arch = "loongarch64")] #[path = "arch/loongarch64/mod.rs"] pub mod arch;
|
trapframe 解耦
| 文件 | 动作 | 说明 |
|---|---|---|
crate/trapframe/ |
新建 | vendor trapframe-rs,添加 loongarch64 类型定义(TrapFrame/UserContext/GeneralRegs 结构体,无需汇编实现) |
kernel/Cargo.toml |
修改 | trapframe 改为 path 依赖或通过 [patch] 指向本地 |
架构骨架模块(全部新建,函数体均为 stub)
| 文件 | 导出接口 |
|---|---|
kernel/src/arch/loongarch64/mod.rs |
声明所有子模块,定义 rust_main 入口桩 |
kernel/src/arch/loongarch64/cpu.rs |
id(), halt(), exit_in_qemu(), reboot(), send_ipi(), set_cpu_id()
|
kernel/src/arch/loongarch64/interrupt/mod.rs |
enable(), disable_and_store(), restore(), wait_for_interrupt(), ack(), timer(), enable_irq(), get_trap_num(), handle_user_page_fault_ext(), handle_reserved_inst()
|
kernel/src/arch/loongarch64/interrupt/consts.rs |
异常号常量 + 判断函数 (Syscall, Timer, is_page_fault() 等) |
kernel/src/arch/loongarch64/paging.rs |
PageTableImpl (实现 PageTable/PageTableExt trait)、PageEntry
|
kernel/src/arch/loongarch64/memory.rs |
init(), init_other(), clear_bss(), get_page_fault_addr(), set_page_table()
|
kernel/src/arch/loongarch64/fp.rs |
FpState (new/save/restore) |
kernel/src/arch/loongarch64/signal.rs |
MachineContext, RET_CODE, set_signal_handler()
|
kernel/src/arch/loongarch64/syscall.rs |
LoongArch 系统调用号常量 (~295个 SYS_*) |
kernel/src/arch/loongarch64/timer.rs |
timer_now(), get_cycle(), init(), set_next()
|
kernel/src/arch/loongarch64/io.rs |
putfmt() |
kernel/src/arch/loongarch64/consts.rs |
PHYSICAL_MEMORY_OFFSET, KERNEL_OFFSET, KERNEL_HEAP_SIZE, MEMORY_OFFSET, MEMORY_END, USER_STACK_*, ARCH 等 |
kernel/src/arch/loongarch64/rand.rs |
rand() -> u64 |
kernel/src/arch/loongarch64/board/mod.rs |
init(), init_external_interrupt() stub |
kernel/src/arch/loongarch64/boot/ |
空入口汇编占位 + linker script 占位 |
kernel/src/arch/loongarch64/compiler_rt.rs |
abort() |
关键设计决策
-
target 选择: 使用内建
loongarch64-unknown-none,不自定义 JSON(等遇到 ABI/code model 问题再新增) - trapframe 策略: vendor 到仓库内,为 loongarch64 添加类型定义分支;通用代码暂不迁移 import 路径(留给后续 issue)
-
stub 原则: 所有函数体
todo!()或返回默认值,只追求类型检查和 cargo check 通过
完成标准
ARCH=loongarch64 BOARD=qemu cargo check --target loongarch64-unknown-none
编译通过(允许 warning,不允许 error)
不包含(属于后续 issue)
- 任何真正的硬件交互实现
- trap entry/exit 汇编
- 页表格式实现
- 上下文保存/恢复
- QEMU 启动
父任务:#1