Linux內核學習1-0——啟動(啟動簡述)

  啟動是個很微秒的過程。如何把關閉的系統開啟?一個開機鍵后,到底做了些什麽動作?按了開機鍵后,屏幕顯示一大堆文字又是怎麼一回事?好吧,上面的問題,將在這里被處決。

  解決問題前,我們先回到從前(爲什麽要回到從來我也不知道,但個人覺得因為那時的重裝系統比較原始吧,現在的都什麽一件還原了,這就沒有什麽好說的了)。在win98的時候,重裝是需要啟動磁盤的,而winXP開始,啟動磁盤就被拋棄了,我們就把刻度放到winXP的重裝上。

  winXP是通過光盤安裝的(我說的是當時,不是后來哦),當時有了winXP的光盤就可以充當重裝大王,但有光盤還是不夠的,你還得設置BIOS。

  那時候我的電腦還是奔騰III(Intel 80686),880MHz(這與BIOS無關,只是感歎硬件更新太快)。按下開機后,“嘟”的一聲,可以按下"Del"鍵,進入BIOS。在BIOS的某個選項里(具體是什麽選項,不同主板有點不一樣)可以選擇用什麽硬件設備啟動計算機(以前只有Floppy,CD-ROM,Hard Disk,現在可多了),放入光盤,選擇CD-ROM回車,確定保存,計算機會重啟,然後光驅就會被讀取,重裝過程開始。

BIOS:

  那BIOS是什麽東西,BIOS英文是Basic Input Output System,BIOS是固化在主板上的一個程序,它保存著計算機最重要的基本輸入輸出程序、系統設置信息、開機后自檢程序和系統自啟動程序。當按下開機鍵后,計算機會執行BIOS,用戶可以在載入時進入BIOS的配置,如果不配置BIOS將會預設值進入啟動,BIOS運行時,會對硬件進入檢測(屏幕上會反饋一系列自檢信息),當一系列檢測過後,計算機的啟動會因為選定的啟動設備不同而進入相應的系統啟動。BIOS會把啟動盤中的用於存放啟動引導程序的扇區(引導扇區,0磁道,0磁頭,1扇區)讀入從地址0x07c0(0x0000:0x07c0)開始的內存中,然後把運行指針IP(指令指針)指向0x07c0,從而進入軟件系統的啟動過程。到此BIOS的任務完成。

  以上所有步驟都由主板上的BIOS完成,可能有人會問,如果是ARM之類的那會怎麼樣,對於ARM我沒有認真研究過它的啟動(雖然一直都有做ARM的開發),但ARM與PC不一樣,PC一般用結構相對固定的主板,而ARM卻沒有(這與具體實現有關,不同實現硬件不同)。所以個人認為,ARM的程序會在編譯時,把啟動部份一同編譯到hex文件中,一般編譯環境都有一啟動相關的文件配置,由於不瞭解這部份,我也不亂吹了,以免誤人子弟。下面將以PC的角度去探討Linux。

SYSTEM BOOT:

  上面講到,當IP指針指向0x07c0時,BIOS的工作將完成,下一步的程序將從0x0c70開始運行,所以如果想要啟動系統,應該在引導扇區中寫入磁盤引導程序,在Linux 0.11中,這段代碼在bootsect.s文件中。所以當BIOS把bootsect.s代碼載入到0x0c70后,CPU將運行bootsect.s中的代碼。

  在運行bootsect.s時,bootsect.s會先把自己搬到0x90000(0x9000:0x0000),由於BIOS是整個扇區讀入的,所以搬bootsect.s要搬走一個扇區的大小512bytes. 搬運后從0x90000到0x90200存放的就是被搬過來的bootsect.s的代碼。

  內存片被搬運后,bootsect.s代碼被重定向運行(接著原來運行的代碼運行),然後把setup.s載入到從0x90200開始的內存片中,當setup.s被載入完畢后,bootsect.s會繼續把system部份(包括head.s 和內核,其中head.s在內核的前端)載入到0x10000內存開始處,并輸出“Loading system...”,最后,把IP指向setup.s(0x90200),把執行轉向setup.s.

  setup.s主要是通過BIOS中斷能出機器系統數據并將原來bootsect.s的區域保存這些數據(原來的bootsect.s將被覆蓋),然後把原來的system搬到0x00000開始的內存區中,然後經過一些載入、配置,把CPU轉入保護模式下運行(8086CPU有兩種模式,一種是實模式,一種是保護模式,實模式下的彙編就是我們平常學習的彙編,而保護模式有點不一樣,具體不同可自行瞭解)。

  head.s是需要運行在保護模式也,這也是 bootsect.s, setup.s使用Intel彙編,而head.s使用AT&T彙編的原因。head.s主要是系統運行前的一些初始化操作,載入數據段寄存器,重置中斷描述符表的,重置全局描述符表,硬件的一些檢測和設置管理內存分頁管理等,最后返回main地址,運行系統。

小結:

  由於此篇只是簡述,所以沒有深入講解每個文件的具體操作,具體說明將會在後面發布。由於啟動部份涉及彙編語言及一些相關的計算機原理,所以如果是從零開始或者是對相關知識不太瞭解的,應自行瞭解(下面有兩個相關知識,以後可能會在後面追加相關文章)。由於本人也是邊學邊寫,所以不免有錯誤紕漏之外,請諒解。

磁盤基本知識:http://bbs.mydigit.cn/read.php?tid=331754

8086CPU寄存器簡介:http://www.cnblogs.com/BoyXiao/archive/2010/11/20/1882716.html

  好吧,回到一開始的問題。

  如何打關閉的計算機開啟? 一個開機鍵后,到底做了些什麽動作?

  其實這兩個問題相似。當計算機上電時,CPU會運行指針指向主板上的ROM(由於內存還沒有被初始化,不知道是否有錯),使BIOS程序被執行,使計算機能夠進入下一步的啟動,然後的步驟就是上面bootsect.s, setup.s, head.s做的事了。

  按了開機鍵后,屏幕顯示一大堆文字又是怎麼一回事?

  其實這個顯示是讓人覺得等待時計算機是在工作的,如果計算機完全沒有反饋,用戶就不知道CPU到底在做什麽,是否死機了也不知道。所以顯示一大堆文字是爲了讓用戶知道當前計算機的工作狀態。

原文地址:https://www.cnblogs.com/bakasen/p/linuxStudy1-0.html