Linux insides筆記(二)

感謝上帝,今天頭不怎麼疼。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

相關文章
相關標籤/搜索