天天看點

Linux開機啟動

Linux開機啟動

linux開機啟動過程簡單描述:

1,             按下電源

2,             blos自檢,檢查CPU,硬碟,記憶體,主機闆等硬體

3,             進入MBR主引導區域,引導系統進入

4,             加載grub菜單,選擇系統核心。

5,             加載核心

6,             運作開機第一個程序init。

7,             讀取/etc/inittab清單,選擇系統運作級别。

8,             運作/etc/rc.d/rc.sysinit,初始化系統服務,設定主機名,ip位址等。

9,             加載/etc/rc.d/rc3.d相關的服務和軟體

10,        加載mingetty,進入登入界面。

linux開機啟動過程具體分析:

開機過程指的是從打開計算機電源直到LINUX顯示使用者登入畫面的全過程。分析LINUX開機過程也是深入了解LINUX核心工作原理的一個很好的途徑。

啟動第一步--加載BIOS

當 你打開計算機電源,計算機會首先加載BIOS資訊,BIOS資訊是如此的重要,以至于計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關 資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊、PnP特性等等。在此之後,計算機心裡就有譜了,知道應該去讀取哪個硬體裝置了。在BIOS将系 統的控制權交給硬碟第一個扇區之後,就開始由Linux來控制系統了。

啟動第二步--讀取MBR

硬 盤上第0磁道第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512位元組,可裡面卻存放了預啟動資訊、分區表資訊。可分為兩部分:第一部分為引導(PRE-BOOT)區,占了 446個位元組;第二部分為分區表(PARTITIONPABLE),共有66個位元組,記錄硬碟的分區資訊。預引導區的作用之一是找到标記為活動(ACTIVE)的分區,并将活動分區的引導區讀入記憶體。

系統找到BIOS所指定的硬碟的MBR後,就會将其複制到0×7c00位址所在的實體記憶體中。其實被複制到實體記憶體的内容就是BootLoader,而具體到你的電腦,那就是lilo或者grub了。

啟動第三步--Boot Loader

Boot Loader 就是在作業系統核心運作之前運作的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的映射圖,進而将系統的軟硬體環境帶到一個合适的狀态,以便為最終調用作業系統核心做好一切準備。通常,BootL oade:是嚴重地依賴于硬體而實作的,不同體系結構的系統存在着不同的BootLoader。

Linux的引導扇區内容是采用彙編語言編寫的程式,其源代碼在arch/i386/boot中(不同體系的CPU有其各自的boot目錄),有4個程式檔案:

◎bootsect.S,引導扇區的主程式,彙編後的代碼不超過512位元組,即一個扇區的 大 小

◎setup.S, 引導輔助程式

◎edd.S,輔助程式的一部分,用于支援BIOS增強磁盤裝置服務

◎video.S,輔助程式的另一部分,用于引導時的螢幕顯示

Boot Loader有若幹種,其中Grub、Lilo和spfdisk是常見的Loader,這裡以Grub為例來講解吧。

系統讀取記憶體中的grub配置資訊(一般為menu.lst或grub.lst),并依照此配置資訊來啟動不同的作業系統。

啟動第四步--加載核心

根據grub設定的核心映像所在路徑,系統讀取記憶體映像,并進行解壓縮操作。此時,螢幕一般會輸出“Uncompressing Linux”的提示。當解壓縮核心完成後,螢幕輸出“OK, booting the kernel”。

系統将解壓後的核心放置在記憶體之中,并調用start_kernel()函數來啟動一系列的初始化函數并初始化各種裝置,完成Linux核心環境的建立。至此,Linux核心已經建立起來了,基于Linux的程式應該可以正常運作了。

start_kenrel() 定義在init/main.c中,它就類似于一般可執行程式中的main()函數,系統在此之前所做的僅僅是一些能讓核心程式最低限度執行的初始化操作,真正的核心初始化過程是從這裡才開始。函數start_kerenl()将會調用一系列的初始化函數,用來完成核心本身的各方面設定,目的是最終建立起基 本完整的Linux核心環境。

start_kernel()中主要執行了以下操作:

(1) 在螢幕上列印出目前的核心版本資訊。

(2) 執行setup_arch(),對系統結構進行設定。

(3) 執行sched_init(),對系統的排程機制進行初始化。先是對每個可用CPU上的runqueque進行初始化;然後初始化0号程序(其task struct和系統空M堆棧在startup_32()中己經被配置設定)為系統idle程序,即系統空閑時占據CPU的程序。

(4)執行parse_early_param()和parsees_args()解析系統啟動參數。

