2 究竟做了些什么
为什么用这种方法就能开发出操作系统来呢?现在搞清楚这个问题,会对我们今后的理解很有帮助,所以在这里要稍做说明。
首先我们要了解电脑的结构。电脑的处理中心是CPU,即“central process unit”的缩写,翻译成中文就是“中央处理单元”,顾名思义,它就是处理中心。如果我们把别的元件当作中心来使用的话,那它就叫做CPU了,所以无论什么时候CPU都总是处理中心。不过这个CPU除了与别的电路进行电信号交换以外什么都不会,而且对于电信号,它也只能理解开(ON)和关(OFF)这两种状态,真是个没用的人呀(虽然它不是人吧,大家领会精神)。
CPU
我们平时会用电脑写文章、听音乐、修照片以及做其他各种各样的事情,我们用电脑所做的这些,其实本质上都不过是在与CPU交换电信号而已,而且电信号只有开(ON)和关(OFF)这两种状态。再说直白一点,CPU根本无法理解文章的内容,更不会鉴赏音乐、照片,它只会机械地进行电信号的转换。CPU有计算指令,所以它能够进行整数的加减乘除运算,也可以处理负数、计算小数以及10的100次方这样庞大的数值,它甚至能够处理我们初中才学到的平方根和高中才学到的对数、三角函数,而且所有这些计算仅通过一条指令就能简单实现。虽然CPU功能如此强大,但它其实根本不理解数的概念。CPU就是个集成电路板,它只是忠实地执行电信号给它的指令,输出相应的电信号。
这些概念可能不太容易理解,还是让我们来看个的具体例子吧。比如说,让我们用1来表示开(ON),用0来表示关(OFF),这样比较容易理解。我们可以用32×16=512个开(ON)和关(OFF)的集合(=电信号的集合),来显示出下面这个不甚好看的人头像。
我们也可以用00000000000000000000010010100010这32个电信号的集合来表示1186这个整数。(注:用二进制表示1186的话,就是10010100010)。我们还可以用01001011010011110100111101000010这32个电信号的集合来表示“BOOK”这个单词(注:这实际上就是电脑内部保存这个单词时的电信号集合)。
CPU能看见的就只有这些开(ON)和关(OFF)的电信号。换句话说,假如我们给CPU发送这么一串电信号:
00000100001110000000111000010000
这信号可能是一幅画的部分数据,可能是个二进制整数,可能是一段音乐旋律,可能是文章中的一段文字,也可能是保存了的游戏的一部分数据,或者是程序中的一行代码,不管它是什么,CPU都一窍不通。CPU不懂这些,也不在乎这些,它只是默默地、任劳任怨地按照程序的指令进行相应的处理。
■■■■■
看到这里,或许有人会认为是先有了这么多要做的事情,所以人类才发明了CPU,而实际上并不是这样。最早人们发明CPU只是为了处理电信号,那个时候没有人能想到它后来会成为这么有用的机器。不过后来人们发现,一旦把电信号的开(ON)/关(OFF)与数字0和1对应起来,就能将二进制数转换为电信号,同时电信号也可以转换回二进制数。所以,虽然CPU依然只能处理电信号,但它从此摇身一变,成了神奇的二进制数计算机。
因为我们可以把十进制数转换成二进制数,也能把二进制数还原成十进制数,所以人们又发明了普通的计算机。后来,我们发现只要给每个文字都编上号(即文字编码),就可以建立一个文字与数字的对应关系,从而就可以把文字也转换成电信号,让CPU来处理文章(比如进行文字输入或者字词检索等)。依此类推,人们接着又找到了将图像、音乐等等转换成电信号的方法,使CPU的应用范围越来越广。不过CPU还是一如既往,只能处理电信号。
而且我们能用CPU来处理的并不仅仅只有数据,我们还可以用电信号向CPU发出指令。其实我们所编写的程序最终都要转换成所谓的机器语言,这些机器语言就是以电信号的形式发送给CPU的。这些机器语言不过就是一连串的指令代码,实际上也就是一串0和1的组合而已。
软盘的原理也有异曲同工之妙,简单说来,就是把二进制的0和1转换为磁极的N极和S极而已,所以我们只用0和1就可以写出映像文件来。不仅是映像文件,计算机所能处理的各种文件最终都是用0和1写成的。因此可以说,不能仅用0和1来表达的内容,都不能以电信号的形式传递给CPU,所以这种内容是计算机所无法处理的。
■■■■■
而“二进制编辑器”就是用来编辑二进制数的,我们可以很方便地用它来输入二进制数,并保存成文件。所以它就是我们的秘密武器,也就是说只要有了二进制编辑器,随便什么文件我们都能做出来。(厉害吧!)如果大家在商店里看到一个软件,很想要而又不想花那么多钱的话,那就干脆就回家用二进制编辑器自己做一个算啦!用这个方法我们完全可以自己制作出一个与店里商品一模一样的东西来。看上一个500万像素的数码相机,但是太贵了买不起?那有什么关系?我们只要有二进制编辑器在手,就可以制作出毫不逊色于相机拍摄效果的图像,而且想做几张就可以做几张。要是C编译器太贵了买不起,也不用郁闷。即使没有C编译器,我们也可以用二进制编辑器做出一个与编译器生成文件完全一样的执行文件,而且就连C编译器本身都可以用二进制编辑器做出来。
有了这么强大的工具,制作操作系统就是小菜一碟。道理就是这么简单,所以我们这次不费吹灰之力就做了个操作系统出来也是理所当然的。或许有人会想“就为了讲这么个小事,有必要长篇大论写这么多吗?”其实不然,如果我们对CPU的基础有了彻底的理解,以后的内容就好懂多了。
■■■■■
“喂,且慢,我明白了二进制编辑器就是编辑二进制数的软件,可是在你让我输入你的helloos.img的时候,除了0和1以外,不是还让我输入了很多别的东西吗?你看,第一个不就是E吗?这哪里是什么二进制数?分明是个英文字母嘛!”……噢,不好意思,这说得一点错都没有。
虽然二进制数与电信号有很好的一一对应关系,但它有一个缺点,那就是位数实在太多了,举个例子来说,如果我们把1234写成二进制数,就成了10011010010,居然长达11位。而写成十进制数,只用4位就够了。因为这样也太浪费纸张了,所以计算机业界普遍使用十六进制数。十进制数的1234写成十六进制数,就是4D2,只用3位就够了。
那为什么非要用十六进制数呢,用十进制数不是也挺好的吗?实际上,我们可以非常简便地把二进制数写成十六进制数。
二进制数和十六进制数对照表
有了这个对照表,我们就能轻松进行二进制与十六进制之间的转换了。将二进制转换为十六进制时,只要从二进制数的最后一位开始,4位4位地替换过来就行了。如:
10011010010 → 4D2
反之,把十六进制数的4D2转换为二进制数的10011010010也很简单,只要用上面的对照表反过来变换一下就行了。而十进制数变换起来就没这么简单了。同理,八进制数是把3位一组的二进制数作为一个八进制位来变换的,这种计数法在计算机业界也偶有使用。
因此我们在输入EB的时候,实际上是在输入11101011,所以它其实是个十六进制编辑器,但笔者习惯称它为二进制编辑器,希望大家不要见怪。
■■■■■
虽然笔者对二进制编辑器如此地赞不绝口,但用它也解决不了什么实际问题。因为这就相当于“只要有了笔和纸,什么优秀的小说都能写出来”一样。笔和纸不过就是笔和纸而已,实际上对创作优秀的小说也帮不上多大的忙。所以大家在写程序时,用的都是文本编辑器和编译器,没有谁只用二进制编辑器来做程序的。大家照相用的也都是数码照相机,没有谁只用二进制编辑器来做图像文件。因此,我们用二进制编辑器进行的开发就到此为止,接下来我们要调转方向,开始用编程语言来继续我们的开发工作。不过有了这次的经验,我们就知道了如果今后遇到什么特殊情况还可以使用二进制编辑器,它是非常有用的。而且后面章节中我们偶尔也会用到它。