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