(5)執行trap_in itQ,先設定了系統中斷向量表。0-19号的陷阱門用于CPU異常處理;然後初始化系統調用向量;最後調用cpu_init()完善對CPU的初始化,用于支援程序排程機制,包括設定标志位寄存器、任務寄存器、初始化程式調試相關寄存器等等。

(6)執行rcu_init(),初始化系統中的Read-Copy Update互斥機制。

(7)執行init_IRQ()函數,初始化用于外設的中斷,完成對IDT的最終初始化過程。

(8)執行init_timers(), softirq_init()和time_init()函數,分别初始系統的定時器機制,軟中斷機制以及系統日期和時間。

(9)執行mem_init()函數,初始化實體記憶體頁面的page資料結構描述符,完成對實體記憶體管理機制的建立。

(10)執行kmem_cache_init(),完成對通用slab緩沖區管理機制的初始化工作。

(11)執行fork_init(),計算出目前系統的實體記憶體容量能夠允許建立的程序(線程)數量。

(12)執行proc_caches_init() , bufer_init(), unnamed_dev_init(),vfs_caches_init(), signals_init()等函數對各種管理機制建立起專用的slab緩沖區隊列。

(13 )執行proc_root_init()Wl數,對虛拟檔案系統/proc進行初始化。

在start_kenrel()的結尾,核心通過kenrel_thread()建立出第一個系統核心線程(即1号程序),該線程執行的是核心中的init()函數,負責的是下一階段的啟動任務。最後調用cpues_idle()函數:進入了系統主循環體口預設将一直執行 default_idle()函數中的指令,即CPU的halt指令,直到就緒隊列中存在其他程序需要被排程時才會轉向執行其他函數。此時,系統中唯一存 在就緒狀态的程序就是由kerne_hread()建立的init程序(核心線程),是以核心并不進入default_idle()函數,而是轉向 init()函數繼續啟動過程。

啟動第五步--使用者層init依據inittab檔案來設定運作等級

核心被加載後,第一個運作的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案,并依據此檔案來進行初始化工作。

其實/etc/inittab檔案最主要的作用就是設定Linux的運作等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運作在等級5上。Linux的運作等級設定如下:

0:關機

1:單使用者模式

2:無網絡支援的多使用者模式

3:有網絡支援的多使用者模式

4:保留,未使用

5:有網絡支援有X-Window支援的多使用者模式

6:重新開機系統,即重新開機

啟動第六步--init程序執行rc.sysinit

在 設定了運作等級後,Linux系統執行的第一個使用者層檔案就是/etc/rc.d/rc.sysinit腳本程式,它做的工作非常多,包括設定PATH、 設定網絡配置(/etc/sysconfig/network)、啟動swap分區、設定/proc等等。

線程init的最終完成狀态是能夠使得一般的使用者程式可以正常地被執行,進而真正完成可供應用程式運作的系統環境。它主要進行的操作有:

(1) 執行函數do_basic_setup(),它會對外部裝置進行全面地初始化。

(2) 建構系統的虛拟檔案系統目錄樹,挂接系統中作為根目錄的裝置(其具體的文 件系統已經在上一步驟中注冊)。

(3) 打開裝置/dev/console,并通過函數sys_dup()打開的連接配接複制兩次,使得檔案号0,1 ,2 全部指向控制台。這三個檔案連接配接就是通常所說的“标準輸入”stdin,“标準輸出”stdout和“标準出錯資訊”stderr這三個标準I/O通道。

(4) 準備好以上一切之後,系統開始進入使用者層的初始化階段。核心通過系統調用execve()加載執T子相應的使用者層初始化程式,依次嘗試加載程 序"/sbin/initl","/etc/init"," /bin/init',和“/bin/sh。隻要其中有一個程式加載獲得成功,那麼系統就将開始使用者層的初始化,而不會再回到init()函數段中。至 此,init()函數結束,Linux核心的引導 部分也到此結束。

啟動第七步--啟動核心子產品

具體是依據/etc/modules.conf檔案或/etc/modules.d目錄下的檔案來裝載核心子產品。

啟動第八步--執行不同運作級别的腳本程式

根據運作級别的不同,系統會運作rc0.d到rc6.d中的相應的腳本程式,來完成相應的初始化工作和啟動相應的服務。

啟動第九步--執行/etc/rc.d/rc.loca

你如果打開了此檔案,裡面有一句話,讀過之後,你就會對此指令的作用一目了然:

# This script will be executed *after* all theother init scripts.

# You can put your own initialization stuff in hereif you don’t

# want to do the full Sys V style init stuff.

rc.local就是在一切初始化工作後,Linux留給使用者進行個性化的地方。你可以把你想設定和啟動的東西放到這裡。

繼續閱讀