内核为什么在 0x80200000?
还有,0x1000 是什么? —— QEMU virt 启动链
内存地图:为什么不能是 0
DRAM 128MB
ROM
MMIO 寄存器区
(不是 RAM)
0x88000000
DRAM 顶
0x80000000
0x00001000
0x00000000
真正的内存(RAM)
ROM:上电第一条指令
启动链:OpenSBI 与内核的位置
S-mode 内核
你的 kernel
OpenSBI
M 模式固件
初始化硬件 / SBI 调用
预留 2MB
0x88000000
DRAM 顶
0x80200000
0x80000000
+0x200000(2MB)
0x80200000
运行内核
0x80000000
运行 OpenSBI
PC = 0x1000
跳转 + 切 S 模式
跳转
最小实例与版本对比
/* kernel.ld */
. =
0x80200000
;
ENTRY
(_entry)
$ objdump -h kernel | grep text
→
.text 0x80200000
带 OpenSBI(本课程版)
OpenSBI @0x80000000
(2MB)
内核 @0x80200000
MIT xv6(-bios none)
无固件占位
内核 @0x80000000
加载地址取决于你前面有谁
常见误区
不是魔法数
0x80200000 由平台约定推出:DRAM 起点 + OpenSBI 预留 2MB,换平台就变
内核放不了低地址
0 附近是 ROM 与 MMIO 寄存器区,不是 RAM——物理上无处执行
改脚本要重新链接
旧加载地址对不上新链接地址,第一条跳转指令就会跳飞