When Do We Write Our Chinese OS ? (1)

本文围绕操作系统展开,作者感慨现有操作系统多为国外产品,期望开发有中国特色的系统。详细介绍了计算机按下电源键后的启动流程,阐述了引导程序的特点及制作方法,包括在Windows环境下用虚拟机实验、创建img文件、使用BIOS中断等,最后分享了实验心得并期待自主操作系统诞生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作系统是计算机的核心,没有操作系统,一切计算机应用都免谈,但现在操作系统基本上被老外垄断,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:?_xiao_han_@126.com?^_^

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

Now, we have a way to perceive that the user is pressing a key. We know when we want to move up, down, left, and right. We know at each iteration of the main loop exactly, what the user wants; we just have to update the circle with a new position depending on this input. This method gives us a great advantage. So finally we can write something in our update() function, namely, the movement of our player. We check which of the four Boolean member variables is true, and determine the movement accordingly. By using += (instead of =) and if (instead of else if), we implicitly handle the case where two opposite keys, such as right and left are pressed at the same time—the movement stays zero. The update() function is shown in the following code snippet: void Game::update() { sf::Vector2f movement(0.f, 0.f); if (mIsMovingUp) movement.y -= 1.f; if (mIsMovingDown) movement.y += 1.f; if (mIsMovingLeft) movement.x -= 1.f; if (mIsMovingRight) movement.x += 1.f; mPlayer.move(movement); } We introduce two new things here: a vector and the move() function on the circle shape. The move() function does what its name says, it moves the shape by the amount we provide it. Vector algebra Vectors are an important part of algebraic mathematics. They imply lots of rules and definitions, which go beyond the scope of our book. However, SFML's sf::Vector2 class template is way more practical, both in concept and functionality. To be as simple as we could possibly be, we know that a coordinate in a two-dimensional Cartesian system would need two components: x and y. Because in graphics all coordinates are expressed with the decimal float data type, sf::Vector2 is instantiated as sf::Vector2<float>, which conveniently has a typedef named sf::Vector2f. Such an object is made to contain two member variables, x and y. This makes our life simpler, because now we don't need to pass two variables to functions, as we can fit both in a single sf::Vector2f object. sf::Vector2f also defines common vector operations, such as additions and subtractions with other vectors, or multiplications and divisions with scalars (single values), effectively shortening our code.翻译,要求每行中英文对照
最新发布
03-08
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值