




全文預覽已結束
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
X86體系結構內(nèi)核啟動分析一、硬件檢測當機器加電后它首先執(zhí)行BIOS(基本輸入輸出系統(tǒng))中的代碼,BIOS首先執(zhí)行加電自檢程序(POST),當自檢通過程便完成了硬件的啟動。當自檢完成后 BIOS按照系統(tǒng)COMS中設置的啟動順序搜尋有效的啟動驅動器(這里我們以硬盤為例),并讀入系統(tǒng)引導扇區(qū),并將系統(tǒng)控制權交給引導程序。二、加載和執(zhí)行引導程序系統(tǒng)引導程序主要是把系統(tǒng)內(nèi)核裝載到內(nèi)存,啟動盤必須在第一個邏輯磁道上包含引導記錄。這512個字節(jié)的扇區(qū)又被稱作是引導扇區(qū),在系統(tǒng)完成加電自檢后, BIOS從啟動盤中將引導扇區(qū)讀入到內(nèi)存中。一旦引導記錄加載完畢,BIOS就交出系統(tǒng)的執(zhí)行控制權,跳轉到引導程序的頭部執(zhí)行。有關linux pc的引導程序lilo和grub,lilo和grub可以引導多個系統(tǒng),嵌入式系統(tǒng)上,最常見的bootloader是UBOOT,如果機器上要裝多系統(tǒng)的話一般都會用到它們,這一引導程序也儲存在引導扇區(qū)中或者存放在主引導記錄中(MBR),lilo和grub都許允用戶自己配置,它們在系統(tǒng)安裝時建立了關于系統(tǒng)內(nèi)核占用磁盤數(shù)據(jù)塊的位置對照表。比如,grub程序就非常強大。Gurb運行后,將初始化設置內(nèi)核運行所需的環(huán)境。然后加載內(nèi)核鏡像。grub磁盤引導全過程:stage1: grub讀取磁盤第一個512字節(jié)(硬盤的0道0面1扇區(qū),被稱為MBR(主引導記錄),也稱為bootsect)。MBR由一部分bootloader的引導代碼、分區(qū)表和魔數(shù)三部分組成。stage1_5: 識別各種不同的文件系統(tǒng)格式。這使得grub識別到文件系統(tǒng)。stage2: 加載系統(tǒng)引導菜單(/boot/grub/menu.lst或grub.lst 根據(jù)grub版本不同文件位置會有所不同),加載內(nèi)核vmlinuz和RAM磁盤initrd。有時候基本引導裝載程序(stage1)不能識別stage2所在的文件系統(tǒng)分區(qū),那么這時候就需要stage1.5來連接stage1和stage2了假設有如下grub配置代碼root (hd0,0)/grub分區(qū)kernel /vmlinuz2.6.35.1074.fc14.i686 ro root=/dev/ram0/linux分區(qū)initrd /initramfs2.6.35.1074.fc14.i686.img要搞清楚上面兩個root的關系,root (hd0,0)中的root是grub命令,它用來指定boot所在的分區(qū)作為grub的根目錄.而root=/dev/ram0是kernel的參數(shù),它告訴操作系統(tǒng)內(nèi)核加載完畢之后,真實的文件系統(tǒng)所在的設備.要注意grub的根目錄和文件系統(tǒng)的根目錄的區(qū)別。kernel命令用來指定內(nèi)核所在的位置,/代表(hd0,0),也就是grub的根目錄initrd命令用來指定初始化ram的img文件所在位置。三、內(nèi)核啟動內(nèi)核映像文件vmlinuz:包含有l(wèi)inux內(nèi)核的靜態(tài)鏈接的可執(zhí)行文件,傳統(tǒng)上,vmlinux被稱為可引導的內(nèi)核鏡像。vmlinuz是vmlinux的壓縮文件。其構成如下:(1)第一個512字節(jié)(以前是在arch/i386/boot/bootsect.S)(2)第二個,一段代碼,若干個不多于512字節(jié)的段(以前是在arch/i386/boot/setup.S)(3)保護模式下的內(nèi)核代碼(在arch/x86/boot/main.c)。bzImage文件:使用make bzImage命令編譯內(nèi)核源代碼,可以得到采用zlib算法壓縮的zImage文件,即bigzImage文件。老的zImage解壓縮內(nèi)核到低端內(nèi)存,bzImage則解壓縮內(nèi)核到高端內(nèi)存(1M(0x100000)以上),在保護模式下執(zhí)行。bzImage文件一般包含有vmlinuz、bootsect.o、setup.o、解壓縮程序misc.o、以及其他一些相關文件(如piggy.o)。注意,在Linux 2.6內(nèi)核中,bootsect.S和setup.S被整合為header.S。initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用于加載硬件驅動模塊,輔助內(nèi)核的啟動,掛載真正的根文件系統(tǒng)。裝載Linux內(nèi)核的第一步應該是加載實模式代碼(boot sector和setup代碼),grub就會把實模式代碼setup加載到0x07C00之上的某個地址上,其中setup的前512個字節(jié)是boot sector(引導扇區(qū)),現(xiàn)在這個引導扇區(qū)的作用并不是用來引導系統(tǒng),而是為了兼容及傳遞一些參數(shù)。之后grub跳轉到setup的入口點,入口點為_start例程(根據(jù)arch/x86/boot/setup.ld可知)。然后setup最后跳到arch/x86/boot/main.c再經(jīng)過一系列的跳轉,跳到start_kernel()函數(shù),這是Linux內(nèi)核的啟動函數(shù)。main.c文件是整個Linux內(nèi)核的中央聯(lián)結點。每種體系結構都會執(zhí)行一些底層設置函數(shù),然后執(zhí)行名為start_kernel的函數(shù)(在init/main.c中可以找到這個函數(shù))??梢哉J為main.c是內(nèi)核的“粘合劑(glue)”,之前執(zhí)行的代碼都是各種體系結構相關的代碼,一旦到達start_kernel(),就與體系結構無關了。start_kernel()會調(diào)用一系列初始化函數(shù)來設置中斷,執(zhí)行進一步的內(nèi)存配置,解析內(nèi)核命令行參數(shù)。然后調(diào)用fs/dcache.c:vfs_caches_init()-fs/namespace.c:mnt_init()創(chuàng)建基于內(nèi)存的rootfs文件系統(tǒng)(是一個虛擬的內(nèi)存文件系統(tǒng),稱為VFS),這是系統(tǒng)初始化時的根結點,即/結點,后面VFS會指向真實的文件系統(tǒng)。fs/namespace.c:mnt_init()會調(diào)用fs/ramfs/inode.c:init_rootfs()會調(diào)用fs/filesystems.c:register_filesystem()注冊rootfs。然后fs/namespace.c:init_mount_tree()調(diào)用fs/super.c:do_kern_mount()在內(nèi)核中掛載rootfs,調(diào)用fs/fs_struct.c:set_fs_root()將當前的rootfs文件系統(tǒng)配置為根文件系統(tǒng)。此時rootfs里只有根目錄。為什么不直接把真實的文件系統(tǒng)配置為根文件系統(tǒng)?答案很簡單,內(nèi)核中沒有真實根文件系統(tǒng)設備(如硬盤,USB)的驅動,而且即便你將根文件系統(tǒng)的設備驅動編譯到內(nèi)核中,此時它們還尚未加載,實際上所有內(nèi)核中的驅動是由后面的kernel_init線程進行加載。另外,我們的root設備都是以設備文件的方式指定的,如果沒有根文件系統(tǒng),設備文件怎么可能存在呢?start_kernel()在最后會調(diào)用rest_init(),這個函數(shù)會啟動一個內(nèi)核線程來運行kernel_init(),自己則調(diào)用cpu_idle()進入空閑循環(huán),讓調(diào)度器接管控制權。搶占式的調(diào)度器就可以周期性地接管控制權,從而提供多任務處理能力。kernel_init()用于完成初始化rootfs、加載內(nèi)核模塊、掛載真正的根文件系統(tǒng)。(因為已經(jīng)初始化了rootfs,而且還加載了內(nèi)核模塊,所以可以找到設備如硬盤、內(nèi)存,然后就可以把分區(qū)設置為根設備,并在根設備上掛載文件系統(tǒng))掛載完真正的根文件系統(tǒng)后,goto到out,將掛載點從當前目錄移到/,并把/作為系統(tǒng)的根目錄,至此虛擬文件系統(tǒng)切換到了實際的根文件系統(tǒng)。目前2.6的kernel支持三方式來掛載最終的根文件系統(tǒng):(1)所有需要的設備和文件系統(tǒng)驅動被編譯進內(nèi)核,沒有initrd。通過“root=參數(shù)指定的根設備,init/main.c:kernel_init()將調(diào)用prepare_namespace()直接在指定的根設備上掛載最終的根文件系統(tǒng)。通過可選的init=選項,還可以運行用戶指定的init程序。(2)一些設備和文件驅動作為模塊來構建并存放的initrd中。initrd被稱為ramdisk,是一個獨立的小型文件系統(tǒng)。它需要包含/linuxrc程序(或腳本),用于加載這些驅動模塊,并掛載最終的根文件系統(tǒng)(這個根文件系統(tǒng)在pc平臺存放在硬盤上,結合使用pivot_root系統(tǒng)調(diào)用),然后initrd被卸載。initrd由prepare_namespace()掛載和運行。內(nèi)核必須要使用CONFIG_BLK_DEV_RAM(支持ramdisk)和CONFIG_BLK_DEV_INITRD(支持initrd)選項進行編譯才能支持initrd。(方法1只掛載了一次文件系統(tǒng),而這個方法掛載了兩次)initrd文件通過在grub引導時用initrd命令指定。它有兩種格式,一種是類似于linux2.4內(nèi)核使用的傳統(tǒng)格式的文件系統(tǒng)鏡像,稱之為imageinitrd,它的制作方法同Linux2.4內(nèi)核的initrd一樣,其核心文件就是 /linuxrc。另外一種格式的initrd是cpio格式的,這種格式的initrd從linux 2.5起開始引入,使用cpio工具生成,其核心文件不再是/linuxrc,而是/init,這種 initrd稱為cpioinitrd。為了向后兼容,linux2.6內(nèi)核對cpioinitrd和imageinitrd這兩種格式的initrd 均支持,但對其處理流程有著顯著的區(qū)別。cpioinitrd的處理與initramfs類似,會直接跳過prepare_namespace(),imageinitrd的處理則由prepare_namespace()進行。(3)使用initramfs。prepare_namespace()調(diào)用會被跳過。這意味著必須有一個程序來完成這些工作。這個程序是通過修改usr/gen_init_cpio.c的方式,或通過新的initrd格式(一個cpio歸檔文件)存放在initramfs中的,它必須是/init。這個程序負責prepare_namespace()所做的所有工作。為了保持向后兼容,在現(xiàn)在的內(nèi)核中,/init程序只有是來自cpio歸檔的情況才會被運行。如果不是來自cpio歸檔,init/main.c:kernel_init()將運行prepare_namespace()來掛載最終的根文件系統(tǒng),并運行一個預先定義的init程序(或者是用戶通過init=指定的,或者是/sbin/init,/etc/init,/bin/init)。initramfs是從2.5 kernel開始引入的一種新的實現(xiàn)機制。顧名思義,initramfs只是一種RAM filesystem而不是disk。initramfs實際是一個包含在內(nèi)核映像內(nèi)部的cpio歸檔,啟動所需的用戶程序和驅動模塊被歸檔成一個文件。因此,不需要cache,也不需要文件系統(tǒng)。 編譯2.6版本的linux內(nèi)核時,編譯系統(tǒng)總會創(chuàng)建initramfs,然后通過連接腳本archx86kernelvmlinux.lds.S把它與編譯好的內(nèi)核連接成一個文件,它被鏈接到地址_initramfs_start_initramfs_end處。內(nèi)核源代碼樹中的usr目錄就是專門用于構建內(nèi)核中的initramfs的。缺省情況下,initramfs是空的,X86架構下的文件大小是134個字節(jié)。實際上它的含義就是:在內(nèi)核鏡像中附加一個cpio包,這個cpio包中包含了一個小型的文件系統(tǒng),當內(nèi)核啟動時,內(nèi)核將這個cpio包解開,并且將其中包含的文件系統(tǒng)釋放到rootfs中,內(nèi)核中的一部分初始化代碼會放到這個文件系統(tǒng)中,作為用戶層進程來執(zhí)行。這樣帶來的明顯的好處是精簡了內(nèi)核的初始化代碼,而且使得內(nèi)核的初始化過程更容易定制。注意initramfs和initrd都可以是cpio包,可以壓縮也可以不壓縮。但initramfs是包含在內(nèi)核映像中的,作為內(nèi)核的一部分存在,因此它不會由bootloader(如grub)單獨地加載,而initrd是另外單獨編譯生成的,是一個獨立的文件,會由bootloader單獨加載到RAM中內(nèi)核空間以外的地址處。目前initramfs只支持cpio包格式,它會被populate_rootfsunpack_to_rootfs(&_initramfs_start, &_initramfs_end &_initramfs_start, 0)函數(shù)解壓、解析并拷貝到根目錄。initramfs被解析處理后原始的cpio包(壓縮或非壓縮)所占的空間(&_initramfs_start &_initramfs_end)是作為系統(tǒng)的一部分直接保留在系統(tǒng)中,不會被釋放掉。而對于initrd鏡像文件,如果沒有在命令行中設置keepinitd命令,那么initrd鏡像文件被處理后其原始文件所占的空間(initrd_end initrd_start)將被釋放掉。四、啟動應用程序prepare_namspace執(zhí)行完后,真正的文件系統(tǒng)就掛載成功。轉入init_post(),它用來運行用戶空間的第一個進程,即眾所周知的init進程,在我的ubuntu下,init先讀/etc/init/下的配置文件,配置文件描述了運行級別、等,并通過從/etc/rcX.d目錄到/etc/init.d目錄的初始化腳本的鏈接來啟動與終止系統(tǒng)服務。執(zhí)行相關腳本,以完成系統(tǒng)初始化,如設置鍵盤、字體,裝載模塊,設置網(wǎng)絡等,最后運行登錄程序,出現(xiàn)登錄界面。運行用戶空間中的init進程可能是以下幾種情況:(1)noinitrd方式,則直接運行用戶空間中的/sbin/init(或/etc/init,/bin/init),作為第一個用戶進程。(2)傳統(tǒng)的imageinitrd方式。運行的第一個程序是/linuxrc腳本,由它來啟動用戶空間中的init進程。(3)cpioinitrd和initramfs方式。運行的第一個程序是/init腳本,由它來啟動用戶空間中的init進程??偟膩碚f,x86架構的Linux內(nèi)核啟動過程分為6大步,分別為:(1)實模式的入口函數(shù)_start():在header.S中,這里會進入眾所周知的main函數(shù),它拷貝bootloader的各個參數(shù),執(zhí)行基
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業(yè)標準租車協(xié)議范本
- 公司工作流程管理制度
- 公司環(huán)境體系管理制度
- 湖南省長沙麓山國際實驗學校2025屆高三下學期二模英語試卷(含答案無聽力音頻及聽力原文)
- 福建省龍巖市2024~2025學年 高二下冊第二次月考(3月)數(shù)學試卷附解析
- 2025年中考語文(長沙用)課件:主題4 尋訪家鄉(xiāng)文化講好家鄉(xiāng)故事綜合實踐活動
- 雨水用水量徑流控制計算書
- 2025屆安徽省宣城市寧國市中考二模數(shù)學試卷含答案
- 2024年南充市順慶區(qū)考調(diào)真題
- 西安工程大學招聘筆試真題2024
- GB/T 5288-2007龍門導軌磨床精度檢驗
- 檢驗科梅毒快速檢測室內(nèi)質(zhì)控記錄本
- GB/T 1094.2-2013電力變壓器第2部分:液浸式變壓器的溫升
- 2023年莊河市中醫(yī)醫(yī)院醫(yī)護人員招聘筆試題庫及答案解析
- 《社會保障概論》課程教學大綱(本科)
- 溫州市住宅小區(qū)(大廈)物業(yè)服務達標考核實施暫行辦法
- 《行政法與行政訴訟法》期末復習題及參考答案
- 北京市教育系統(tǒng)
- 《科學技術史》課程課件(完整版)
- 超星爾雅學習通《大學生創(chuàng)業(yè)基礎》章節(jié)測試含答案
- 第四節(jié)-酸堿平衡失常的診治課件
評論
0/150
提交評論