原因是前些天在杨老师的讨论课上杨老师提出了这个问题:没有操作系统的光板机器,要写一个HelloWorld怎么办?有一个哥们提出了可以用bios的中断写,我也记得于渊的《自己动手写操作系统》一书中提到过,但是忘了具体要怎么办。回到宿舍找到于渊的书,看到了如下的代码,并按书上的方法实验了一下,运行成功了。代码如下:
做一个简单的说明,利用的原理就是bios的10号中断,至于这个10号中断怎么用,可以参考网上手册,还有好多的资料,主要说的是使用10号中断前不同寄存器的含义,比如cx放的是显示字符的长度,ax中是字符串的起始地址等等。
完成以后用nasm 汇编器进行编译 nasm -o boot.bin boot.asm
然后用dd命令放到一个虚拟软驱的镜象中去 dd if=boot.bin of=myimage.img
选一个合适的虚拟机,新建一个机器,用这个虚拟光驱启动,就会在启动界面上显示“Hello” 这几个字符,但是此后就会进入死循环。
这个程序的实质是做了一个512字节的引导扇区,然后放到光驱的第0扇区。在运行的时候什么也不做,只打印一个字符串而已。
通过这个程序,我理解了bios中断的含义,引导扇区的具体含义,对系统引导的第一步有了个大概的理解。但是同时有几个疑问:
第一,是不是在操作系统中所有的最底层操作最后都要转化成bios中断来实现?如果是那样的话,从应用程序到bios中断,确实有一个相当长的路要走。
这个问题我已经有答案了,答案是否。因为在Linux中会用自己的中断代替所有的bios中断,因为bios中断存在一些并发性以及性能方面的弱点,因此只能另写了一套中断放在内存中,所以我们平常看到应用程序中也是要走一个相当长的由上向下的过程,只不过这个过程终点不是bios中断,而是覆写的新中断,但起的作用是一样的,只是功能更强了。
第二,如果不是从软盘启动,而是从硬盘启动,这个过程是怎样的?
现在这个问题我也有答案了,只是想先卖个关子,后面讲到的时候会涉及的。