0x100-從頭開始寫操作系統-啓動

目錄

本系列介紹

這個系列,基於 Nick Blundell 2010 年的文獻 Writing a Simple Operating System — from Scratch,記錄一下學習操作系統底層的過程。

有能力閱讀英文的同學,直接到 這裏 閱讀英文原版。沒有信息丟失。

這份文獻並沒有完結,出於各種原因最後幾個章節那麼多年也沒有再補全。但是已有的內容,已經足夠我們看清全局,作爲進一步深入學習的敲門磚。

在看本系列文章的時候,配合 cfenollosa 的 Github Repo。Nick Blundell 沒有完結的幾個章節,cfenollosa 的 Repo 中都有代碼,可以自行配合 Google 理解。

就像作者所說,Writing a Simple Operating System — from Scratch 不是教我們如何寫一個功能健全的操作系統,而是將操作系統底層通用的邏輯展示出來,希望在整個工程結束之後,能爲各位今後無論在計算機技術任何一方面的發展,做一塊墊腳石。

開篇 —— 計算機的啓動(Boot)

不要和操作系統啓動混淆,這裏講的是計算的啓動,遠在操作系統之前。

計算機啓動的時候,任何我們熟知的與操作系統相關的內容,如文件系統,讀寫設備,都不存在。這個時候能工作的,只有 BIOS,Basic Input/Ouput Software。

BIOS 被燒錄在計算機的一塊 ROM 當中,在計算機啓動的時候,BIOS 負責計算機硬件的檢測,以及控制計算機最基礎的一些硬件,如顯示器,鍵盤,硬盤。

BIOS 在對一些至關重要的硬件,如內存,做完檢查之後,就到了要加載操作系統的時候。

但是重申,BIOS 並不知道有文件系統的存在,它只知道從一個指定的區域,如硬盤的第幾個柱面 (Cylinder),第幾個磁頭(Head),第幾個扇區(Sector)去讀取數據,通常,BIOS 會讀取 512個字節的數據。

因此,最簡單的方式,就是設置 BIOS 去讀取 0 柱面,0 磁頭,0 扇區位置上的 512 個字節,這快區域被稱爲 boot sector,按字面意思翻譯爲啓動扇區

再明確一點,BIOS 和 CPU 都無法區分什麼是數據,什麼是指令。CPU 會執行 EIP 寄存器指向的任何數據。BIOS 也必須有一種機制,讓它知道,哪裏纔是加載操作系統所需的啓動扇區。有時候我們的電腦不止一塊硬盤,那麼讓 BIOS 知道哪一塊硬盤上纔有啓動扇區,那麼它才能成功讀取扇區上的數據,計算機啓動過程才能繼續。

因此,啓動扇區的最後 2 個字節,一定是這個被稱爲神奇數字的 0xaa55

BIOS 循環讀取每個存儲介質的前 512 字節,找到最後 2 個字節爲 0xaa55 的介質,加載操作系統。

至此,BIOS 將控制權移交給操作系統。

啓動扇區的 16 進制展示

如果我們將加載操作系統的程序用 16 進制寫出來,就像下面這個樣子。

e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
  • 前三個字節,e9 fd ff,是無限循環的機器指令
  • 緊接着是 507 個字節的 0
  • 最後兩個是上文所說的神奇數字,0xaa55

這裏要注意的是,x86 處理器都是小字節序(Little-Endian),實際的高位,寫入到內存中的低位。

前三個字節,由於寫作時間的原因,在如今的計算機上可能有所不同。接下來的第二篇,我們會講到如何用模擬器運行 boot sector 代碼,可以清楚看到整個 boot sector 的內容。

總結

  • 計算機啓動之初,只有 BIOS
  • BIOS 負責檢測計算機硬件,讀取 boot sector,加載操作系統
  • boot sector 一般都是 512 個字節,最後兩個字節,一定是 0xaa55
  • BIOS 讀取到 0xaa55,加載操作系統,將計算機控制權交給操作系統

參考文獻:

  • Writing a Simple Operating System — from Scratch by Nick Blundell

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章