如何制作电脑系统_如何编写电脑系统

在开始回答你的问题之前,先看看程序的发展历史,请留意有关储存器和数据的描述:

1834 年:Babbage 设想制造一台通用分析机,在只读存储器(穿孔卡片)中存储程序和数据 。Babbage在以后的时间里继续他的研究工作,并于1840 年将操作位数提高到了40 位,并基本实现了控制中心(CPU)和存储程序的设想,而且程序可以根据条件进行跳转,能在几秒内做出一般的加法,几分钟内做出乘、除法。

1890 年:美国人口普查部门希望能得到一台机器帮助提高普查效率。Herman Hollerith (后来他的公司发展成了IBM 公司)借鉴Babbage 的发明,用穿孔卡片存储数据,并设计了机器。结果仅用6 周就得出了准确的人口统计数据(如果用人工方法,大概要花10 年时间)。

1935 年:IBM 推出IBM 601 机。这是一台能在一秒钟内算出乘法的穿孔卡片计算机 。这台机器无论在自然科学还是在商业应用上都具有重要的地位,大约制造了1500 台。

1941 年夏季:Atanasoff 和学生Berry 完成了能解线性代数方程的计算机,取名叫"ABC "(Atanasoff-Berry Computer),用电容作存储器 ,用穿孔卡片作辅助存储器,那些孔实际上是"烧"上去的,时钟频率是60Hz,完成一次加法运算用时一秒。

1943 年1 月:Mark I 自动顺序控制计算机在美国研制成功。整个机器有51 英尺长 、5 吨重 、75万个零部件。该机使用了3304 个继电器,60 个开关作为机械只读存储器。程序存储在纸带上 ,数据可以来自纸带或卡片阅读器。Mark I 被用来为美国海军计算弹道火力表。

1943 年9 月:Williams 和Stibitz 完成了"Relay Interpolator ",后来命名为"Model Ⅱ Re-

lay Calculator "的计算机。这是一台可编程计算机,同样使用纸带输入程序和数据。它运行更可靠,每个数用7 个继电器表示,可进行浮点运算。

真空管时代的计算机尽管已经步入了现代计算机的范畴,但因其体积大、能耗高、故障多、价格贵,从而制约了它的普及和应用。直到晶体管被发明出来,电子计算机才找到了腾飞的起点。

1947 年:Bell 实验室的William B.Shockley 、 John Bardeen 和Walter H.Brattain 发明了晶体

管,开辟了电子时代新纪元。

1949 年:剑桥大学的Wilkes 和他的小组制成了一台可以存储程序的计算机,输入输出设备仍是纸带。

1949 年:EDVAC(Electronic Discrete Variable Automatic Computer--电子离散变量自动计算机)--第一台使用磁带的计算机。这是一个突破,可以多次在磁带上存储程序。这台机器是John von Neumann 提议建造的。

1950 年:日本东京帝国大学的Yoshiro Nakamats 发明了软磁盘 ,其销售权由IBM公司获得 。由此开创了存储时代的新纪元。

1951 年:Grace Murray Hopper 完成了高级语言编译器。

1951 年:UNIVAC-1 --第一台商用计算机系统诞生,设计者是J.Presper Eckert 和John Mauchly 。

被美国人口普查部门用于人口普查,标志着计算机进入了商业应用时代。

1953 年:磁芯存储器被开发出来。

1954 年:IBM 的John Backus 和他的研究小组开始开发FORTRAN(FORmula TRANslation) ,1957 年完成。这是一种适合科学研究使用的计算机高级语言。

1957 年:IBM 开发成功第一台点阵式打印机。

好了现在开始吧:

操作系统是什么呢?说白了就是一套计算机的指令集合,而计算机的指令就是'1010101'之类的机器码,说到底,‘1001010’也是数据,就是可以储存在介质之中的东东,比如纸质卡片,磁盘,芯片上。对于问题“第一个操作系统如何编写的呢”,可以归结为:第一个计算机软件如何编写(在这里,请改变对操作系统的神秘感,操作系统也是一个软件,一个特殊的程序),即是计算机的指令如何记录下来,并且被计算机执行。那么答案已经出来了~~,请再次看一下上面的例子,你会有所启发

这就是穿孔卡片,上面的是什么呢?你可以说它是一张很多孔的板,你也可以说它是计算机指令(如果被计算机执行),你还可以说它是程序(也要被计算机执行),你甚至可以说他操作系统(这段程序可以管理计算机上各个硬件)

这个可能很别扭:

如果说操作系统在下面的东西上,你可能会更易接受。但是,请注意,他们只是储存介质而已,关键上面是什么数据:

还有什么问题请问吧~~~

还有一个问题回答:“自带boot”虽然不知道你这是什么意思(boot程序),但是可以肯定告诉你,在硬件生产时,“可以”直接把’boot”生产在芯片上,为什么?如上说,程序就是10100数据,生产商只要在芯片上设置电路的通断,就可以表示10101001000101 (注意了,这里只是一个例子)

好吧,现在假设我们有电脑,要开发操作系统,但是知道计算机指令

那么下面的一段程序(示例)我不得不把他写在纸质笔记本上:

mov ax,0

..

...

这段程序人工翻译成机器码,到现在还没有操作系统:

101001001001010010010100101001001010001........

好了操作系统在我的纸上写好了,我就请求硬件开发商把我的程序刻录到软盘上,于是开发商就对照1001001010101011001001010010010.....把数据刻录到软盘上

于是,操作系统开发完毕,只要想办法被CPU执行就可以了

汇编和C语言

因为你知道最开始计算机运行在实模式下,整台机器由BIOS控制,所以你的任务主要就是先用汇编写一个loader(对的,就像lilo或者grub一样 ;p),用于从实模式跳到保护模式,然后加载你操作系统的内核,最后把控制权交给操作系统。当然你的loader需要是纯二进制,不能是其他的可执行文件格式例如ELF格式等等。

接下来就是操作系统内核的实现了,这个比较复杂,开始的页式储存等恐怕多半要用汇编完成,其后的多任务,文件系统或者是硬盘驱动就可以用纯C写了,要是你写一个宏内核还比较好实现些,微内核光看逻辑脑袋就大了,比较难实现的就在内核上。

具体的实现我也不明白,现在正在复读呢没空搞这个,曾经只写过一个由实模式跳转到保护模式的汇编程序,扩展了下下改成了500来行操作点显存还出了点问题,你要感兴趣自己动手试试吧,挺有意思的。

至于开发方式当然就是那么开发了,我汇编编译器用的nasm,C编译器用的gcc,其他的用到gdb和objdump等等,当然你也可以自己用自己喜欢的开发环境啦,适合就好。

至于虚拟机我都用qemu的,很多人都喜欢用bochs来运行调试自己写的操作系统,不过我编译bochs的时候不知道怎么少了一些库,于是就用了qemu了,编译大约十几分钟,别忘了./configure --help看看调试选项把它打开,要不然你的虚拟机只能运行不能调试你的操作系统的,调试的感觉和gdb差不多撒。

顺便做个广告,编辑器推荐vim,操作系统推荐使用slackware linux,感觉比fedora或者ubuntu等等发行版给力多了,分区格式推荐reiserfs,秒杀ext* ;p

顺便能不能多加点分呀 :D