这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核。本节只实现一个简单的loader,本loader只在实模式下工作,等学习了保护模式后,我们再来个真格的。
由于本节较容易,没有新知识,直接上菜啦,见代码
1 %include "boot.inc"2 section loader vstart=LOADER_BASE_ADDR34 ; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"5 mov byte [gs:0x00],'2'6 mov byte [gs:0x01],0xA4 ; A表示绿色背景闪烁,4表示前景色为红色78 mov byte [gs:0x02],' '9 mov byte [gs:0x03],0xA41011 mov byte [gs:0x04],'L'12 mov byte [gs:0x05],0xA41314 mov byte [gs:0x06],'O'15 mov byte [gs:0x07],0xA41617 mov byte [gs:0x08],'A'18 mov byte [gs:0x09],0xA41920 mov byte [gs:0x0a],'D'21 mov byte [gs:0x0b],0xA42223 mov byte [gs:0x0c],'E'24 mov byte [gs:0x0d],0xA42526 mov byte [gs:0x0e],'R'27 mov byte [gs:0x0f],0xA42829 jmp $ ; 通过死循环使程序悬停在此
对这个loader中的代码,大家是否觉得好亲切、毫无压力呢。这和咱们最初的那个MBR好接近,不同的是,在这个loader中,打印的字符串是“2 loader”。
本loader程序第2行代码用到了LOADER_BASE_ADDR,所以在第1行中把boot.inc包含进来了,其值是0x900。其它代码就不用讲啦。
编译nasm -I include/ -o loader.bin loader.S回车
将生成的loader.bin写入硬盘第2个扇区。第0个扇区是MBR,第1个扇区是空的未使用,原因如前所述,纯粹个人喜好。
dd if=./loader.bin of=/此处替换成你的安装目录/bochs/hd60M.img bs=512 count=1 seek=2 conv=notrunc回车,下面是dd命令的三行输出。
记录了0+1 的读入
记录了0+1 的写出
98字节(98 B)已复制,8.9113e-05 秒,1.1 MB/秒
可见,我们的loader.bin只有98字节,远远小于64k。
小激动的时刻到了,我们该运行bochs来验证了。如果程序正确的话,MBR会跳转到loader.bin去运行,屏幕上会显示“2 loader”。
启动虚拟机,执行。效果如图
这次我只抓了一张图,但我人格保证这是跳动的字符,大家在自己的虚拟机上体验体验吧。
Loader刚刚开了个头,马上就要和大家暂别了。因为这个loader目前还没有实际意义,目前只是来验证MBR和loader的接力是否成功,它最终的任务是要加载内核。可是内核是运行在32位保护模式环境下,我们当前还在实模式下呢。首先咱们得知道什么是保护模式,其次还得想办法进入到保护模式,前面的路还很远。
好啦,本章到此告一段落,等我们学习保护模式后,我们还会回来继续改进loader。
【再续】
本内容摘自《操作系统真象还原》,请大伙儿支持正版,多谢多谢。