<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux啟動(dòng)過(guò)程剖析

Linux啟動(dòng)過(guò)程剖析

作者: 時(shí)間:2012-08-15 來(lái)源:網(wǎng)絡(luò ) 收藏

能幫助那些想深入學(xué)習用戶(hù)建立一個(gè)相關(guān)的清晰概念,進(jìn)而可以進(jìn)一步研究Linux接下來(lái)是如何工作的。

本文引用地址:http://dyxdggzs.com/article/148603.htm

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

下面分步來(lái)介紹下linux的啟動(dòng)過(guò)程:

1、BIOS自檢

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

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

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

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

提取MBR的信息

要看MBR的內容,請使用下面的命令

#從/dev/sda上讀取前512個(gè)字節的內容,并將其寫(xiě)入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

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

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

……

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

2、啟動(dòng)GRUB/LILO

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

Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見(jiàn)的Loader。

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

GRUB 與 LILO 的比較

所有引導加載程序都以類(lèi)似的方式工作,滿(mǎn)足共同的目的。不過(guò),LILO 和 GRUB 之間有很多不同之處:

● LILO 沒(méi)有交互式命令界面,而 GRUB 擁有。

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

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

安全提示:

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

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

3、加載內核

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

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

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.

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

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

4、執行init進(jìn)程

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

init進(jìn)程有兩個(gè)作用:

● 扮演終結父進(jìn)程的角色:所有的孤兒進(jìn)程都會(huì )被init進(jìn)程接管??焖賵绦幸幌聀s -af 命令,可以列出許多父進(jìn)程ID(Parent Process ID,PPID)為1的進(jìn)程來(lái)。

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

5、通過(guò)/etc/inittab文件進(jìn)行初始化

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

0:關(guān)機

1:?jiǎn)斡脩?hù)模式

2:無(wú)網(wǎng)絡(luò )支持的多用戶(hù)模式

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

4:保留,未使用

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

6:重新引導系統,即重啟

對于RedHat來(lái)說(shuō),按以下順序執行:

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

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

b、執行/etc/rc.d/rcX.d[KS]

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

c、執行/etc/rc.d/rc.local

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

你如果打開(kāi)了此文件,里面有一句話(huà),讀過(guò)之后,你就會(huì )對此命令的作用一目了然:

# 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留給用戶(hù)進(jìn)行個(gè)性化的地方。你可以把你想設置和啟動(dòng)的東西放到這里。

6、執行/bin/login

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

pid控制相關(guān)文章:pid控制原理


linux相關(guān)文章:linux教程




關(guān)鍵詞: 剖析 過(guò)程 啟動(dòng) Linux

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>