子 issue #3:Boot 启动与早期初始化
子 issue #3 (closed):Boot 启动与早期初始化
描述
实现 LoongArch64 的启动流程,能在 QEMU 上输出 "Hello World" 并进入 rust_main。
依赖
- #2 (closed)(编译基础设施与架构骨架完成)
需要实现的文件
| 文件 | 说明 |
|---|---|
kernel/src/arch/loongarch64/boot/entry.S |
LoongArch 启动汇编入口:设置栈、配置 DMW、跳转到 Rust |
kernel/src/arch/loongarch64/boot/linker.ld |
LoongArch 链接脚本(定义内存布局、导出段符号) |
kernel/src/arch/loongarch64/io.rs |
UART 16550 串口输出实现(QEMU virt 串口地址:0x1FE001E0) |
kernel/src/arch/loongarch64/mod.rs |
rust_main 真正的初始化流程(BSS 清零→堆初始化→串口初始化→打印) |
kernel/src/arch/loongarch64/memory.rs |
clear_bss() 实现 |
关键技术点
-
启动地址: QEMU virt 平台内核直接加载到
0x9000000000200000(通过 DMW 映射的物理地址0x00200000附近) -
DMW(直接映射窗口)配置:
-
CSR.DMW0: 通常配置为0x9000000000000000映射到物理0x0(非缓存一致/缓存一致) -
CSR.DMW1: 可配置第二个窗口用于 I/O 空间 - 通过 DMW 实现内核地址空间的固定映射,无需早期页表
-
-
栈初始化: 在汇编中设置
$sp指向预分配的 boot stack -
BSS 清零: 使用 linker script 导出的
sbss/ebss符号 - 串口输出: QEMU virt 的 16550 UART 兼容串口
-
QEMU 启动命令:
qemu-system-loongarch64 -machine virt -nographic -kernel kernel-la -m 1G
参考
- QEMU LoongArch virt 平台文档
- Linux Kernel
arch/loongarch/kernel/head.S - PolyHAL 的 loongarch64 boot 实现
- 龙芯架构参考手册卷一 - 地址空间章节
完成标准
make run ARCH=loongarch64 在 QEMU 中:
- 串口输出可见文字(至少 "Hello World")
- 内核进入
rust_main不 panic - 能正常调用
arch::cpu::halt()进入循环
父任务:#1