Linux 核心載入過程

2021-06-27 14:18:06 字數 1914 閱讀 8248

最近在研究linux的核心載入過程,對於grub是如何引導linux的核心並啟動還是有點混亂,結合網上找的一些資料總結了一下大概流程,部分是摘抄別人的,算是比較清晰思路了。

arch/i386/boot

bootsect.s生產引導扇區的彙編**,完成後跳轉到setup.s    (3.16.2核心對應x86的合併head.s),這個跟grub的功能差不多,如果grub設定在了mbr區引導,應該就不用這個了。

setup.s將系統引數(包括記憶體、磁碟等)拷貝到特別記憶體中,後面被保護模式的**讀取 (3.16.2核心對應x86的合併head.s),如果核心是壓縮的,那麼先執行compressed裡面的head.s建立堆疊並解壓核心映像檔案再轉入下面的head.s,如果不是壓縮的核心則直接跳轉。

arch/i386/kernel/head.s跳到0x100000之後,就是這個裡面的startup_32 它也是vmlinuz的入口,負責資料區bbs,中斷描述表idt,段描述表gdt,頁表和暫存器的初始化,然後就跳轉到start_kernel()中去了,此時系統執行在核心模式(0級別),start_kernel()是init/main.c中的定義的函式。

start_kernel()主要是初始化系統的核心資料結構,主要包括: 

setup_arch():執行與體系結構相關的設定。 

trap_init():設定各種入口位址。 

init_irq():初始化irq中斷處理機制。 

sched_init():設定並啟動第乙個程序init_task()。 

softirq_init():對軟中斷子系統進行初始化。 

console_init():初始化控制台、顯示器. 

init_modules():初始化kernel_module。 

fork_init():定義系統最大程序數. 

最後進入rest_init()函式並呼叫kernel_thread()建立init核心執行緒,進行系統配置。 

init核心執行緒占用程序描述表的第一項,由它來建立其他完成系統初始化的程序。 

init核心執行緒首先要鎖定核心,然後呼叫do_basic_setup()來初始化外部裝置及載入驅動程式。主 

要的初始化工作包括: 

pci匯流排初始化。 

網路初始化。 

檔案系統初始化。 

載入檔案系統。 

在do_basic_setup()呼叫完成後,init()會釋放初始化函式據占用的記憶體,並且開啟/dev/console 

裝置重新定向控制台,用系統呼叫execve來執行使用者態程式/sbin/init。至此,linux的核心初始化工作完成。

下面的工作就由使用者態的/sbin/init程式來完成。init程式程讀取/etc/inittab檔案來決定它具體的工作。在inittab中比較重要的幾條是: 

id:5:initdefault 決定作業系統啟動時預設的執行級別(這裡說講的是系統的執行級別,而不同於cpu的級別) 

si:sysinit:/etc/rc.d/rc.sysinit 執行/etc/rc.d/rc.sysinit的指令碼。rc.sysinit主要的工作是 啟用交換分割槽、檢查磁碟、載入硬體模組。 

1:2345:respawn:/sbin/mingetty tty1 顯示登入介面

其它關鍵檔案:

arch/i386/bootvideeo.s  這個應該也是包含在setup.s中,檢測和設定顯示器的顯示模式。

arch/i386/boot/compressed/最初引導過程是用裡面的head.s利用misc.c中定義的decompress_kernel()函式將核心vmlinuz解壓到0x100000

核心模組載入過程

載入過程 巨集module init本質是將核心中函式的指標指向模組的初始化函式.啟動時載入 過程 系統在進入與體系結構無關的核心部分後,開始呼叫 init main.c中的start kernel 函式.經過start kernel rest init kernel thread kernel i...

linux 核心模組載入 HelloWorld

1。建立hello目錄 mkdir hello 2。進入hello目錄 cd hello 3。編寫hello.c include include module license gpl static int hello init void static void hello exit void mod...

Linux核心驅動載入順序

問題 背光驅動初始化先於lcd驅動初始化,導致lcd驅動初始化時出現閃屏的現象。解決過程 1 mach c中platform devices列表如下 platform devices static struct platform device athena evt platform devices ...