www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導讀]Linux啟動過程剖析

Linux啟動過程的剖析能幫助那些想深入學習Linux用戶建立一個相關(guān)Linux啟動過程的清晰概念,進而可以進一步研究Linux接下來是如何工作的。

Linux啟動過程如下:當用戶打開PC的電源,BIOS開機自檢,按BIOS中設置的啟動設備(通常是硬盤)啟動,接著啟動設備上安裝的引導程序lilo或grub開始引導Linux,Linux首先進行內(nèi)核的引導,接下來執(zhí)行init程序,init程序調(diào)用了rc.sysinit和rc等程序,rc.sysinit和rc當完成系統(tǒng)初始化和運行服務的任務后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統(tǒng),用戶登錄成功后進入了Shell,這樣就完成了從開機到登錄的整個啟動過程。如圖所示:

 

<center>

 

下面分步來介紹下linux的啟動過程

1、BIOS自檢

當你打開計算機電源,計算機會首先加載BIOS信息,BIOS信息是如此的重要,以至于計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關(guān)信息、設備啟動順序信息、硬盤信息、內(nèi)存信息、時鐘信息、PnP特性等等。在此之后,計算機心里就有譜了,知道應該去讀取哪個硬件設備了。

計算機在接通電源之后首先由BIOS進行自檢,即進行所謂的POST(Power ON Self Test),然后依據(jù)BIOS內(nèi)設置的引導順序從硬盤、軟盤或CDROM中讀入“引導塊”。 在 PC 中,引導 Linux 是從 BIOS 中的地址 0xFFFF0 處開始的。BIOS 的第一個步驟是加電自檢(POST)。POST 的工作是對硬件進行檢測。BIOS 的第二個步驟是進行本地設備的枚舉和初始化。給定 BIOS 功能的不同用法之后,BIOS 由兩部分組成:POST 代碼和運行時服務。當 POST 完成之后,它被從內(nèi)存中清理了出來,但是 BIOS 運行時服務依然保留在內(nèi)存中,目標操作系統(tǒng)可以使用這些服務。

要引導一個操作系統(tǒng),BIOS 運行時會按照 CMOS 的設置定義的順序來搜索處于活動狀態(tài)并且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區(qū)、網(wǎng)絡上的某個設備,甚至是 USB 閃存。通常,Linux 都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。

眾所周知,硬盤上第0磁道第一個扇區(qū)被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節(jié),別看地方不大,可里面卻存放了預啟動信息、分區(qū)表信息。系統(tǒng)找到BIOS所指定的硬盤的MBR后,就會將其復制到0×7c00地址所在的物理內(nèi)存中。當 MBR 被加載到 RAM 中之后,BIOS 就會將控制權(quán)交給 MBR。其實被復制到物理內(nèi)存的內(nèi)容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。

提取MBR的信息

要看MBR的內(nèi)容,請使用下面的命令

#從/dev/sda上讀取前512個字節(jié)的內(nèi)容,并將其寫入mbr.bin文件中

root@farsight:/home/linux# dd if=/dev/sda f=mbr.bin bs=512 count=1

1+0 records in

1+0 records out

512 bytes (512 B) copied, 0.000798615 seconds, 641 kB/s

#以十六進制和ASCII碼格式打印這個二進制文件的內(nèi)容

root@farsight:/home/linux# od -xa mbr.bin

0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e

k H dle dle so P < nul 0 8 nul nul so X so @

0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006

