Linux系統(tǒng)引導(dǎo)流程 |
發(fā)布時間: 2012/9/11 12:59:48 |
Linux系統(tǒng)的引導(dǎo)過程主要分為三個階段。 第一階段:開機->POST->INT19->BIOS->MBR 當(dāng)用戶打開電腦的電源,電腦會對系統(tǒng)硬件配置進(jìn)行一系列檢測,這個過程稱為POST(Power on Self Test),即上電自檢過程。系統(tǒng)測試成功之后,接著將BIOS的中斷處理程序各個中斷向量裝配到內(nèi)存的低1024個字節(jié)單元。在這些中斷向量中,初始引導(dǎo)程序是以中斷類型為19H進(jìn)行裝配的。中斷向量結(jié)束后,CPU執(zhí)行類型為19H的中斷,其功能是執(zhí)行BIOS所帶的系統(tǒng)初始化程序,稱為磁盤自舉中斷或者重引導(dǎo)中斷(reboot interrupt),當(dāng)按下Ctrl+Alt+Del鍵,系統(tǒng)就會執(zhí)行19H號中斷,重新引導(dǎo)系統(tǒng)。CPU執(zhí)行19H號中斷的初始引導(dǎo)程序,以便從啟動盤讀取加載操作系統(tǒng)的引導(dǎo)程序Bootsect.S。該初始化引導(dǎo)程序按照CMOS里面設(shè)置的啟動盤啟動順序查找相應(yīng)盤的MBR,如果找到 引導(dǎo)程序,則將MBR中的引導(dǎo)程序讀到內(nèi)存0000:7C00處,并執(zhí)行這個引導(dǎo)程序?qū)?nèi)核代碼全部轉(zhuǎn)入內(nèi)存。 第二階段:MBR->LILO->活動分區(qū)引導(dǎo)Linux 初始引導(dǎo)程序?qū)BR中的LILO讀到內(nèi)存并執(zhí)行,由LILO把Linux的全部內(nèi)核裝入內(nèi)存。Linux除了可以使用LILO引導(dǎo)之外,還可以使用GRUB等引導(dǎo)程序引導(dǎo)。LILO的功能由三個主要程序來完成:第一個是把Linux內(nèi)核或者其他操作系統(tǒng)的可執(zhí)行代碼寫入內(nèi)存的引導(dǎo)程序,稱為啟動加載器;第二個負(fù)載把boot loader程序的可執(zhí)行代碼寫入引導(dǎo)分區(qū),并將原來的boot loader做備份,它的可執(zhí)行文是/sbin/lilo;第三個是存放LILO配置信息的/etc/lilo.conf等配置文件。這三個文件都是LILO啟動是所必須的。 當(dāng)引導(dǎo)程序成功完成引導(dǎo)任務(wù)后,Linux從他們手中接管了CPU的控制權(quán),然后CPU就開始執(zhí)行Linux的核心映像代碼,開始Linux的啟動過程。這里涉及到Linux源代碼樹中的“arch/i386/boot”下面的一些文件。其中bootsect.s是生成引導(dǎo)扇區(qū)的匯編源代碼,它完成加載動作后直接跳轉(zhuǎn)到setup.s的程序入口。setup.s的主要功能就是將系統(tǒng)參數(shù)(包括內(nèi)存、磁盤等,由BIOS返回的)拷貝到特別的內(nèi)存中,以便以后這些參數(shù)被保護(hù)模式下的代碼來讀取。setup.s還將video.s中的代碼包含進(jìn)來,檢測和設(shè)置顯示器和顯示模式。最后,setup.s將系統(tǒng)轉(zhuǎn)換到保護(hù)模式,并跳轉(zhuǎn)到0x100000。這個內(nèi)存地址存放的是解壓后的內(nèi)核,因為redhat提供的內(nèi)核包含了眾多驅(qū)動和功能而顯得比較大,所以在內(nèi)核編譯中使用了makebzImage方式,從而生成壓縮過的內(nèi)核,在redhat中內(nèi)核常常被命名為vmlinuz,在Linux的最初引導(dǎo)中,通過"arch/i386/boot/compress/"中的head.s利用misc.c中定義的decompress_kernel()函數(shù),將內(nèi)核vmlinuz解壓到0x100000的。 當(dāng)CPU跳到0x10000時,將執(zhí)行"arch/i386/kernel/head.s"中的startup_32,它也是vmlinux的入口,然后就跳轉(zhuǎn)到start_kernel()中去。start_kernel()是"init/main.c"中的定義函數(shù),start_kernel()中調(diào)用了一系列初始化函數(shù),以完成kernel本身的設(shè)置。start_kernel()函數(shù)中,做了大量的工作來建立基本的Linux核心環(huán)境。如果順利執(zhí)行完start_kernel(),則基本的Linux核心環(huán)境就建立起來了。 在start_kernel()的最后,通過調(diào)用init()函數(shù),系統(tǒng)創(chuàng)建第一個核心線程,啟動了init過程。而核心線程init()主要是進(jìn)行一些外設(shè)初始化工作,包括調(diào)用do_basic_setup()來完成外設(shè)及其驅(qū)動程序的加載和初始化。當(dāng)do_basic_setup()函數(shù)返回init(),init()函數(shù)又打開/dev/console設(shè)備,重定向三個標(biāo)準(zhǔn)的輸入輸出文件stdin,stdout,stderr到控制臺,最后,搜索文件系統(tǒng)中的init程序(或者由init=命令行參數(shù)指定的程序),并使用execve()系統(tǒng)調(diào)用加載init程序。到這里,init()函數(shù)結(jié)束,內(nèi)核的引導(dǎo)部分也基本結(jié)束了。 接下來運行init,init的進(jìn)程號是1,它是系統(tǒng)所有進(jìn)程的起點,Linux在完成內(nèi)核引導(dǎo)以后,就開始運行init程序。init程序需要讀取配置文件/etc/inittab中設(shè)置的系統(tǒng)運行級別,inittab是一個不可執(zhí)行的文本文件,它由若干行指令組成。然后調(diào)用執(zhí)行/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash shell的腳本,它主要是進(jìn)行一些系統(tǒng)初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本。它要完成的工作有:激活交換分區(qū),檢查磁盤,加載硬件模塊以及其他一些需要優(yōu)先執(zhí)行任務(wù)。當(dāng)rc.sysinit程序執(zhí)行完畢后,將返回init,啟動對應(yīng)運行級別的守護(hù)進(jìn)程,通常接下來會執(zhí)行到"/etc/rc.d/rc"程序。至于在每個運行級別中將運行那些守護(hù)進(jìn)程,可以通過chkconfig或setup中的System Service來自行設(shè)定。rc程序執(zhí)行完將返回init,建立終端。這時進(jìn)步系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,各種守護(hù)進(jìn)程也已經(jīng)啟動了。 第三階段:檢測硬件->啟動服務(wù)->LOGIN登陸 上面的工作完成后,Linux系統(tǒng)開始檢測硬件,啟動相應(yīng)的服務(wù),然后進(jìn)行系統(tǒng)登陸。對于文本方式登陸,Linux先用賬號驗證程序login對用戶名進(jìn)行分析,在分析完用戶名之后,login將搜索/etc/passwd以及/etc/shadow來驗證密碼以及設(shè)置賬號的其他信息,比如主目錄是什么,使用何種shell。如果沒有指定主目錄,將默認(rèn)為根目錄,如果沒有指定shell,將默認(rèn)為/bin/bash。login程序成功之后,會向?qū)?yīng)的終端輸出最近一次登陸的信息(在/var/log/lastlog中有記錄),并檢查用戶是否有新郵件。然后開始設(shè)置各種環(huán)境變量。各種環(huán)境變量設(shè)置好之后,出現(xiàn)shell命令行提示符,到此整個Linux啟動過程全部結(jié)束。
本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |