首页
/
每日頭條
/
生活
/
linux開機引導和啟動過程詳解
linux開機引導和啟動過程詳解
更新时间:2024-10-21 07:04:27
BIOS加載bootloader階段

計算機接電之後第一個啟動的是BIOS,因為BIOS是存儲在主闆上的一個小程序,空間有限代碼量少因此功能受限。要經過一步步的控制權轉移,最後轉移給功能更加強大的操作系統。

BIOS對系統做一些簡單的初始化工作,然後把控制權交給MBR。約定MBR(Main Boot Record)存在于整個硬盤最開始的扇區。每個扇區都是512字節,MBR引導扇區的内容是:

linux開機引導和啟動過程詳解(Linux啟動過程簡述)1

  • 446字節的引導程序及參數

  • 64字節的分區表(每個分區表項16字節,因此隻能有4個主分區)

  • 2字節的結束标志0x55和0xaa

0x55和0xaa是MBR結束标志,0x7c00是MBR被加載在内存中的位置。

BIOS結束自己的工作以後,需要把控制權交給MBR,過程是:BIOS找到MBR并且把MBR加載在内存中,跳轉到該位置。

start_kernel

執行各種初始化函數:初始化IRQ、時鐘、CPU、内存、VFS、中斷向量表、内核子系統等等。最後調用

rest_init

,這幾乎是start_kernel的全部工作,

rest_init

創建一個内核線程,執行

kernel_init

rest_init

調用

schedule

啟動任務調度,調用

cpu_idle

cpu_idle

永遠運行,隻有當進程就緒列表中有就緒進程時候,cpu_idle才會被從CPU上拉下來,當沒有進程時候,這個空閑進程又被拉起來執行,這就是進程0。進程0漫長的工作終于結束了,從BIOS、MBR、Bootloader最後到kernel。雖然進程0從啟動的舞台上退出了,這并沒有意味着kernel啟動完成了。

進程0剛剛創建了一個内核線程執行

kernel_init

,還記得嗎?我們現在看看這個線程的運行。

kernel_init

負責初始化啟動剩下的CPU,從啟動分析到現在,我們隻有一個CPU在運行注意到了嗎?這個CPU我們成為引導CPU,剩下的應用CPU初始化依然需要從實模式開始。最後

kernel_init

調用

init_post

,這個函數嘗試執行一下用戶進程:

/sbin/init

/etc/init

/bin/init

/bin/sh

,如果全部失敗,産生kernel panic。如果上述程序存在,創建進程1運行(這個進程是所有用戶進程的父進程)。過程如下圖所示:

linux開機引導和啟動過程詳解(Linux啟動過程簡述)2

init讀取的第一個文件是

/etc/inittab

,從這裡init決定了我們的Linux操作系統的運行級别。Linux系統有7個運行級别(runlevel):

level 0:系統停機狀态

level 1:單用戶工作狀态

level 2:多用戶狀态

level 3:完全多用戶狀态

level 4:保留

level 5:X11

level 6:reboot

Init從/etc/fstab

文件中查找分區表信息,用真正的根文件系統替換initrd。Init然後啟動默認運行級别的/etc/init.d目錄中指定的所有服務或者腳本。這是所有服務由init逐個初始化的步驟。在這個過程中,一次一個服務由init啟動,所有守護程序在後台運行,init繼續管理它們。

至此,内核啟動基本結束了。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
Copyright 2023-2024 - www.tftnews.com All Rights Reserved