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,所以它其實是個十六進制編輯器,但筆者習慣稱它為二進制編輯器,希望大家不要見怪。
■■■■■
雖然筆者對二進制編輯器如此地贊不絕口,但用它也解決不了什么實際問題。因為這就相當于“只要有了筆和紙,什么優秀的小說都能寫出來”一樣。筆和紙不過就是筆和紙而已,實際上對創作優秀的小說也幫不上多大的忙。所以大家在寫程序時,用的都是文本編輯器和編譯器,沒有誰只用二進制編輯器來做程序的。大家照相用的也都是數碼照相機,沒有誰只用二進制編輯器來做圖像文件。因此,我們用二進制編輯器進行的開發就到此為止,接下來我們要調轉方向,開始用編程語言來繼續我們的開發工作。不過有了這次的經驗,我們就知道了如果今后遇到什么特殊情況還可以使用二進制編輯器,它是非常有用的。而且后面章節中我們偶爾也會用到它。
- Kubernetes修煉手冊
- Linux網絡管理與配置(第2版)
- 阿里云數字新基建系列:云原生操作系統Kubernetes
- vSphere Virtual Machine Management
- 曝光:Linux企業運維實戰
- 網絡操作系統管理與應用(第三版)
- 直播系統開發:基于Nginx與Nginx-rtmp-module
- Linux內核觀測技術BPF
- 細說Linux基礎知識
- Application Development in iOS 7
- 深入淺出Node.js
- Kali Linux高級滲透測試
- Red Hat Enterprise Linux 6.4網絡操作系統詳解
- Learning BeagleBone
- Drupal 7 Cookbook