When Do We Write Our Chinese OS ? (1)

类别:编程语言 点击:0 评论:0 推荐:

操作系统是计算机的核心,没有操作系统,一切计算机应用都免谈,但现在操作系统基本上被老外垄断,Windows就不说了,就算是Linux那也是泊来品,什么时候我们才能写出有中国特色的操作系统啊?

在工大,我们每个人都学过操作系统,我也一样,但老师教的那真的只是理论,一个实际的系统原比老师教的要复杂上一千万倍!然而,我们基本上没有可能实践的机会,就算是有一些实验,那也是停留在一个非常高的表层。我非常之笨,学完之后,还是不知系统是怎样从无到有,开始工作的。系统是怎样启动的?曾经把一段汇编代码写进了磁盘,但无论如何没将机器启动起来(原因现在已经清楚,稍后再谈)。想看看Linux的源码,但犹如天书!即使是Minix也非常之庞大,晦涉难懂!郁闷啊~~~,今天在网上无意间看见了一个老外写的E文,讲到此事,霍然开朗,在网上狂找了一堆E文后,最终将机器起启来了。(本人E文差得没底,基本上是用金山词霸配合联通国际在线翻译系统一句一句翻译的,痛苦啊!看来要想学好计算机E文不好还真不行:(,很多资料中文的就是没有,只有E文的,你咋办?)。现特将全过程描述一下,一来留个纪念,二来希望工大能有更多的人能对此感兴趣,超级大牛们早日写出我们自己的操作系统。Linux也是芬兰的一个大学生写的。

阅读本文最好有那么一丁点的汇编基础。另外,本人水平极其有限,对操作系统也不是很熟,对于论述中不计其数的错误,望大家原谅,千万不要来砍我~~~
首先,我要先说明一下计算机在你按下电源按钮后,计算机都做了什么
当你按下电源键的时候,同这个键相联的电线就会送出一个电信号给主板,主板将此电信号传给供电系统,供电系统开始工作,为整个系统供电,并送出一个电信号给BIOS,通知BIOS供电系统已经准备完毕。随后BIOS启动一个程序,进行主机自检,主机自检主要工作是确保系统的每一个部分都得到了电源支持,内存储器,主板上的其它芯片,键盘,鼠标,磁盘控制器及一些I/O端口正常可用,此后,自检程序将控制权还给BIOS。

接下来,BIOS开始启动操作系统。
BIOS将访问启动盘的第一个扇区(0磁道,1扇区,一共是512字节),BIOS将这第一扇区中的内容调入内存的0x7c00地址处,并开始执行它。这是启动系统的第一关,从此之后,系统就将控制权将给操作系统了,留下的事情就由你的程序来完成。

现在我们的任务就是写这样一个程序,系统将它称之为引导程序,用它来引导或说启动我们的计算机。它有如下两个特点:
1。大小只能是512字节,不能多一字节,也不能少一字节。因为BIOS只能读512字节的数据到内存中,多的部份BIOS不会理采
2。它必须以"55?AA"结尾,即最后两字节(511,512)必须是它们。这是引导区程序结束的标志,没有它BIOS不会将它作为引导程序看待。(我以前的程序没有执行,就是因为没有在这里写"55?AA")
把这一程序放在磁盘的0磁道,1扇区里,这样,此磁盘就可以用来引导系统,而且是用的你自己做的引导程序!

在开始制作引导程序之前,先介绍一下怎样在Windows环境下进行这样的开发。

首先,需要一个实验环境,你当然可以就用真实的计算机,如果你有多台计算机的话,且不觉得麻烦的话。
这里我们使用虚拟机来进行实验,它与使用真实的计算机是一样的,不信待会儿你可以自己实验一下。
我用的是?MS?Virtual?PC,使用非常简单,这里就不多说了,它可以用一个1.44M大小的img文件,作为模拟软盘,因此,我们就只需把我们的引导程序写到一个img文件中,就如同写在了一张磁盘上面,就可以用它来引导系统。
启动虚拟机后,在Floopy菜单下,选Floopy?Disk?Image项,然后选到我们生成的那个img文件后,就可以了。

下面说说img文件的创建生成方法
要把引导程序写到这个1.44M的文件里面,我使用的是WinHex工具,它非常方便,可以直接通过拷贝完成二进制文件的写入,而且还可以创建指定大小的文件。
1.44M的img文件可以用WinHex来创建,点击新建按钮就行,大小输入1474560,单位字节。
到时后,把我们写的程序用WinHex打开,将其内容复制到生成的img文件下就行。

这些工具连同本文所介绍的实验程序,我已经打包,大家可以通过下面的地址下载
ftp://202.118.239.46/Incoming/Other/BTC/temp/os_test/os_test.rar

下面再介绍一个本程序用到的唯一一个BIOS中断,
Int?0x10
0x10?中断是BIOS的显示器中断,所有输出都需要调用此中断,在使用前你需要设置一部分寄存器的值以告诉BIOS怎样进行输出
ah?:?0x0e?打字机模式,告诉BIOS,把字符输出到屏幕上
bh?:?页码
bl?:?文字属性
al?:?欲现示的字符的ASCII码

好了,下面我们就能创建我们的引导程序,完整的源程序如下:

[BITS?16]?????????????????????? ;?告诉编译器,编译成16位的程序
[ORG?0x7C00]??????????????????? ;?告诉编译器,代码将从0x7c00处开始执行

main:???????????????????????????;?主程序?
mov?ax?,?0x0000???????????????? ;?以下两句设置数据段为0000
mov?ds?,?ax
mov?si?,?Message??????????????? ;?设置基址指针
call?ShowMessage??????????????? ;?调用显示函数
jmp?$?????????????????????????? ;?$?代表此语句的地址,表示在此语句此进行无限循环

ShowMessage:??????????????????? ;?显示函数
mov?ah?,?0x0e?????????????????? ;?设置现示模式
mov?bh?,?0x00?????????????????? ;?设置页码
mov?bl?,?0x07?????????????????? ;?设置字体属性

nextchar:
lodsb?????????????????????????? ;?字符载入指令
????????????????????????????????;?它将DS数据段中SI为偏移地址的源串中的一个字符取出送AL,
??????????????????????????????? ; 同时修改SI指向下一个字符
or?al?,?al????????????????????? ;?测试字符串是否为0
jz?return?????????????????????? ;?如果为零则表明字符串结束,跳转到返回指令处返回原调用函数
int?0x10????????????????????????;?调用BIOS?10号中断显示字符
jmp?nextchar??????????????????? ;?继续显示下一下字符
return:
ret???????????????????????????? ;?返回原调用函数

Message:
db?'Can?We?Write?A?Chinese?OS??';?定义显示消息
db?13?,?10?,?0????????????????? ;?13?表示回车,10?表示换到下一行?0?表示字符串结束?

times?510?-?(?$?-?$$?)?db?0???? ;?填充?0?以满足文件大小足够512字节?
??????????????????????????????? ;?$?表示当前语句的地址,$$?表示程序的起始地址
db?0x55?,?0xaa????????????????? ;?结束标志

用任何一个文件编辑器输入它之后,存为test.asm
然后用一个汇编程序编译它,我用的是nasm,
输入?nasm?test.asm
编译完成后,会生成一个?test?文件,用WinHex打开它,然后照上面讲的方法,把它写到一个img文件中,你就可以尝试一下用你自己的程序启动计算机了。
也可以用WinHex将它直接写到磁盘上,通过磁盘启动,这样的感觉非常爽啊~~~

下面是它的运行结果



一个操作系统非常的复杂,这里只是我的一个尝试实验的心得,它只完成了系统启动这一步,严格说来引导程序不算是操作系统,虽然它无比重要,一般来说,它需要把真正的操作系统的内核载入内存,然后用一条jmp指令跳转到真正的内核处执行。

抛砖引玉,希望有人能早日做出Chinese内核的,拥有自主知识产权的实用性操作系统。
错误不计其数,希望各位老师大侠牛人不吝指点,同好者共同探讨研究学习~~~
留个mail:[email protected]?^_^

原文:http://purec.binghua.com/Article/ShowArticle.asp?ArticleID=1

本文地址:http://com.8s8s.com/it/it28808.htm