关于《Orange's 一个操作系统的实现》第三章中认识保护模式部分的代码,自己在实现时,发现在运行时,虚拟机无法识别引导程序。经过判定,因为按照目前的程序,没有对引导扇区的511和512字节赋值为0x55aa。
于是根据第一章代码的提示,尝试自己实现。
1.直接使用第一章的赋值語句
結果失败。为什么?$代表当前行的运行地址,而$$代表了当前行所在节的起始地址。在第一个章的程序中,因为程序只有一个节,所以没有问题,但在3.1的代码中,有多个节,所以$$并不是代表代码起始处的地址。
2.那直接使用起始地址吧,这是很自然的想法。代码如下
times 510-($-0x7c00)
dw 0xaa55
更不幸,这次边编译都无法通过了。错误如下:
为什么会这样呢?明明是铁板钉钉的常量,却被认为是一个非常量呢,因为对nasm的語法并不熟悉,这部分的原因还需要再查找。
3.杀手锏,问作者。于是很冒昧地给作者于渊兄发了邮件,这里得赞扬一下作者,当天上午就进行了回复。大意就是,参照第一章中的代码。又回到了第一种尝试的方案。不能放弃,终于邮件列表中有人给指了条小路,将目前代码中的节全部除去,也就是不再分节,这样就可以实现了。