一步步编写操作系统 24 编写内核加载器

这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核。本节只实现一个简单的loader,本loader只在实模式下工作,等学习了保护模式后,我们再来个真格的。

由于本节较容易,没有新知识,直接上菜啦,见代码

 1 %include "boot.inc"
2 section loader vstart=LOADER_BASE_ADDR
3
4 ; 输出背景色绿色,前景色红色,并且跳动的字符串"1 MBR"
5 mov byte [gs:0x00],'2'
6 mov byte [gs:0x01],0xA4 ; A表示绿色背景闪烁,4表示前景色为红色
7
8 mov byte [gs:0x02],' '
9 mov byte [gs:0x03],0xA4
10
11 mov byte [gs:0x04],'L'
12 mov byte [gs:0x05],0xA4
13
14 mov byte [gs:0x06],'O'
15 mov byte [gs:0x07],0xA4
16
17 mov byte [gs:0x08],'A'
18 mov byte [gs:0x09],0xA4
19
20 mov byte [gs:0x0a],'D'
21 mov byte [gs:0x0b],0xA4
22
23 mov byte [gs:0x0c],'E'
24 mov byte [gs:0x0d],0xA4
25
26 mov byte [gs:0x0e],'R'
27 mov byte [gs:0x0f],0xA4
28
29 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。

【再续】

本内容摘自《操作系统真象还原》,请大伙儿支持正版,多谢多谢。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();