Linux核心的引導

2021-09-07 13:07:23 字數 1882 閱讀 4268

1,當系統上電或復位時,cpu會將pc指標賦值為乙個特定的位址0xffff0並執行該位址處的指令。在pc機中,該位址位於bios中,它儲存在主機板上的rom或flash中

2,bios執行時按照cmos的設定定義的啟動裝置順序來搜尋處於活動狀態並且可以引導的裝置。若從硬碟啟動,bios會將硬碟mbr(主引導記錄)中的內容載入到ram。mbr是乙個512位元組大小的扇區,位於磁碟上的第乙個扇區中(0道0柱面1扇區)。當mbr被載入到ram中之後,bios就會將控制權交給mbr

3,主引導引導程式查詢並載入次引導引導程式。它在分割槽表中查詢活動分割槽,當找到乙個活動分割槽時,掃瞄分割槽表中的其他分割槽,以確保它們都不是活動的。當這個過程驗證完成之後,就將 活動分割槽的引導記錄從這個裝置中讀入ram中並執行它

4,次引導引導程式載入linux核心和可選的初始ram磁碟,將控制權交給linux核心源**。

5,執行被載入的核心,並啟動使用者空間應用程式

另外,第5階段,它完成啟動核心並執行使用者空間的 init程序

當核心映像被載入到ram之後,bootloader的控制權被釋放,核心階段就開始了。核心映像並不是完全可直接執行的目標**,而是乙個壓縮的zimage(小核心)或bzimage(大核心,b表示big)

但是,並非zimage和bzimage映像中的一切都被壓縮了,否則bootloader把控制權交給菏澤哥核心映像它就傻了。實際上,映像中包含未被壓縮的部分,這部分中包含解壓縮程式,解壓縮程式會解壓映像中被壓縮的部分。zimage和bzimage都是用gzip壓縮的,它們不僅是乙個壓縮檔案,而且在這兩個檔案的開頭部分內嵌有gzip解壓縮**

當bzimage(用於i386映像)被呼叫時,它從/arch/i386/boot/head.s的start彙編例程開始執行。這個程式執行一些基本的硬體設定,並呼叫

/arch/i386/boot/compressed/head.s中的startup_32例程。startup_32程式設定一些基本的執行環境(如堆疊)後,清除bss段,呼叫

/arch/i386/boot/compressed/misc.c中的decompress_kernel()c函式解壓核心。核心被解壓到記憶體之後,會呼叫

/arch/i386/kernel/head.s檔案中的startup_32例程,這個新的startup_32例程(稱為清除程式或程序0)會初始化頁表,並啟用記憶體分頁機制,接著為任何可選的浮點單元(fpu)檢測cpu的型別,並將其儲存起來供以後使用。這些都做完之後,/init/main.c中的start_kernel()函式被呼叫,進入與體系結構無關的linux核心部分

start_kernel()會呼叫一系列初始化函式來設定中斷,執行進一步的記憶體配置。之後,/arch/i386/kernel/process.c中kernel_thread()被排程以啟動第乙個核心執行緒,該執行緒執行init()函式,而原執行序列會呼叫cpu_idle()等待排程

作為核心執行緒init()函式完成外設及驅動程式的載入和初始化,掛接根檔案系統。

init()開啟/dev/console裝置,重定向stdin、stdout和stderr到控制台。之後,它搜尋檔案系統中的init程式(也可以由「init=」命令列引數指定init程式),並使用execve()系統呼叫執行init程式。搜尋init程式的順序為:/sbin/init、/etc/init、/bin/init和/bin/sh。在嵌入式系統中,多數情況下,可以傳給核心乙個簡單的shell指令碼來啟動必需的嵌入式應用程式

至此,漫長的linux核心引導和啟動過程就此結束,而init()對應的這個由start_kernel()建立的第乙個執行緒也進入使用者模式

Linux核心的引導

1,當系統上電或復位時,cpu會將pc指標賦值為乙個特定的位址0xffff0並執行該位址處的指令。在pc機中,該位址位於bios中,它儲存在主機板上的rom或flash中 2,bios執行時按照cmos的設定定義的啟動裝置順序來搜尋處於活動狀態並且可以引導的裝置。若從硬碟啟動,bios會將硬碟mbr...

Linux核心的引導

1,當系統上電或復位時,cpu會將pc指標賦值為乙個特定的位址0xffff0並執行該位址處的指令。在pc機中,該位址位於bios中,它儲存在主機板上的rom或flash中 2,bios執行時按照cmos的設定定義的啟動裝置順序來搜尋處於活動狀態並且可以引導的裝置。若從硬碟啟動,bios會將硬碟mbr...

UBOOT引導Linux核心及向核心傳遞引數的方式

一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導 uboot格式 的核心。先花點時間了解一下什麼是 uboot格式 的核心吧 用uboot自帶的mkimage命令生成的核心稱為 ubo...