回声长成居所
上一站收工的时候,stage2 交出来的全部家当就是一句 [stage2] echo alive。咱们当时也撂了话:探内存、记结果、给将来的内核备家底——这些活都在等它。本站咱们就让 stage2 从一句回声,长成一间正经的起居室。
咱们说活到底能不能干呢?这事咱们说了不算,第一件事情应该是把从 MBR 时代接力过来的接力棒好好看看。MBR 跟咱们说:“老铁,我把段寄存器全给您清零了,也把您从磁盘上带到这里了,剩下的路您走好!”话是热乎的,可咱们的栈是 MBR 那借来的,地址线还是锁的,内存咱们仍然两眼发黑,也不知道到底有多少家当由得咱们挥霍。
所以咱们这就给 stage2 搬一个自己的栈,请 BIOS 把 A20 的门打开,咱们再请 BIOS 把内存图谱摆出来,把 BIOS 交代的内容存好。
本站走完的时候,咱们敲的还是同一道熟悉的命令:
cmake -B build && cmake --build build --target run终端里等着咱们的不再只有三行了,而是一整串起居序列:
Ready to call bios
Jump to Stage 2
[stage2] stack ok
A20 ok
E820: 7 entries
#00 base=0000000000000000 len=000000000009FC00 type=1
#01 base=000000000009FC00 len=0000000000000400 type=2
...
[stage2] alive中间那几行十六列的地址,咱们收工的时候再陪着机器逐条认。还有一样新东西是不在 QEMU 里的,在您开发用的电脑上:ctest 的清单里会多出一个 boot 血统的测试——BIOS 探来的内存图,它解析的那段纯逻辑,头一回进了测试流水线。
活为什么按这个次序排,咱们把理由交代清楚:栈排在最前头,因为后两件干的都是调 BIOS 的活,而 BIOS 一出场就要用栈。BIOS 调用的参数倒不走栈,它们全走的是寄存器,后面问内存的时候您会亲眼见到。真正往栈上压东西的,是 int 指令自己留下的返回现场,是 BIOS 服务肚子里自己的 push,还有咱们 asm 块里的 pushw。咱们要是没把栈立好,这些 push 一个都落不了地。动工的头一件事,反倒不是写代码——是画一张地图。当年在布局上吃过的那笔大亏,值得咱们用一整节来慢慢还。