讀Kernel感悟-Linux核心啟動-BIOS

來源:互聯網
上載者:User

文章來源:http://www.top-e.org/jiaoshi/html/?196.html

 

“真羅嗦,直接告訴我Linux下用glibc庫編譯出來的C程式真正的入口地址是_start()不就行了嗎?”臭雞蛋撲面而來。

嗯,我說了我只是想用一種特別的方式來敘述問題。我更看重探索的過程中體現的思考方式以及其中的樂趣。

回到我們的主題。Linux核心為什麼不是從main函數開始執行?事實上,Linux核心原始碼裡有許多main()函數,但仔細一看。他們都是運行在使用者態的。其實,從上一節中可以看到,main()函數只是一個符號而已。很多書上提到start_kernel()。它類似於main()。但正如調用main()的是_start()。在start_kernel之前仍然有很多代碼。所以核心的真正入口並不是start_kernel()。

     真正決定程式執行入口的是載入程式。對普通的C程式helloworld來說,Linux核心(嚴格的說應該是bash)負責設定helloworld的進入點,並且啟動helloworld進程的執行。

       於是,問題出現了,Linux核心的載入程式是什麼呢?難道是自己載入自己?

這類類似的問題在電腦史上出現過很多次,比如,C程式可以用C編譯器來寫,那麼,C編譯器用什麼來寫呢?當然,解決的方案有很多種,比如,用組合語言寫。那麼彙編器用什麼寫呢?可以用機器語言寫。雖然是件痛苦的事,但是一想到能造福這麼多人,(發散一下,C編譯器可以編譯出各種新的語言的編譯器或者解譯器如perl,然後程式員們再用perl來編出各種複雜的系統),簡直太偉大了,那位用機器語言寫彙編器的程式員一定會渾身幹勁。可以借鑒一下思路,這類問題的常見的解決方式是構造一個簡單的系統來解決一個複雜的系統的問題,如此往複,像滾雪球一下,最終把一個極為複雜的問題解決掉。所以,很自然的想到,用一個簡單的核心,(不,它僅僅是一段程式,甚至不能稱之為核心,因為它的功能很有限)來啟動真正的核心。就像用一個小當量的原子彈來引爆氫彈一樣。

      本著KISS(keep it simple and stupid)的原則,你第一時間可能會想到BIOS。BIOS通常存在ROM上。隨著ROM容量的擴充(達1M甚至更多)PC上的BIOS功能已經很強大了,包括了很多裝置的驅動程式。不僅可以進行硬體的檢測,還實現了基本的輸入輸出功能。(basic input / output system,這也是它的本意)。開機時按del鍵出現的BIOS設定畫面就是BIOS的傑作。在BIOS上實現一個OS也不是不可能。事實上DOS就是在BIOS的基礎上實現的。

       然而,BIOS的一個致命的缺點是到目前為止它基本上只能在16位真實位址模式下運行,畢竟ROM的容量很有限。(當然也不絕對,BIOS也提供了在保護模式下掃描PCI裝置的方法,大牛們yy一下實現一個保護模式下啟動並執行BIOS的可行性。)而CPU剛加電時處在16位真實位址模式下。它的另一個致命的缺點是太小。因為現代作業系統多種多樣,BIOS再強大也無法把所有可能的情況都考慮進去。

不過即使這樣,PC機剛啟動時,x86 CPU仍然會自動從BIOS開始啟動,這是由硬體決定的,因為加電時,寄存器CS裡的值為0xffff,IP裡的值為0。於是CPU從線性地址0xffff0處開始取指令。0xffff0處是什麼地方呢?

運行cat /proc/iomem

前面5行

00000000-0009fbff : System RAM

0009fc00-0009ffff : reserved

000a0000-000bffff : Video RAM area

000c0000-000cc7ff : Video ROM

000f0000-000fffff : System ROM

可以看到0xffff0處是System ROM,也就是BIOS

注意這裡的地址是16位真實位址模式下的線性地址。

而BIOS能做的事,包括開機時對裝置的檢測,最後去讀硬碟上的第一個扇區(即開機磁區MBR)的512個位元組,把它們拷貝到地址為0x7c00處的記憶體中。到此為止,BIOS的引導使命已經完成。雖然以後Linux核心的引導還要用到BIOS的功能,但引導的使命已經落在其它程式上了。

文章來源:http://www.top-e.org/jiaoshi/html/?196.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.