{ > nul | ? nul ack 9 nul stx s $ j ! ack nul

0000040 be00 07be 0438 0b75 c683 8110 fefe 7507

nul > > bel 8 eot u vt etx F dle soh ~ ~ bel u

……

這個 dd 命令需要以 root 用戶的身份運行,它從 /dev/hda(第一個 IDE 盤) 上讀取前 512 個字節(jié)的內(nèi)容,并將其寫入 mbr.bin 文件中。od 命令會以十六進制和 ASCII 碼格式打印這個二進制文件的內(nèi)容。

2、啟動GRUB/LILO

Boot Loader 就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核做好一切準備。

Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。

GRUB和LILO都是引導加載程序,它們會引導操作系統(tǒng)。當機器引導它的操作系統(tǒng)時,BIOS會讀取引導介質(zhì)上最前面的512字節(jié)(即MBR: master boot record)。在單一的 MBR 中只能存儲一個操作系統(tǒng)的引導記錄,所以當需要多個操作系統(tǒng)時就會出現(xiàn)問題。所以需要更靈活的引導加載程序。

GRUB 與 LILO 的比較

所有引導加載程序都以類似的方式工作,滿足共同的目的。不過,LILO 和 GRUB 之間有很多不同之處:

● LILO 沒有交互式命令界面,而 GRUB 擁有。

● LILO 不支持網(wǎng)絡引導,而 GRUB 支持。

● LILO 將關(guān)于可以引導的操作系統(tǒng)位置的信息物理上存儲在 MBR 中。如果修改了 LILO 配置文件,必須將 LILO 第一階段引導加載程序重寫到 MBR。相對于 GRUB,這是一個更為危險的選擇,因為錯誤配置的 MBR 可能會讓系統(tǒng)無法引導。使用 GRUB,如果配置文件配置錯誤,則只是默認轉(zhuǎn)到 GRUB 命令行界面。

安全提示:

關(guān)于安全性,任何可以接觸到引導磁盤/CD 的人,只需要使用沒有設置安全性的 grub.conf 或 lilo.conf,就可以繞過本文中提及的所有安全措施。特別是使用 GRUB 時,因為能夠引導到單用戶模式,所以是一個嚴重的安全漏洞。解決此問題的一個簡單方法是在機器的 BIOS 中禁止通過 CD 和軟盤進行引導,并確保為 BIOS 設置了一個口令,使得其他人不能修改這些設置。

我們以Grub為例來講解。系統(tǒng)讀取內(nèi)存中的grub配置信息(一般為menu.lst或grub.lst),并依照此配置信息來啟動不同的操作系統(tǒng)。

3、加載內(nèi)核

當內(nèi)核映像被加載到內(nèi)存后,內(nèi)核階段就開始了。 內(nèi)核映像并不是一個可執(zhí)行的內(nèi)核,而是一個壓縮過的內(nèi)核映像。通常它是一個zImage(壓縮映像,小于512KB)或bzImage(較大的壓縮映像,大于512KB),它是提前使用zlib進行壓縮的。在這個內(nèi)核映像前面是一個例程,它實現(xiàn)少量硬件設置,并對內(nèi)核映像中包含的內(nèi)核進行解壓,然后將其放入高端內(nèi)存中,如果有初始RAM磁盤映像,就會將它移動到內(nèi)存中,并標明以后使用。然后此例程會調(diào)用內(nèi)核,并開始啟動內(nèi)核引導的過程。

在GRUB命令中,我們可以使用initrd映像引導一個特定的內(nèi)核,方法如下:

grub> kernel /bzImage-2.6.14.2

[Linux-bzImage, setup=0x1400, size=0x29672e]

grub>initrd /initrd-2.6.14.2.img

[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot

UncomprESSing Linux... Ok, booting the kernel.

根據(jù)grub設定的內(nèi)核映像所在路徑,系統(tǒng)讀取內(nèi)存映像,并進行解壓縮操作。此時,屏幕一般會輸出“Uncompressing Linux”的提示。當解壓縮內(nèi)核完成后,屏幕輸出“OK, booting the kernel”。 如果不知道要引導的內(nèi)核的名稱,只需使用/然后按下Tab鍵,就會顯示內(nèi)核和initrd映像列表。

系統(tǒng)將解壓后的內(nèi)核放置在內(nèi)存之中,并調(diào)用start_kernel()函數(shù)來啟動一系列的初始化函數(shù)并初始化各種設備,完成Linux核心環(huán)境的建立。至此,Linux內(nèi)核已經(jīng)建立起來了,基于Linux的程序應該可以正常運行了。

4、執(zhí)行init進程

init進程是所有進程的起點,內(nèi)核在完成內(nèi)核引導后,即在本線程(進程)空間內(nèi)加載init程序,它的進程號為1。init進程是所有進程的發(fā)起者和控制者。因為在任何基于Unix的系統(tǒng)(比如Linux)中,它都是第一個運行的進程,所以init進程的編號(Process ID,PID)永遠是1。如果init出現(xiàn)了問題,系統(tǒng)的其余部分也就隨之而垮掉了。

init進程有兩個作用:

● 扮演終結(jié)父進程的角色:所有的孤兒進程都會被init進程接管??焖賵?zhí)行一下ps -af 命令,可以列出許多父進程ID(Parent Process ID,PPID)為1的進程來。

● 進入某個特定的運行級別時運行相應的程序,以此對各種運行級別進行管理,這個作用由/etc/inittab文件定義的。 內(nèi)核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,并依據(jù)此文件來進行初始化工作。

5、通過/etc/inittab文件進行初始化

init進程的工作是根據(jù)/etc/inittab來執(zhí)行相應的腳本進行系統(tǒng)初始化,如設置鍵盤、字體,裝載模塊,設置網(wǎng)絡等。其最主要的作用就是設定Linux的運行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:

0:關(guān)機

1:單用戶模式

2:無網(wǎng)絡支持的多用戶模式

3:有網(wǎng)絡支持的多用戶模式

4:保留,未使用

5:有網(wǎng)絡支持有X-Window支持的多用戶模式

6:重新引導系統(tǒng),即重啟

對于RedHat來說,按以下順序執(zhí)行:

a、執(zhí)行/etc/rc.d/rc.sysinit(由init執(zhí)行的第一個腳本)

在設定了運行等級后,Linux系統(tǒng)執(zhí)行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它做的工作非常多,包括設定PATH、設定網(wǎng)絡配置(/etc/sysconfig/network)、啟動swap分區(qū)、設定/proc、把root文件系統(tǒng)輸入到mtab、使用系統(tǒng)為裝入模塊做準備、查找模塊的相關(guān)文件、檢查文件系統(tǒng),以進行必要的修復、加載所有其他文件系統(tǒng)、清除幾個/etc文件,如/etc/mtab、/etc/fastboot和/etc/nologin、刪除UUCP的lock文件、刪除過時的子系統(tǒng)文件、刪除過時的pid文件、設置系統(tǒng)時鐘、打開交換、初始化串行端口、裝入模塊等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件,里面的腳本夠你看幾天的。

b、執(zhí)行/etc/rc.d/rcX.d[KS]

首先終止K開頭的服務(用來關(guān)閉一個服務),然后啟動S開頭的服務(用來啟動一個服務);對每一個運行級別來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。這些運行級別的下級子目錄的命名方法上rcX.d, 其中X就是代表運行級別的數(shù)字。在各個運行級別的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令腳本程序的符號鏈接。鏈接的名稱在K與S后有一個數(shù)字,表示執(zhí)行順序,數(shù)字小的先執(zhí)行如K01tog-pegasus 、 S00microcode_ctl。對以K開頭的腳本執(zhí)行時系統(tǒng)會傳遞stop參數(shù),而S開頭的腳本系統(tǒng)會傳遞start參數(shù)。

c、執(zhí)行/etc/rc.d/rc.local

Redhat中運行模式2,3,5都把/etc/rc.d/rc.local作為初始化腳本中的最后一個文件,所以用戶可以自己在這個文件中添加一些需要在其他初始化工作之后,登陸之前執(zhí)行的命令。

你如果打開了此文件,里面有一句話,讀過之后,你就會對此命令的作用一目了然:

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

# You can put your own initialization stuff in here if you don’t want to do the full Sys V style. init stuff.

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

6、執(zhí)行/bin/login

login程序會提示使用者需輸入帳號與密碼,接著編碼并確認密碼的正確性,若二者相合,則為使用者進行初始化環(huán)境,并將控制權(quán)交給shell,即用戶登錄。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