感謝上帝,今天頭不怎麼疼。linux
昨天重溫了今敏老師的 紅辣椒。劇中千葉對時田不顧dcmini丟失後種種可怕事故,癡心於最終完成dcmini的行爲勃然大怒,大意說:ios
你和冰室都是這樣,只作大家願意作的事而不去作應該作的事。自覺得是百年一遇的天才,什麼dcmini很棒啊,你這個死宅你就擼一生吧函數
嗯,就像linux這種東西,對我沒用,我看看於世界也沒用,確實不像是應該作的事情。操作系統
然而羅素說設計
The time you enjoy wasting is not wasted time.內存
然而世界上沒什麼應該作的事,全如塵芥。無苦集滅道,無智亦無得。文檔
零零碎碎,手機敲了一個半小時╯﹏╰這是個沒有情懷的世界,恰恰但願有些情懷,由於我曾感覺過它。源碼
如下正文。io
Bios將硬盤第一扇區512字節載入內存地址ox7coo,bios正式把控制權交給bootloader.編譯
Bootloader的主要任務,準備好把控制權交給操做系統內核。然而grub2功能不少,還要處理歷史遺留兼容和錯誤處理,須要比這512字節更大的空間,設計者因而設計grub分三步載入全部程序到符合規定的內存地址上,並執行這些載入的程序。
Grub2要想啓動linux內核,要遵循內核啓動協議。在linux源碼文檔中有這個協議。準備好各項工做以後,把linux內核載入內存選定區域中,至於選定區域在哪,協議文檔和源碼中有建議和答案。填入內核啓動信息,控制權移交內核。
內核首先還有設置自身不少東西。操做系統,由於顯而易見的緣由可能是用c啊rust這種更人類友好的語言完成,然而呢,c語言編譯的程序運行是須要各類條件的,好比bss段啊,堆棧啊啥的,然而目前並無。
咱們首先要讓各個段寄存器的值同樣,剛進入內核時,前面有一段給uefi用的數據,所以cs設置會不一樣,但以後,須要調整成和其它寄存器同樣。
咱們還要正確設置堆棧(這裏他在說啥不知道)反正是按規定在狹小的空間設置好狹小的有堆或沒有的棧。我並不知道c程序編譯成的程序能沒有堆運行。。。
接下來,內核檢查魔術字段,確保段寄存器和棧都設置好了。
接着設置bss段,在合適的位置設置合適的大小區域爲bss.將bss區域初始化爲o.這在源碼中有細節。
最後,就能夠跳轉到c的main函數了。
之因此操做系統用c寫,我猜彙編寫複雜點程序太難過,不信建議你本身寫bootloader試試。
總之,經過程序不斷載入內存和控制權移交,內存中東西愈來愈豐富。以後就該內核中的c代碼繼續內核的啓動任務。
下回在寫
Cheers