第3章 认识保护模式 的代码修正

本文针对《Orange's一个操作系统的实现》第三章中遇到的问题进行了解析,即虚拟机无法识别引导程序。通过三次尝试,包括修改引导扇区的特定字节值,最终通过去除代码中的分节成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        关于《Orange's 一个操作系统的实现》第三章中认识保护模式部分的代码,自己在实现时,发现在运行时,虚拟机无法识别引导程序。经过判定,因为按照目前的程序,没有对引导扇区的511和512字节赋值为0x55aa。

        于是根据第一章代码的提示,尝试自己实现。

        1.直接使用第一章的赋值語句

結果失败。为什么?$代表当前行的运行地址,而$$代表了当前行所在节的起始地址。在第一个章的程序中,因为程序只有一个节,所以没有问题,但在3.1的代码中,有多个节,所以$$并不是代表代码起始处的地址。

    2.那直接使用起始地址吧,这是很自然的想法。代码如下

      times  510-($-0x7c00)

      dw 0xaa55

     更不幸,这次边编译都无法通过了。错误如下:

为什么会这样呢?明明是铁板钉钉的常量,却被认为是一个非常量呢,因为对nasm的語法并不熟悉,这部分的原因还需要再查找。

       3.杀手锏,问作者。于是很冒昧地给作者于渊兄发了邮件,这里得赞扬一下作者,当天上午就进行了回复。大意就是,参照第一章中的代码。又回到了第一种尝试的方案。不能放弃,终于邮件列表中有人给指了条小路,将目前代码中的节全部除去,也就是不再分节,这样就可以实现了。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值