射精一区欧美专区|国产精品66xx|亚洲视频一区导航|日韩欧美人妻精品中文|超碰婷婷xxnx|日韩无码综合激情|特级黄片一区二区|四虎日韩成人A√|久久精品内谢片|亚洲成a人无码电影

您現(xiàn)在的位置:首頁 > IT認(rèn)證 > Linux認(rèn)證 >

Linux開機(jī)啟動過程分析


開機(jī)過程指的是從打開計(jì)算機(jī)電源直到LINUX顯示用戶登錄畫面的全過程。分析LINUX開機(jī)過程也是深入了解LINUX核心工作原理的一個(gè)很好的途徑。

    啟動第一步--加載BIOS

    當(dāng)你打開計(jì)算機(jī)電源,計(jì)算機(jī)會首先加載BIOS信息,BIOS信息是如此的重要,以至于計(jì)算機(jī)必須在最開始就找到它。這是因?yàn)锽IOS中包含了CPU的相關(guān)信息、設(shè)備啟動順序信息、硬盤信息、內(nèi)存信息、時(shí)鐘信息、PnP特性等等。在此之后,計(jì)算機(jī)心里就有譜了,知道應(yīng)該去讀取哪個(gè)硬件設(shè)備了。在BIOS將系統(tǒng)的控制權(quán)交給硬盤第一個(gè)扇區(qū)之后,就開始由Linux來控制系統(tǒng)了。

    啟動第二步--讀取MBR

    硬盤上第0磁道第一個(gè)扇區(qū)被稱為MBR,也就是Master Boot Record,即主引導(dǎo)記錄,它的大小是512字節(jié),可里面卻存放了預(yù)啟動信息、分區(qū)表信息。可分為兩部分:第一部分為引導(dǎo)(PRE-BOOT)區(qū),占了446個(gè)字節(jié);第二部分為分區(qū)表(PARTITION PABLE),共有66個(gè)字節(jié),記錄硬盤的分區(qū)信息。預(yù)引導(dǎo)區(qū)的作用之一是找到標(biāo)記為活動(ACTIVE)的分區(qū),并將活動分區(qū)的引導(dǎo)區(qū)讀入內(nèi)存。

    系統(tǒng)找到BIOS所指定的硬盤的MBR后,就會將其復(fù)制到0×7c00地址所在的物理內(nèi)存中。其實(shí)被復(fù)制到物理內(nèi)存的內(nèi)容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。

    啟動第三步--Boot Loader

    Boot Loader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核做好一切準(zhǔn)備。通常,BootL oade:是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的,不同體系結(jié)構(gòu)的系統(tǒng)存在著不同的Boot Loader。

    Linux的引導(dǎo)扇區(qū)內(nèi)容是采用匯編語言編寫的程序,其源代碼在arch/i386/boot中(不同體系的CPU有其各自的boot目錄),有4個(gè)程序文件:

    ◎bootsect.S,引導(dǎo)扇區(qū)的主程序,匯編后的代碼不超過512字節(jié),即一個(gè)扇區(qū)的 大 小

    ◎setup.S, 引導(dǎo)輔助程序

    ◎edd.S,輔助程序的一部分,用于支持BIOS增強(qiáng)磁盤設(shè)備服務(wù)

    ◎video.S,輔助程序的另一部分,用于引導(dǎo)時(shí)的屏幕顯示

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

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

    啟動第四步--加載內(nèi)核

    根據(jù)grub設(shè)定的內(nèi)核映像所在路徑,系統(tǒng)讀取內(nèi)存映像,并進(jìn)行解壓縮操作。此時(shí),屏幕一般會輸出“Uncompressing Linux”的提示。當(dāng)解壓縮內(nèi)核完成后,屏幕輸出“OK, booting the kernel”。

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

    start_kenrel()定義在init/main.c中,它就類似于一般可執(zhí)行程序中的main()函數(shù),系統(tǒng)在此之前所做的僅僅是一些能讓內(nèi)核程序最低限度執(zhí)行的初始化操作,真正的內(nèi)核初始化過程是從這里才開始。函數(shù)start_kerenl()將會調(diào)用一系列的初始化函數(shù),用來完成內(nèi)核本身的各方面設(shè)置,目的是最終建立起基本完整的Linux核心環(huán)境。

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

    (1) 在屏幕上打印出當(dāng)前的內(nèi)核版本信息。

    (2) 執(zhí)行setup_arch(),對系統(tǒng)結(jié)構(gòu)進(jìn)行設(shè)置。

    (3)執(zhí)行sched_init(),對系統(tǒng)的調(diào)度機(jī)制進(jìn)行初始化。先是對每個(gè)可用CPU上的runqueque進(jìn)行初始化;然后初始化0號進(jìn)程(其task struct和系統(tǒng)空M堆棧在startup_32()中己經(jīng)被分配)為系統(tǒng)idle進(jìn)程,即系統(tǒng)空閑時(shí)占據(jù)CPU的進(jìn)程。

    (4)執(zhí)行parse_early_param()和parsees_args()解析系統(tǒng)啟動參數(shù)。

    (5)執(zhí)行trap_in itQ,先設(shè)置了系統(tǒng)中斷向量表。0-19號的陷阱門用于CPU異常處理;然后初始化系統(tǒng)調(diào)用向量;最后調(diào)用cpu_init()完善對CPU的初始化,用于支持進(jìn)程調(diào)度機(jī)制,包括設(shè)定標(biāo)志位寄存器、任務(wù)寄存器、初始化程序調(diào)試相關(guān)寄存器等等。

    (6)執(zhí)行rcu_init(),初始化系統(tǒng)中的Read-Copy Update互斥機(jī)制。

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

    (8)執(zhí)行init_timers(), softirq_init()和time_init()函數(shù),分別初始系統(tǒng)的定時(shí)器機(jī)制,軟中斷機(jī)制以及系統(tǒng)日期和時(shí)間。

    (9)執(zhí)行mem_init()函數(shù),初始化物理內(nèi)存頁面的page數(shù)據(jù)結(jié)構(gòu)描述符,完成對物理內(nèi)存管理機(jī)制的創(chuàng)建。

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

    (11)執(zhí)行fork_init(),計(jì)算出當(dāng)前系統(tǒng)的物理內(nèi)存容量能夠允許創(chuàng)建的進(jìn)程(線程)數(shù)量。

    (12)執(zhí)行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(), signals_init()等函數(shù)對各種管理機(jī)制建立起專用的slab緩沖區(qū)隊(duì)列。

    (13 )執(zhí)行proc_root_init()Wl數(shù),對虛擬文件系統(tǒng)/proc進(jìn)行初始化。

    在 start_kenrel()的結(jié)尾,內(nèi)核通過kenrel_thread()創(chuàng)建出第一個(gè)系統(tǒng)內(nèi)核線程(即1號進(jìn)程),該線程執(zhí)行的是內(nèi)核中的init()函數(shù),負(fù)責(zé)的是下一階段的啟動任務(wù)。最后調(diào)用cpues_idle()函數(shù):進(jìn)入了系統(tǒng)主循環(huán)體口默認(rèn)將一直執(zhí)行default_idle()函數(shù)中的指令,即CPU的halt指令,直到就緒隊(duì)列中存在其他進(jìn)程需要被調(diào)度時(shí)才會轉(zhuǎn)向執(zhí)行其他函數(shù)。此時(shí),系統(tǒng)中唯一存在就緒狀態(tài)的進(jìn)程就是由kerne_hread()創(chuàng)建的init進(jìn)程(內(nèi)核線程),所以內(nèi)核并不進(jìn)入default_idle()函數(shù),而是轉(zhuǎn)向init()函數(shù)繼續(xù)啟動過程。

    啟動第五步--用戶層init依據(jù)inittab文件來設(shè)定運(yùn)行等級

    內(nèi)核被加載后,第一個(gè)運(yùn)行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,并依據(jù)此文件來進(jìn)行初始化工作。

    其實(shí)/etc/inittab文件最主要的作用就是設(shè)定Linux的運(yùn)行等級,其設(shè)定形式是“:id:5:initdefault:”,這就表明Linux需要運(yùn)行在等級5上。Linux的運(yùn)行等級設(shè)定如下:

    0:關(guān)機(jī)

    1:單用戶模式

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

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

    4:保留,未使用

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

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

    啟動第六步--init進(jìn)程執(zhí)行rc.sysinit

    在設(shè)定了運(yùn)行等級后,Linux系統(tǒng)執(zhí)行的第一個(gè)用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它做的工作非常多,包括設(shè)定PATH、設(shè)定網(wǎng)絡(luò)配置(/etc/sysconfig/network)、啟動swap分區(qū)、設(shè)定/proc等等。如果你有興趣,可以到/etc/rc.d中查看一下rc.sysinit文件。

    線程init的最終完成狀態(tài)是能夠使得一般的用戶程序可以正常地被執(zhí)行,從而真正完成可供應(yīng)用程序運(yùn)行的系統(tǒng)環(huán)境。它主要進(jìn)行的操作有:

    (1) 執(zhí)行函數(shù)do_basic_setup(),它會對外部設(shè)備進(jìn)行全面地初始化。

    (2) 構(gòu)建系統(tǒng)的虛擬文件系統(tǒng)目錄樹,掛接系統(tǒng)中作為根目錄的設(shè)備(其具體的文 件系統(tǒng)已經(jīng)在上一步驟中注冊)。

    (3) 打開設(shè)備/dev/console,并通過函數(shù)sys_dup()打開的連接復(fù)制兩次,使得文件號0,1 ,2 全部指向控制臺。這三個(gè)文件連接就是通常所說的“標(biāo)準(zhǔn)輸入”stdin,“標(biāo)準(zhǔn)輸出”stdout和“標(biāo)準(zhǔn)出錯(cuò)信息”stderr這三個(gè)標(biāo)準(zhǔn)I/O通道。

    (4) 準(zhǔn)備好以上一切之后,系統(tǒng)開始進(jìn)入用戶層的初始化階段。內(nèi)核通過系統(tǒng)調(diào)用execve()加載執(zhí)T子相應(yīng)的用戶層初始化程序,依次嘗試加載程序"/sbin/initl"," /etc/init"," /bin/init',和“/bin/sh。只要其中有一個(gè)程序加載獲得成功,那么系統(tǒng)就將開始用戶層的初始化,而不會再回到init()函數(shù)段中。至此,init()函數(shù)結(jié)束,Linux內(nèi)核的引導(dǎo) 部分也到此結(jié)束。

    啟動第七步--啟動內(nèi)核模塊

    具體是依據(jù)/etc/nf文件或/etc/modules.d目錄下的文件來裝載內(nèi)核模塊。

    啟動第八步--執(zhí)行不同運(yùn)行級別的腳本程序

    根據(jù)運(yùn)行級別的不同,系統(tǒng)會運(yùn)行rc0.d到rc6.d中的相應(yīng)的腳本程序,來完成相應(yīng)的初始化工作和啟動相應(yīng)的服務(wù)。

    啟動第九步--執(zhí)行/etc/rc.d/rc.local

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

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

    啟動第十步--執(zhí)行/bin/login程序,進(jìn)入登錄狀態(tài)

    此時(shí),系統(tǒng)已經(jīng)進(jìn)入到了等待用戶輸入username和password的時(shí)候了,你已經(jīng)可以用自己的帳號登入系統(tǒng)了。

    /bbsoft2002/blog/item/fa9bde820d710ca90df4d2e6.html

    1: 啟動電源后,主機(jī)第一步先做的就是查詢BIOS(全稱:basic input/output system 基本輸入輸出系統(tǒng))信息。了解整個(gè)系統(tǒng)的硬件狀態(tài),如CPU,內(nèi)存,顯卡,網(wǎng)卡等。嗯,這一步windows算和它是一家。不分彼此。

    2: 接下來,就是主機(jī)讀取MBR(硬盤的第一個(gè)扇區(qū))里的boot loader了。這個(gè)可是重點(diǎn)哦,據(jù)說troubleshooting里就會考這點(diǎn),給個(gè)壞了的loader,叫你修正。windows不支持linux的分區(qū)格式。所以,用windows的boot。ini是查不到linux的系統(tǒng)的。一般我裝系統(tǒng)都是先裝 windows再裝linux,然后用grub來做boot loader。兩個(gè)字:省心!因?yàn)閘inux不像windows那么小氣。grub可是支持windows分區(qū)格式的哦。

    3: 接上一步,主機(jī)讀取boot loader后,會讀取里面的信息,知道誰跟誰是待在哪,假如主機(jī)想進(jìn)入linux系統(tǒng),讀取到linux核心是在/boot文件目錄中后,將此核心加載到內(nèi)存中。開始了接下來的分析啟動之旅。

    4: OK,第一個(gè)運(yùn)行程序是誰?就是/sbin/init程序。不信,就用top程序看下,是不是PID為1的就是這個(gè)東東,它,可是萬物之祖啊,我簡稱它是女媧娘娘(不喜歡亞當(dāng)夏娃)。

    · 5: init首先查找啟動等級(run-level)。因?yàn)閱拥燃壊煌,其運(yùn)行腳本(也就是服務(wù))會不同。默認(rèn)的等級有以下幾項(xiàng):

    0 - halt (系統(tǒng)直接關(guān)機(jī))

    1 - single user mode (單人模式,用于系統(tǒng)維護(hù)時(shí)使用)

    2 - Multi-user, without NFS (類似3模式,不過少了NFS服務(wù))

    3 - Full multi-user mode (完整模式,不過,是文本模式)

    4 - unused (系統(tǒng)保留功能)

    5 - X11 (與3模式類似,不過,是X終端顯示)

    6 - reboot (重新開機(jī))

    (不要選擇0或4,6 否則,進(jìn)步了系統(tǒng)的)

    · 6: OK。系統(tǒng)知道自己的啟動等級后,接下來,不是去啟動服務(wù),而是,先設(shè)置好主機(jī)運(yùn)行環(huán)境。讀取的文件是/etc/rc。d/rc。sysinit文件。那究竟要設(shè)置哪些環(huán)境呢?

    · 設(shè)置網(wǎng)絡(luò)環(huán)境/etc/sysconfig/network,如主機(jī)名,網(wǎng)關(guān),IP,DNS等。

    · 掛載/proc。此文件是個(gè)特殊文件,大小為0,因?yàn)樗窃趦?nèi)存當(dāng)中。里面東東最好別刪。

    · 根據(jù)內(nèi)核在開機(jī)時(shí)的結(jié)果/proc/sys/kernel/modprobe。開始進(jìn)行周邊設(shè)備的偵測。

    · 載入用戶自定義的模塊/etc/sysconfig/modules/*。modules

    · 讀取/etc/sysctl。conf文件對內(nèi)核進(jìn)行設(shè)定。

    · 設(shè)定時(shí)間,終端字體,硬盤LVM或RAID功能,以fsck進(jìn)行磁盤檢測。

    · 將開機(jī)狀況記錄到/var/log/dmesg中。(可以用命令dmesg查看結(jié)果)

    · 7: OK,接下來,就是啟動系統(tǒng)服務(wù)了,不同的run-level會有不同的服務(wù)啟動。到/etc/rc。d目錄中,不同的level會有不同的目錄。如啟動 3模式,會有個(gè)rc3。d目錄,里面就保存著服務(wù)。其中,S(start)開頭的表明開機(jī)啟動,K(kill)開頭的表明開機(jī)不啟動。數(shù)字表示啟動順序。數(shù)字越小,啟動越早。

    注意,他們都是連接到etc/rc。d/init。d/目錄中的相關(guān)文件。所以,想手工啟動某一服務(wù),可以用"/etc/rc。d/init。 d/某個(gè)服務(wù) start"啟動哦。相反,我們也可以把某個(gè)服務(wù)ln(鏈接命令)到不同run-level的目錄中。記得打上S或者K+數(shù)字哦。

    · 8: 讀取服務(wù)后,主機(jī)會讀取/etc/rc。d/rc。local文件。所以,如果需要什么開機(jī)啟動的話,可以寫個(gè)腳本或命令到這里面來。就不用像上面那么麻煩。以后刪除也方便。

    OK,經(jīng)過一番長途跋涉后,系統(tǒng)終于可以安心的開啟shell了。

相關(guān)文章

無相關(guān)信息
更新時(shí)間2022-09-16 10:03:36【至頂部↑】
聯(lián)系我們 | 郵件: | 客服熱線電話:4008816886(QQ同號) | 

付款方式留言簿投訴中心網(wǎng)站糾錯(cuò)二維碼手機(jī)版

電話:
付款方式   |   給我留言   |   我要糾錯(cuò)   |   聯(lián)系我們