30天自制操做系統-1

第一天,算是正式開始了,這一天咱們在前面部分會作出一個在徹底沒有任何操做系統的基礎上打印一句話。可是咱們不會寫任何一句代碼。而是利用一個工具,一個二進制的工具。在這裏講一個故事, 不過是個假的故事,但理論上卻又可行。聽說啊,某天深夜,女神電腦壞了,找到了旁邊的程序員小哥哥,須要重裝,不過恰巧這時候沒有下載操做系統,那咋辦呢,因而那個程序員說沒事我來想辦法,而後一個通宵事後,電腦好了,原來是這個程序員拿了一個二進制編輯器,手按了一個操做系統出來,原文你們能夠在網上找找,後來被人證明這件事是在一夜不可能完成的,並且這也須要高超的記憶力。程序員

本章做者用的是c.mos公司的一款二進制編輯器,而後就按着做者說的開啓了漫長的按鍵,固然我沒有去作這件事,我是直接用的做者光盤裏生成好的img文件。按着做者的方式下來後,這就是一個操做系統了,不過他的功能很是很是簡單,直是在屏幕上輸出了hello,world。執行這個img也很是簡單,按照筆者說的,就行,注意把路徑改爲你真是的路徑,不然run的時候會報錯。框架

好了,來理解下剛纔按了那麼久的鍵盤作了些啥(雖然我沒有作)計算機只認識0和1這是一個計算機系人的常識了,猶如圖中,計算機要顯示出一個笑臉娃娃,就是由0和1來拼湊的。有了0和1那麼咱們就能夠把他變成0-9,甚至其餘任何進制。有了這個玩意兒,咱們給每個數字對應一個編號,而後他就能夠徹底模擬26個英文字母了(最初估計那波人壓根兒沒考慮要支持其餘語言)哪怕是一段音樂,文字,圖像,程序,等等的東西都是由二進制組成。那麼這時也不難理解爲啥剛纔敲了一堆二進制能作出一個操做系統來,固然你敲一段二進制而後說這個二進制就是一張圖片,那也能夠。。 因此二進制編輯器這玩意兒太強大了,不過就是不方便(手動滑稽)。什麼photoshop要錢買?我能夠手動用二進制寫一個啊。在輸入二進制的時候,在右邊會對應十六進制,至於進制這些轉換就不細說了,網上也是至關多的資料片。編輯器

接下來就弄點搞得懂的,或者說來點實際的。筆者給了一個超長源代碼。。。我也沒有再工程裏找到。按照筆者說的方式應該也能作出一個img文件。不過找到了後來精簡的helloos.nas,首先這裏面有幾個新指令是彙編的,DB是往文件裏寫入一個字節的指令(我以爲至於何是字節等問題你們請自行學習)而後就是RESB指令,看做者的意思是預約十個字節並填充爲0,這確實是幫了大忙呀。函數

雖然程序已經相比以前比較短了,關鍵是咱們就是難以看懂,難以維護。因此呢,下面讓咱們來看看咱們讀得懂的東西吧。。。。工具

; hello-os
; TAB=4學習

; 如下這段是標準FAT12格式軟盤專用的代碼編碼

DB        0xeb, 0x4e, 0x90
    DB        "HELLOIPL"        ; 啓動區的名稱能夠實任意的字符串(8字節)
    DW        512                ; 每一個扇區(sector)的大小(必須爲512字節)
    DB        1                ; 族(cluster)的大小(必須爲1個扇區)
    DW        1                ; FAT的起始位置(通常從第一個扇區開始)
    DB        2                ; FAT的個數(必須爲2)
    DW        224                ; 根目錄的大小(通常設成224項)
    DW        2880            ; 該磁盤的大小(必須是2880扇區)
    DB        0xf0            ; 磁盤的種類(必須是0xf0)
    DW        9                ; FAT的長度(必須是9扇區)
    DW        18                ; 一個磁道(track)有幾個扇區(必須是18)
    DW        2                ; 磁頭數(必須是2)
    DD        0                ; 不適用分區,必須是0
    DD        2880            ; 重寫一次磁盤大小
    DB        0,0,0x29        ; 意義不明,固定
    DD        0xffffffff        ; (多是)卷標號碼
    DB        "HELLO-OS   "    ; 磁盤的名稱(11字節)
    DB        "FAT12   "        ; 磁盤格式名稱(8字節)
    RESB    18                ; 空出18字節

; 程序主體操作系統

DB        0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
    DB        0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
    DB        0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
    DB        0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
    DB        0xee, 0xf4, 0xeb, 0xfd

; 信息顯示部分code

DB        0x0a, 0x0a        ; 2個換行
    DB        "Hello, world"
    DB        0x0a            ; 換行
    DB        0

    RESB    0x1fe-$            ; 填寫0x00直到0x001fe

    DB        0x55, 0xaa

; 如下是啓動區之外部分的輸出圖片

DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    4600
    DB        0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
    RESB    1469432

來進行解釋一下,DB,當咱們要寫一個字符串的時候,若是在純二進制下,咱們須要知道他的編碼,可是有了這個指令,他會自動去幫咱們算出所需對應編碼

DW是寫一個word其含義就是16字節,DD就是寫一個32字節,固然要寫8位的話能夠把16位拆成高8位和低8位。

RESB是預留多少字節,可是這裏有兩個疑問點一個是爲何是0x1fe和$是什麼,首先來看看第一個疑問點,一開始我也沒日後看的時候也有點疑問,可是把0x1fe一換算成十進制就明瞭了510 ,再結合很早之前就知道計算機讀取磁盤會讀取第一個扇區,就是512個字節,而後這512個字節裏面最後兩個必須是0x55,0xaa,減去後正好510字節,個因此恍然大悟。而後再來看看第二個疑問,這是nask編譯器的功能算出當前已經用了多少字節,固然這裏筆者的做用就是爲了湊夠512個字節。固然有可能前面就超過了510字節,固然,真正的操做系統不會這樣的,由於這個算是引導扇區,只會寫引導邏輯因此不用擔憂這個問題。

關於做者後面給了一些術語相關的解釋,大部分都比較簡單。
我說一下幾個比較重要的,第一個是啓動區,正如我前面所說,計算機啓動的時候會去讀取磁盤的第一個扇區。至於何爲扇區,請自行惡補。而後回去看這個扇區的後兩個字節是不是0x55,0xaa。
第二個IPL啓動程序加載器,也正如上面所說512個字節不能作不了太多的邏輯,可是,它能夠做爲一個起點。舉個例子,有點像main函數,通常大型點兒的項目main函數裏只會作一些框架的啓動,而不會在這個main函數裏作太多的邏輯。

今天就這樣,從二進制到咱們能看得懂的過程,仔細品味頗有意思,不過還有太多的問什麼等着咱們的,例如那個程序中每一行代碼什麼意思。。我曾讀到過一句話,對知識的深究必定要有個限度。否則你是永遠學不完的。

相關文章
相關標籤/搜索