还是U盘

 还是U盘启动的事,看自己的U盘做的不错,有个朋友也想做一个,他的是普通的U盘,4G,不过想来应该和U盘盒也没什么差别。

插进机器看了一下,是USB-HDD。

 

将mbr读进来看一下,没有引导代码,分区表只有一个分区,并且启动标志是01非法启动分区(80是启动分区,00是非启动,其它值非法,不过只用于引导,所以01使用应该没有问题),后面的分区表数据貌似正常,分区标志是0B说明是一个FAT32分区。

 

这次想做一个DOS的引导,先改了分区表,将启动标志改成80,然后用fixmbr将mbr启动代码写到MBR分区中。然后将虚拟机中的Windows 98启动扇区读出来,更新U盘分区的BPB信息后写到U盘分区引导扇区,将98的分区第3个扇区写到U盘分区的第3个扇区,将io.sys,msdos.sys和command.com拷贝到U盘分区根目录,按道理就应该好了。

 

启动之后居然显示“没有找到操作系统”,奇怪,哪里出的问题?

将mbr启动代码和引导扇区看了一下,这个错误信息是mbr启动代码打出来的,再看分区表,分区起始扇区20H,扇区、磁道、磁头数为01 01 00也应该是正确的,分区引导扇区也确实是20H扇区,怎么回事呢?

 

反一下mbr代码,发现只有读取引导扇区之后检查引导扇区最后2个字节不是55AA才会出现这个错误提示。而且mbr启动代码很简单,先将自己移动到600H的位置,找到启动分区,读启动分区第1个扇区到7c00,检查标志,转到7c00执行。

从流程上完全看不出问题来,还是想办法调试一下吧,从网上下了tasm,又翻出很久以前的DOS汇编知识,改了mbr启动代码,将读出来的7c00处的数据打印到屏幕上,将这个修改的mbr写到U盘中,启动,结果打出来的都是0。

可是我自己直接读U盘引导扇区是正确的啊,看来是mbr中读磁盘的代码出问题了,那是一个函数,首先调用int 13的ah=8功能读磁盘参数表,如果不成功就用老的int13调用,否则的话经过一些计算来判断是用老的int13还是用扩展int13调用。

现在的机器一般都支持扩展int13,否则8G以上硬盘都无法支持,所以先改一下读取函数看看,直接用扩展int13调用。

再次启动,好了mbr部分过去了,不过又出现引导系统错误,看来是引导扇区找不到io.sys了。

由于有前面的经验,反了引导扇区之后将引导扇区中的读磁盘代码也改成用扩展int13调用,再试发现启动之后屏幕就黑了,什么都不出现。

奇怪了,看来后面的加载流程还有问题,我就不信了,继续查。在第3个分区开始的地方打一些信息出来,确认第3个分区成功的执行到了。

这里有很多计算,猜测应该是读根目录找io.sys文件,也没耐心细看了,在读磁盘前输出一些信息出来,看看读了哪些扇区,结果发现读了2次,一次一个扇区,一次4个扇区。放到其他机器上读出这2部分一看,一个扇区就是根目录,里面包含了io.sys,4个扇区就是io.sys的前4个扇区,看来引导扇区的工作是正常的,之后挑转到io.sys的第2个扇区执行,应该也没有问题。突然想到我改了引导扇区直接用扩展int13,而io.sys可能有自己的读磁盘函数,可能还是那里出的问题。这时候想起来看引导扇区读磁盘代码的时候,它是根据分区表的分区标志来判定是否调用扩展int13的,分区标志or2之后等于e的话就用扩展Int13,否则用老的int13。而这个分区的标志是B,所以总是用老的int13调用,将分区标志改成C,再次启动,OK,USB盘起来了。

将MBR启动代码改回去,还是不能启动。不过问题总算解决了。

 

用自己的代码替换了MBR,将分区表引导标志设置为80,分区标志设置为C,USB引导正常。

 

调试引导过程非常麻烦,只能一次一次在正常机器上写扇区,到另一台机器上测试。没有调试器,只能自己写代码输出信息,而且代码有大小限制,只能是一个扇区,超了就要砍掉一部分正常代码。费了将近一天的工夫,不过总算是解决了问题,同时也复习了一下系统引导过程。虽然是DOS的,但是XP的ntldr的引导过程也是差不多的,只是加载的是ntldr而已。

 

总结一下,做USB引导并不复杂,要以下几个条件

1。分区表正确

2。mbr启动代码正确

3。分区引导扇区正确(包括扇区3,这是上一次犯的错误)

4。启动文件正确

 

这一次主要是这个USB盘用老的int13调用有问题,而分区表又指定用老的int13调用。所以后来的调试只是找出了问题,其实设置好分区标志就OK了。

至于老的int13调用出错的原因猜测是磁盘参数不正确,不过反正可以用了,也没有再去仔细调试了,况且现在不支持int13扩展的主板估计也难找了,这个U盘的兼容性足够了。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值