所有的操作系统原理的书籍都没说的最重要,最影响实践的一件事情就是怎么写引导。
操作系统的原理知不知道都不重要,重要的是能有自己尝试的空间,伟大的发明都是尝试出来的。
学会写自己的操作系统,第一步就是要破除别人强行给我们套上的一个思维定势。
如果你写出来了,顶多只是写得不好,总比那些只知道操作系统原理却不知道怎么写一个系统的人强。
下面引用的是我在网上发现的一段文章,不知道是谁的,先说声对不起。
我们知道在机器跑起来后,经BIOS系统的检测后便会去读取引导盘(当然可以是硬盘或软盘)的第一个扇区的数据。如果在读取的512个字节的数据中(一个扇区即512个字节)最后一个字为0Xaa55,那么BIOS即认为这是个引导程序,即将其运行并把控制权交给了此应用程序。OK,为了检验我们来写个这样的程序,看看是否成功。
我们将上文中的 Jig.c 中的内嵌汇编的内容来做个演示。编写以下代码:
;shiyan.asm
org 07c00h
mov ah, 0x0e
mov al, 't'
mov bl, 7
int 0x10
times 510 - ($ - $$) db 0 ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 0xaa55 ; 结束标志
然后将其编译 nasm shiyan.asm -o shiyan.bin
好的,这样我就有了一个很小很简单的引导程序,为了保证我们心爱的硬盘的安全我们还是先用软盘来做实验。OK,那我们再用WIN-TC写一个将此引导程序写入软盘引导区的程序。其实很简单,使用biosdisk()函数就OK啦。(不熟悉此函数的朋友自己到网上去查)
/* writer.c */
#i nclude <stdio.h>
#inlcude <bios.h>
void main(void)
{
FILE *fp;
char buffer[512];
fp = fopen("shiyan.bin", "rb");
fread(buffer, 512, 1, fp); /* 将shiyan.bin的内容存入buffer数组中 */
fclose(fp);
biosdisk(3, 0, 0, 0, 0, 1, buffer); /* 将buffer写入第一扇区 */
}
OK,编译此程序。在软区插入一张软盘。运行程序就可以把shiyan.bin写入软盘的第一扇区。(程序没有做出错处理,不过一般是不会出错的)好的,关机重启,在BIOS中改为从软盘其中。等待一会你会看到屏幕上显示了一个字母 t。这说明我们写入软盘的程序跑起来了,一个简单的引导程序就写成。
好的,关机重启系统。OK,来到系统的 我的电脑 中查看软区,“什么?竟然提示无磁盘?”难道我们的软盘坏了?呵呵,不要着急,我们的软盘没有坏,而是我们上面的引导程序将磁盘中的一些信息覆盖了,而这些信息就是磁盘格式(当然也是我们硬盘的一种格式),我们以后将逐步详细介绍磁盘格式。要知道我们以后的文件系统就靠他了。(当然这个是我自己的猜想,自从我研究了FAT12磁盘格式,我就认定DOS,WINDOS的文件系统应该是靠他来建立的,所以当我们完全认识到这点后我们也许可以自己定义一个新的磁盘格式。当然我是不会这样做啦,呵呵,还是用前人研究出来的东西比较稳妥,呵呵)
评论
想第一时间抢沙发么?