linux啟動流程3.doc_第1頁
linux啟動流程3.doc_第2頁
linux啟動流程3.doc_第3頁
linux啟動流程3.doc_第4頁
linux啟動流程3.doc_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

嵌入式Linux啟動流程分析(轉(zhuǎn))2010-11-30 14:451407人閱讀評論(0)收藏舉報linux嵌入式腳本actionlogin終端當(dāng)Bootloader將控制權(quán)交給內(nèi)核的引導(dǎo)程序時,第一個執(zhí)行的程序就是head.S,它完成了加載內(nèi)核的大部分工作;misc.c則提供加載內(nèi)核所需要的子程序,其中解壓內(nèi)核的子程序是head.S調(diào)用的重要程序,另外內(nèi)核的加載還須知道系統(tǒng)的硬件信息,該硬件信息在hardware.h中定義并被head.S所引用。本系統(tǒng)中內(nèi)核的啟動流程如圖1所示。本系統(tǒng)中,head.S首先配置S3C4510B的系統(tǒng)寄存器SYSCFG、初始化系統(tǒng)的Flash、SDRAM以及總線控制寄存器,將Flash和SDRAM的地址范圍分別設(shè)置為0x0-0x1fffff和0x1000000-0x1ffffff;根據(jù)本系統(tǒng)的功能特點,重新定義了中斷優(yōu)先級以及I/O口的配置;為了提高內(nèi)核的運行速度,將2M的內(nèi)核映像文件從Flash拷貝到SDRAM;通過操作一些系統(tǒng)寄存器,進行系統(tǒng)的存儲器重映射,將Flash和SDRAM的地址區(qū)間分別重映射為0x1000000-0x11fffff和0x0-0xffffff;然后初始化系統(tǒng)堆棧;接著調(diào)用misc.c中的函數(shù)decompress_kernel,對拷貝到SDRAM的內(nèi)核映像文件進行解壓縮;最后跳轉(zhuǎn)到執(zhí)行調(diào)用內(nèi)核函數(shù)call_kernel,調(diào)用call_kernel函數(shù)實際上是執(zhí)行main.c中的start_kernel函數(shù),該函數(shù)完成的功能包括處理器結(jié)構(gòu)的初始化、中斷的初始化、定時器的初始化、進程相關(guān)的初始化以及內(nèi)存初始化等初始化工作;最后內(nèi)核創(chuàng)建一個init線程,在該線程中調(diào)用init進程,完成系統(tǒng)的啟動當(dāng)用戶打開PC的電源,BIOS開機自檢,按BIOS中設(shè)置的啟動設(shè)備(通常是硬盤)啟動,接著啟動設(shè)備上安裝的引導(dǎo)程序lilo或grub開始引導(dǎo)Linux,Linux首先進行內(nèi)核的引導(dǎo),接下來執(zhí)行init程序,init程序調(diào)用了rc.sysinit和rc等程序,rc.sysinit和rc當(dāng)完成系統(tǒng)初始化和運行服務(wù)的任務(wù)后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統(tǒng),用戶登錄成功后進入了Shell,這樣就完成了從開機到登錄的整個啟動過程。-power on-BIOS-Lilo/Grub-Kernerl boot-init(rc.sysinit, rc)-mingetty(login)-Shell-下面就將逐一介紹其中幾個關(guān)鍵的部分:第一部分:內(nèi)核的引導(dǎo)(核內(nèi)引導(dǎo))Red Hat9.0可以使用lilo或grub等引導(dǎo)程序開始引導(dǎo)Linux系統(tǒng),當(dāng)引導(dǎo)程序成功完成引導(dǎo)任務(wù)后,Linux從它們手中接管了CPU的控制權(quán),然后CPU就開始執(zhí)行Linux的核心映象代碼,開始了Linux啟動過程。這里使用了幾個匯編程序來引導(dǎo)Linux,這一步泛及到Linux源代碼樹中的“arch/i386/boot”下的這幾個文件:bootsect.S、setup.S、video.S等。其中bootsect.S是生成引導(dǎo)扇區(qū)的匯編源碼,它完成加載動作后直接跳轉(zhuǎn)到setup.S的程序入口。setup.S的主要功能就是將系統(tǒng)參數(shù)(包括內(nèi)存、磁盤等,由BIOS返回)拷貝到特別內(nèi)存中,以便以后這些參數(shù)被保護模式下的代碼來讀取。此外,setup.S還將video.S中的代碼包含進來,檢測和設(shè)置顯示器和顯示模式。最后,setup.S將系統(tǒng)轉(zhuǎn)換到保護模式,并跳轉(zhuǎn)到 0x100000。那么0x100000這個內(nèi)存地址中存放的是什么代碼?而這些代碼又是從何而來的呢?0x100000這個內(nèi)存地址存放的是解壓后的內(nèi)核,因為Red Hat提供的內(nèi)核包含了眾多驅(qū)動和功能而顯得比較大,所以在內(nèi)核編譯中使用了“makebzImage”方式,從而生成壓縮過的內(nèi)核,在RedHat中內(nèi)核常常被命名為vmlinuz,在Linux的最初引導(dǎo)過程中,是通過arch/i386/boot/compressed/中的head.S利用misc.c中定義的decompress_kernel()函數(shù),將內(nèi)核vmlinuz解壓到0x100000的。當(dāng)CPU跳到0x100000時,將執(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)境已經(jīng)建立起來了。在start_kernel()的最后,通過調(diào)用init()函數(shù),系統(tǒng)創(chuàng)建第一個核心線程,啟動了init過程。而核心線程init()主要是來進行一些外設(shè)初始化的工作的,包括調(diào)用do_basic_setup()完成外設(shè)及其驅(qū)動程序的加載和初始化。并完成文件系統(tǒng)初始化和root文件系統(tǒng)的安裝。當(dāng)do_basic_setup()函數(shù)返回init(),init()又打開了/dev/console設(shè)備,重定向三個標(biāo)準(zhǔn)的輸入輸出文件stdin、stdout和stderr到控制臺,最后,搜索文件系統(tǒng)中的init程序(或者由init=命令行參數(shù)指定的程序),并使用 execve()系統(tǒng)調(diào)用加載執(zhí)行init程序。到此init()函數(shù)結(jié)束,內(nèi)核的引導(dǎo)部分也到此結(jié)束了,第二部分:運行initinit的進程號是1,從這一點就能看出,init進程是系統(tǒng)所有進程的起點,Linux在完成核內(nèi)引導(dǎo)以后,就開始運行init程序,。init程序需要讀取配置文件/etc/inittab。inittab是一個不可執(zhí)行的文本文件,它有若干行指令所組成。在Redhat系統(tǒng)中,inittab的內(nèi)容如下所示(以“#開始的中注釋為筆者增加的):# inittab This file describes how the INIT process should set up# the system in a certain run-level.# Author: Miquel van Smoorenburg, # Modified for RHS Linux by Marc Ewing and Donnie Barnes# Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#表示當(dāng)前缺省運行級別為5(initdefault);id:5:initdefault:#啟動時自動執(zhí)行/etc/rc.d/rc.sysinit腳本(sysinit)# System initialization.si:sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4#當(dāng)運行級別為5時,以5為參數(shù)運行/etc/rc.d/rc腳本,init將等待其返回(wait)l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6#在啟動過程中允許按CTRL-ALT-DELETE重啟系統(tǒng)# Trap CTRL-ALT-DELETEca:ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left. Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly.pf:powerfail:/sbin/shutdown -f -h +2 Power Failure; System Shutting Down# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c Power Restored; Shutdown Cancelled#在2、3、4、5級別上以ttyX為參數(shù)執(zhí)行/sbin/mingetty程序,打開ttyX終端用于用戶登錄,#如果進程退出則再次運行mingetty程序(respawn)# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6#在5級別上運行xdm程序,提供xdm圖形方式登錄界面,并在退出時重新執(zhí)行(respawn)# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon以上面的inittab文件為例,來說明一下inittab的格式。其中以#開始的行是注釋行,除了注釋行之外,每一行都有以下格式:id:runlevel:action:process對上面各項的詳細(xì)解釋如下:1. idid是指入口標(biāo)識符,它是一個字符串,對于getty或mingetty等其他login程序項,要求id與tty的編號相同,否則getty程序?qū)⒉荒苷9ぷ鳌?. runlevelrunlevel是init所處于的運行級別的標(biāo)識,一般使用06以及S或s。0、1、6運行級別被系統(tǒng)保留:其中0作為shutdown動作,1作為重啟至單用戶模式,6為重啟;S和s意義相同,表示單用戶模式,且無需inittab文件,因此也不在inittab中出現(xiàn),實際上,進入單用戶模式時,init直接在控制臺(/dev/console)上運行/sbin/sulogin。在一般的系統(tǒng)實現(xiàn)中,都使用了2、3、4、5幾個級別,在Redhat系統(tǒng)中,2表示無NFS支持的多用戶模式,3表示完全多用戶模式(也是最常用的級別),4保留給用戶自定義,5表示XDM圖形登錄方式。79級別也是可以使用的,傳統(tǒng)的Unix系統(tǒng)沒有定義這幾個級別。runlevel可以是并列的多個值,以匹配多個運行級別,對大多數(shù)action來說,僅當(dāng)runlevel與當(dāng)前運行級別匹配成功才會執(zhí)行。3. actionaction是描述其后的process的運行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:initdefault是一個特殊的action值,用于標(biāo)識缺省的啟動級別;當(dāng)init由核心激活以后,它將讀取inittab中的initdefault項,取得其中的runlevel,并作為當(dāng)前的運行級別。如果沒有inittab文件,或者其中沒有initdefault項,init將在控制臺上請求輸入runlevel。sysinit、boot、bootwait等action將在系統(tǒng)啟動時無條件運行,而忽略其中的runlevel。其余的action(不含initdefault)都與某個runlevel相關(guān)。各個action的定義在inittab的man手冊中有詳細(xì)的描述。4. processprocess為具體的執(zhí)行程序。程序后面可以帶參數(shù)。第三部分:系統(tǒng)初始化在init的配置文件中有這么一行:si:sysinit:/etc/rc.d/rc.sysinit它調(diào)用執(zhí)行了/etc/rc.d/rc.sysinit,而rc.sysinit是一個bash shell的腳本,它主要是完成一些系統(tǒng)初始化的工作,rc.sysinit是每一個運行級別都要首先運行的重要腳本。它主要完成的工作有:激活交換分區(qū),檢查磁盤,加載硬件模塊以及其它一些需要優(yōu)先執(zhí)行任務(wù)。rc.sysinit約有850多行,但是每個單一的功能還是比較簡單,而且?guī)в凶⑨?,建議有興趣的用戶可以自行閱讀自己機器上的該文件,以了解系統(tǒng)初始化所詳細(xì)情況。由于此文件較長,所以不在本文中列出來,也不做具體的介紹。當(dāng)rc.sysinit程序執(zhí)行完畢后,將返回init繼續(xù)下一步。第四部分:啟動對應(yīng)運行級別的守護進程在rc.sysinit執(zhí)行后,將返回init繼續(xù)其它的動作,通常接下來會執(zhí)行到/etc/rc.d/rc程序。以運行級別3為例,init將執(zhí)行配置文件inittab中的以下這行:l5:5:wait:/etc/rc.d/rc 5這一行表示以5為參數(shù)運行/etc/rc.d/rc,/etc/rc.d/rc是一個Shell腳本,它接受5作為參數(shù),去執(zhí)行/etc/rc.d/rc5.d/目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d/目錄中的這些啟動腳本實際上都是一些鏈接文件,而不是真正的rc啟動腳本,真正的rc啟動腳本實際上都是放在/etc/rc.d/init.d/目錄下。而這些rc啟動腳本有著類似的用法,它們一般能接受start、stop、restart、status等參數(shù)。/etc/rc.d/rc5.d/中的rc啟動腳本通常是K或S開頭的鏈接文件,對于以以S開頭的啟動腳本,將以start參數(shù)來運行。而如果發(fā)現(xiàn)存在相應(yīng)的腳本也存在K打頭的鏈接,而且已經(jīng)處于運行態(tài)了(以/var/lock/subsys/下的文件作為標(biāo)志),則將首先以stop為參數(shù)停止這些已經(jīng)啟動了的守護進程,然后再重新運行。這樣做是為了保證是當(dāng)init改變運行級別時,所有相關(guān)的守護進程都將重啟。至于在每個運行級中將運行哪些守護進程,用戶可以通過chkconfig或setup中的System Services來自行設(shè)定。常見的守護進程有:amd:自動安裝NFS守護進程apmd:高級電源管理守護進程arpwatch:記錄日志并構(gòu)建一個在LAN接口上看到的以太網(wǎng)地址和IP地址對數(shù)據(jù)庫autofs:自動安裝管理進程automount,與NFS相關(guān),依賴于NIScrond:Linux下的計劃任務(wù)的守護進程named:DNS服務(wù)器netfs:安裝NFS、Samba和NetWare網(wǎng)絡(luò)文件系統(tǒng)network:激活已配置網(wǎng)絡(luò)接口的腳本程序nfs:打開NFS服務(wù)portmap:RPC portmap管理器,它管理基于RPC服務(wù)的連接sendmail:郵件服務(wù)器sendmailsmb:Samba文件共享/打印服務(wù)syslog:一個讓系統(tǒng)引導(dǎo)時起動syslog和klogd系統(tǒng)日志守候進程的腳本xfs:X Window字型服務(wù)器,為本地和遠(yuǎn)程X服務(wù)器提供字型集Xinetd:支持多種網(wǎng)絡(luò)服務(wù)的核心守護進程,可以管理wuftp、sshd、telnet等服務(wù)這些守護進程也啟動完成了,rc程序也就執(zhí)行完了,然后又將返回init繼續(xù)下一步。第五部分:建立終端rc執(zhí)行完畢后,返回init。這時基本系統(tǒng)環(huán)境已經(jīng)設(shè)置好了,各種守護進程也已經(jīng)啟動了。init接下來會打開6個終端,以便用戶登錄系統(tǒng)。通過按Alt+Fn(n對應(yīng)1-6)可以在這6個終端中切換。在inittab中的以下6行就是定義了6個終端:1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6從上面可以看出在2、3、4、5的運行級別中都將以respawn方式運行mingetty程序,mingetty程序能打開終端、設(shè)置模式。同時它會顯示一個文本登錄界面,這個界面就是我們經(jīng)??吹降牡卿浗缑?,在這個登錄界面中會提示用戶輸入用戶名

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論