Linux系统的启动课件_第1页
Linux系统的启动课件_第2页
Linux系统的启动课件_第3页
Linux系统的启动课件_第4页
Linux系统的启动课件_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux系統的啟動

2.1操作系統的啟動

一般來說,操作系統的引導過程分兩個步驟。首先,電腦硬體經過開機自檢(PowerOnSelf-Test,POST)之後,從軟碟或硬碟的固定位置裝載一小段代碼,這段代碼一般稱為“引導裝載器”。然後,由引導裝載器負責裝入並運行操作系統。引導裝載器非常小,一般只有幾百個位元組,而操作系統龐大而複雜。上述分成兩階段的引導過程,可將電腦中的固化軟體保持得足夠小,同時也便於實現對不同操作系統的引導。2.1.1系統引導過程簡介

系統啟動過程主要由以下幾個步驟組成(以硬碟啟動為例):(1)開機(2)BIOS加電自檢(PowerOnSelfTest,POST),記憶體地址為0ffff:0000(3)將硬碟第一個扇區(0頭0道1扇區,也就是BootSector)讀入記憶體地址0000:7c00處。(4)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則轉去嘗試其他啟動介質,如果沒有其他啟動介質則顯示"NoROMBASIC"然後死機。(5)跳轉到0000:7c00處執行MBR中的程式。(6)MBR首先將自己複製到0000:0600處,然後繼續執行。(7)在主分區表中搜索標誌為活動的分區。如果發現沒有活動分區或有不止一個活動分區,則停止。(8)將活動分區的第一個扇區讀入記憶體地址0000:7c00處。(9)檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示"MissingOperatingSystem"然後停止,或嘗試軟碟啟動。(10)跳轉到0000:7c00處繼續執行特定系統的啟動程式。(11)啟動系統。以上步驟中2,3,4,5步是由BIOS的引導程式完成。6,7,8,9,10步由MBR中的引導程式完成。一般多系統引導程式(如SmartBootManager、BootStar、PQBoot

等)都是將標準主引導記錄替換成自己的引導程式,在運行系統啟動程式之前讓用戶選擇要啟動的分區。而某些系統自帶的多系統引導程式(如LILO,NTLoader等)則可以將自己的引導程式放在系統所處分區的第一個扇區中,在Linux中即為是兩個扇區的SuperBlock。注:以上各步驟中使用的是標準MBR,其他多系統引導程式的引導過程與此不同。2.1.2硬碟結構

1.硬碟參數當硬碟的容量還非常小的時候,人們採用與軟碟類似的結構生產硬碟。硬碟盤片的每一條磁軌都具有相同的扇區數。由此產生了所謂的3D參數(DiskGeometry)以及相應的尋址方式。到目前為止,通常還是沿用這種CHS(Cylinder/Head/Sector)來表示硬碟參數。其中:磁頭數(Heads)表示硬碟總共有幾個磁頭,也就是有幾面盤片,最大為256(用8個二進位位存儲);柱面數(Cylinders)表示硬碟每一面盤片上有幾條磁軌,最大為1024(用10個二進位位存儲);扇區數(Sectorspertrack)表示每一條磁軌上有幾個扇區,最大為63(用6個二進位位存儲)。每個扇區一般是512個位元組。2.基本INT13H調用簡介

BIOSint13H調用是BIOS提供的磁片基本輸入輸出中斷調用,它可以完成磁片(包括硬碟和軟碟)的複位、讀寫、校驗、定位、診斷和格式化等功能。它使用的是CHS尋址方式,因此最大只能訪問8GB左右的硬碟(本文中如不作特殊說明,均以1M=1048576位元組為單位)。3.現代硬碟結構簡介在老式硬碟中,由於每個磁軌的扇區數相等,所以外道的記錄密度要遠低於內道,因此會浪費很多磁片空間。為了進一步提高硬碟容量,人們改用等密度結構生產硬碟。也就是說,外圈磁軌的扇區比內圈磁軌多。採用這種結構後,硬碟不再具有實際的3D參數,尋址方式也改為線性尋址,即以扇區為單位進行尋址。為了與使用3D尋址的老軟體相容(如使用BIOSINT13H介面的軟體),在硬碟控制器內部安裝了一個地址翻譯器,由它負責將老式3D參數翻譯成新的線性參數。不同的工作模式(如LBA、LARGE、NORMAL)對應不同的3D參數。4.擴展INT13H

雖然現代硬碟都已經採用了線性尋址,但是由於基本INT13H的制約,使用BIOS的INT13H介面的程式(如DOS等)還只能訪問8G以內的硬碟空間。為了打破這一限制,Microsoft等幾家公司制定了擴展INT13H標準(ExtendedINT13H),採用線性尋址方式存取硬碟,突破了8G的限制,並還加入了對可拆卸介質(如活動硬碟)的支持。2.1.3引導扇區

1.BootSector的組成

BootSector也就是硬碟的第一個扇區,它由MBR(MasterBootRecord),DPT(DiskPartitionTable)和BootRecordID三部分組成。MBR又稱作主引導記錄,佔用BootSector的前446個位元組(0to0x1BD),存放系統主引導程式(它負責從活動分區中裝載並運行系統引導程式)。DPT即主分區表佔用64個位元組(0x1BEto0x1FD),記錄了磁片的基本分區資訊。主分區表分為四個分區項,每項16位元組,分別記錄了每個主分區的資訊(因此最多可以有四個主分區)。BootRecordID即引導區標記佔用兩個位元組(0x1FEand0x1FF),對於合法引導區,它等於0xAA55,這是判別引導區是否合法的標誌。BootSector的具體結構如下圖所示:2.分區表結構簡介分區表由四個分區項構成,每一項的結構如下:BYTEState:分區狀態,0=未啟動,0x80=啟動(注意此項)BYTEStartHead:分區起始磁頭號WORDStartSC:分區起始扇區和柱面號,底位元組的低6位為扇區號,高2位為柱面號的第9,10位,高位元組為柱面號的低8位BYTEType:分區類型,如0x0B=FAT32,0x83=Linux等,00表示此項未用BYTEEndHead:分區結束磁頭號WORDEndSC:分區結束扇區和柱面號,定義同前DWORDRelative:線上性尋址方式下的分區相對扇區地址(對於基本分區即為絕對地址)DWORDSectors:分區大小(總扇區數)

在DOS/Windows系統下,基本分區必須以柱面為單位劃分(Sectors*Heads個扇區),如對於CHS為764/256/63的硬碟,分區的最小尺寸為256*63*512/1048576=7.875MB。由於硬碟的第一個扇區已經被引導扇區佔用,所以一般來說,硬碟第一個磁軌(0頭0道)的其餘62個扇區是不會被分區佔用的。某些分區軟體甚至將第一個柱面全部空出來。3.擴展分區由於主分區表中只能分四個分區,無法滿足需求,因此設計了一種擴展分區格式。基本上說,擴展分區的資訊是以鏈表形式存放的,但也有一些特別的地方。

首先,主分區表中要有一個基本擴展分區項,所有擴展分區都隸屬於它,也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中。對於DOS/Windows來說,擴展分區的類型為0x05或0x0F(LBA模式)。除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放,後一個擴展分區的資料項目記錄在前一個擴展分區的分區表中,但兩個擴展分區的空間並不重疊。

擴展分區類似於一個完整的硬碟,必須進一步分區才能使用。但每個擴展分區中只能存在一個其他分區。此分區在DOS/Windows環境中即為邏輯盤。因此每一個擴展分區的分區表(同樣存儲在擴展分區的第一個扇區中)中最多只能有兩個分區資料項目(包括下一個擴展分區的資料項目)。以上所有擴展分區表中的第二個分區項(指向下一個擴展分區)的相對扇區地址均相對於主擴展分區,而不是前一個擴展分區。

2.2Linux的引導過程

不同電腦平臺引導過程的區別主要在於第一階段的引導過程。對PC機上的Linux系統而言,電腦(即BIOS)負責從軟碟或硬碟的第一個扇區(即引導扇區)中讀取引導裝載器,然後,由引導裝載器從磁片或其他位置裝入操作系統。從軟碟引導時,BIOS讀取並運行引導扇區中的代碼。引導扇區中的代碼讀取軟碟前幾百個塊(依賴於實際的內核大小),然後將這些代碼放置在預先定義好的記憶體位置。利用軟碟引導Linux時,沒有檔系統,內核處於連續的扇區中,這樣安排可簡化引導過程。但是,如果利用LILO(LInux

LOader)也可從包含檔系統的軟碟上引導Linux。

從硬碟引導時,由於硬碟是可分區的,因此引導過程比軟碟複雜一些。BIOS首先讀取並運行硬碟主引導記錄中的代碼,這些代碼首先檢驗主引導記錄中的分區表,尋找到活動分區(即標誌為可引導分區的分區),然後讀取並運行活動分區之引導扇區中的代碼。活動分區引導扇區的作用和軟碟引導扇區的作用一樣:從分區中讀取內核映象並啟動內核。和軟碟引導不同的是,內核映象保存在硬碟分區檔系統中,而不象軟碟那樣保存在後續的連續扇區中,因此,硬碟引導扇區中的代碼還需要定位內核映象在檔系統中的位置,然後裝載內核並啟動內核。Linux系統的常見引導方式有兩種:LILO引導和Loadin引導;其中LILO可實現多重引導,Loadin可在DOS下引導Linux。此外,Linux內核也自帶了一個bootsect-loader。由於bootsect-loader只能實現Linux的引導,不像前兩個那樣具有很大的靈活性,所以在普通應用場合實際上很少使用。但由於bootsect-loader短小、沒有多餘的代碼、並且是內核源碼的有機組成部分。下麵將主要對bootsect-loader檔進行分析。bootsect-loader在內和源碼中對應的程式是/arch/i386/boot/bootsect.s。幾個相關檔是:(1)/arch/i386/boot/bootsect.s(2)/include/linux/config.h(3)/include/asm/boot.h(4)/include/linux/autoconf.h2.2.1Linux系統引導過程分析

開啟Intelx86PC的電源後,機器就會開始執行ROMBIOS的一系列系統測試動作,包括檢查RAM、鍵盤、顯示器和軟硬磁片等。接著控制權轉移給ROM中的啟動程式(ROMbootstraproutine);該程式會將磁片上的第0軌第0扇區(稱為bootsector或MasterBootRecord,MBR,系統的引導程式就放在此處)讀入記憶體,放入自0x07C0:0x0000開始的512個位元組處;然後處理機跳轉到該處開始執行(位於該處的)MBR引導程式,CS:IP=0x07C0:0x0000。加電後處理機運行在與8086相相容的實模式下。如果要用bootsect-loader進行系統引導,則必須把bootsect.s編譯連接後對應的二進位代碼置於MBR;當ROMBIOS把bootsect.s編譯連接後對應的二進位代碼裝入記憶體後,機器的控制權就完全轉交給bootsect;也就是說,bootsect將是第一個被讀入記憶體中並執行的程式。Bootsect接管機器控制權後,將依次進行以下一些動作:(1)首先,bootsect將它“自己”(自位置0x07C0:0x0000開始的512個位元組)從被ROMBIOS載入的地址0x07C0:0x0000處搬到0x9000:0000處;這一任務由bootsect.s的前十條指令完成;第十一條指令“jmpigo,INITSEG”則把機器跳轉到“新”的bootsect的“jmpigo,INITSEG”後的那條指令“go:mov

di,#0x4000-12”;之後,繼續執行bootsect的剩下的代碼;在bootsect.s中定義了幾個常量:BOOTSEG=0x07C0bios載入MBR的約定位置的段址;INITSEG=0x9000bootsect.s的前十條指令將自己搬到此處(段址)SETUPSEG=0x9020裝入Setup.s的段址SYSSEG=0x1000系統區段址這些常量的定義可參見/include/asm/boot.h;在下面的分析中這些常量會經常用到。(2)以0x9000:0x4000-12為棧底,建立自己的棧區;其中0x9000:0x4000-12到0x9000:0x4000的一十二個位元組預留作磁片參數表區;(3)在0x9000:0x4000-12到0x9000:0x4000的一十二個預留位元組中建立新的磁片參數表。由於設計者考慮到有些老的bios不能準確地識別磁片每個磁軌的扇區數,使得bios建立的磁片參數表妨礙磁片的最高性能發揮,所以設計者在bios建立的磁片參數表的基礎上使用枚舉法測試,試圖建立準確的“新”的磁片參數表(這是在後繼步驟中完成的);並把參數表的位置由原來的0x0000:0x0078搬到0x9000:0x4000-12;且修改老的磁片參數表區使之指向新的磁片參數表;(4)接下來是load_setup子過程;它調用0x13中斷的第2號服務;把第0道第2扇區開始的連續的setup_sects(為常量4)個扇區讀到緊鄰bootsect的記憶體區;,即0x9000:0x0200開始的2048個位元組;而這四個扇區的內容就是/arch/i386/boot/setup.s編譯連接後對應的二進位代碼。換句話說,如果要用bootsect-loader進行系統引導,不僅必須把bootsect.s編譯連接後對應的二進位代碼置於MBR,而且還要將\把setup.s編譯連接後對應的二進位代碼置於緊跟MBR後的連續的四個扇區中。由於setup.s對應的可執行碼是由bootsect裝載的,所以可以根據需要修改bootsect來設置setup.s對應的可執行碼;(5)load_setup子過程的惟一出口是probe_loop子過程;該過程通過枚舉法測試磁片“每個磁軌的扇區數”;(6)接下來幾個子過程比較清晰:顯示“Loading”;讀入系統到0x1000:0x0000;關掉軟驅馬達;根據的5步測出的“每個磁軌的扇區數”確定磁片類型;最後跳轉到0x9000:0x0200,即setup.s對應的可執行碼的入口,將機器控制權轉交setup.s;整個bootsect代碼運行完畢。引導過程執行完後的記憶體映像圖如圖2.3所示。完成了系統的引導後,系統將進入到初始化處理階段。系統的初始化分為實模式和保護模式兩部分。為了簡單起見,在上面的分析中,忽略了對大內核的處理的分析。因為對大內核的處理,只是此引導過程中的一個很小的部分,並不影響對整體的把握。2.2.2實模式下的初始化

實模式下的初始化,主要是指從內核引導成功後,到進入保護模式之前系統所做的一些處理。在內核源碼中對應的程式是/arch/i386/boot/setup.s;以下部分主要對該檔進行分析。這部分的分析要弄懂它的處理流程和INITSEG(9000:0000)段參數表的建立的過程。該參數表包含了很多硬體參數,這些都是以後進行保護模式下初始化以及核心建立的基礎。相關檔有:

/arch/i386/boot/bootsect.s/include/linux/config.h

/include/asm/boot.h

/include/asm/segment.h

/include/linux/version.h

/include/linux/compile.h

setup.s完成在實模式下版本檢查,並將硬碟、滑鼠及記憶體的參數寫入到INITSEG中,並負責進入保護模式。實模式下的初始化過程如圖2.4及圖2.5所示:

圖2.4實模式下的初始化過程1圖2.5實模式下的初始化過程2表2.1INITSEG(9000:0000)段參數表:(參見include/linux/tty.h)參數名偏移量(段址均為0x9000)長度Byte參考檔PARAM_CURSOR_POS0x00002arch/i386/boot/video.sextendedmemSize0x00022arch/i386/boot/setup.sPARAM_VIDEO_PAGE0x00042arch/i386/boot/video.sPARAM_VIDEO_MODE0x00061arch/i386/boot/video.sPARAM_VIDEO_COLS0x00071arch/i386/boot/video.s未用0x00082include/linux/tty.hPARAM_VIDEO_EGA_BX0x000a2arch/i386/boot/video.s未用0x000c2include/linux/tty.hPARAM_VIDEO_LINES0x000e1arch/i386/boot/video.sPARAM_HAVE_VGA0x000f1arch/i386/boot/video.sPARAM_FONT_POINTS0x00102arch/i386/boot/video.sPARAM_LFB_WIDTH0x00122arch/i386/boot/video.sPARAM_LFB_HEIGHT0x00142arch/i386/boot/video.sPARAM_LFB_DEPTH0x00162arch/i386/boot/video.sPARAM_LFB_BASE0x00184arch/i386/boot/video.sPARAM_LFB_SIZE0x001c4arch/i386/boot/video.s暫未用①0x00204include/linux/tty.hPARAM_LFB_LINELENGTH0x00242arch/i386/boot/video.sPARAM_LFB_COLORS0x00266arch/i386/boot/video.s暫未用②0x002c2arch/i386/boot/video.sPARAM_VESAPM_SEG0x002e2arch/i386/boot/video.sPARAM_VESAPM_OFF0x00302arch/i386/boot/video.sPARAM_LFB_PAGES0x00322arch/i386/boot/video.s保留0x0034--0x003f

include/linux/tty.hAPMBIOSVersion③0x00402arch/i386/boot/setup.sBIOScodesegment0x00422arch/i386/boot/setup.sBIOSentryoffset0x00444arch/i386/boot/setup.sBIOS16bitcodeseg0x00482arch/i386/boot/setup.sBIOSdatasegment0x004a2arch/i386/boot/setup.s支持32位標誌④0x004c2arch/i386/boot/setup.sBIOScodeseglength0x004e4arch/i386/boot/setup.sBIOSdataseglength0x00522arch/i386/boot/setup.shd0參數0x008016arch/i386/boot/setup.shd0參數0x009016arch/i386/boot/setup.sPS/2device標誌⑤0x01ff1arch/i386/boot/setup.s

注:①include/linux/tty.h:CL_MAGICandCL_OFFSEThere②include/linux/tty.h:unsignedcharrsvd_size;//0x2cunsignedcharrsvd_pos;//0x2d③0表示沒有電源管理(APM)BIOS④0x0002置位表示支持32位模式⑤0表示沒有,0x0aa表示有滑鼠器2.2.3保護模式下的初始化

保護模式下的初始化,是指處理機進入保護模式後到運行系統第一個內核程式過程中,系統所做的一些處理。保護模式下的初始化在內核源碼中對應的程式是/arch/i386/boot/compressed/head.s和/arch/i386/kernel/head.s;以下部分主要是針對這兩個檔進行的分析。在i386體系結構中,因為i386本身的問題,在"arch/alpha/kernel/head.s"中需要更多的設置,最終是通過callSYMBOL_NAME(start_kernel)轉到start_kernel()這個體系結構無關的函數中去執行了。

在i386系統中,當內核以bzImage的形式壓縮,即大內核方式(BIG_KERNEL)壓縮時就需要預先處理bootsect.s和setup.s,按照大核模式使用$(CPP)處理生成bbootsect.s和bsetup.s,然後再編譯生成相應的.o檔,並使用"arch/i386/boot/compressed/build.c"生成的build工具,將實際的內核(未壓縮的,含kernel中的head.s代碼)與"arch/i386/boot/compressed"下的head.s和misc.c合成到一起,其中的head.s代替了"arch/i386/kernel/head.s"的位置,由Bootloader引導執行(startup_32入口),然後它調用misc.c中定義的decompress_kernel()函數,使用"lib/inflate.c"中定義的gunzip()將內核解壓到0x100000,再轉到其上執行"arch/i386/kernel/head.s"中的startup_32代碼。幾個有關檔是:/arch/i386/boot/compressed/head.s/arch/i386/kernel/head.s//arch/i386/boot/compressed/MISC.c/arch/i386/boot/setup.s/include/asm/segment.h/arch/i386/kernel/traps.c/include/i386/desc.h/include/asm-i386/processor.h保護模式下的初始化過程大致如下:1./arch/i386/kernel/head.s流程因為在setup.s最後的是一條轉跳指令,跳到內核第一條指令並開始執行。指令中指向的是記憶體中的絕對地址,無法依此判斷轉跳到了head.s。但是可以通過Makefile簡單的確定head.s位於內核的前端。在arch/i386的Makefile

中定義了HEAD:=arch/i386/kernel/head.o

在Linux總的Makefile中的語句includearch/$(ARCH)/Makefile說明HEAD定義在該檔中有效。由如下語句:vmlinux:$(CONFIGURATION)init/main.oinit/version.o

linuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o\$(ARCHIVES)\$(FILESYSTEMS)\$(DRIVERS)\$(LIBS)-ovmlinux$(NM)vmlinux|grep-v'\(compiled\)\|\(\.o$$\)\|\(a\)'|sort>System.map從這個依賴關係可以獲得大量的資訊:(1)$(HEAD)即head.o的確第一個被連接到核心中;(2)內核支持的所有檔系統全部編譯到$(FILESYSTEMS)即fs/filesystems.a中;(3)內核中支持的所有網路協議全部編譯到net.a中;(4)內核中支持的所有SCSI驅動全部編譯到scsi.a中;

這樣看來,內核就是一堆庫檔和目標檔的集合。如果要對內核減肥的話,可以好好比較一下,看究竟是那個部分佔用了空間。在System.map中包含了所有的內核輸出的函數,這些是在編寫內核模組的時候可以調用的系統函數。2.head.s的分析(1)首先將ds、es、fs和gs指向系統數據段KERNEL_DS(KERNEL_DS在asm/segment.h中定義,表示全局描述符表中中的第三項)。

注意:該此時生效的全局描述符表並不是在head.s中定義的,而仍然是在setup.s中定義的。(2)數據段全部清空。(3)setup_idt為一段子程式,將中斷向量表全部指向ignore_int函數。該函數列印出“unknowninterrupt”,當然這樣的中斷處理函數什麼也幹不了。(4)查看數據線A20是否有效,否則迴圈等待。地址線A20是x86的歷史遺留問題,決定是否能訪問1M以上記憶體。(5)拷貝啟動參數到0x5000頁的前半頁,而將setup.s取出的bios參數放到後半頁。(6)檢查CPU類型。(7)初始化頁表,只初始化最初幾頁。①將swapper_pg_dir(0x2000)和pg0(0x3000)清空,swapper_pg_dir作為整個系統的頁目錄。②將pg0作為第一個頁表,將其地址賦到swapper_pg_dir的第一個32位字中。③同時將該頁表項也賦給swapper_pg_dir的第3072個入口,表示虛擬地址0xc0000000也指向pg0。④將pg0這個頁表填滿指向記憶體前4M。⑤進入分頁方式。(8)裝入新的GDT和ldt表。(9)刷新段寄存器ds、es、fs和gs。(10)使用系統堆疊,即預留的0x6000頁面。(11)執行start_kernel函數,這是第一個C編制的函數,內核又有了一個新的開始。圖2.6/arch/i386/kernel/head.s流程圖一圖2.7/arch/i386/kernel/head.s流程圖二3./arch/i386/boot/compressed/head.s流程圖2.8是/arch/i386/boot/compressed/head.s的流程圖。從圖中可看到,保護模式下的初始化主要做了幾件事:解壓內核到0x100000處、建立頁目錄和pg0頁表並啟動分頁功能(即虛存管理功能)、保存實模式下測到的硬體資訊到empty_zero_page、初始化命令緩存區、檢測cpu類型、檢查協處理器、重新建立GDT全局描述符表和中斷描述附表IDT。

圖2.8/arch/i386/boot/compressed/head.s流程

從頁目錄和pg0頁表可以看出,0�;4M物理記憶體被用作系統區,它被映射到系統段線性空間的0�;4M和3G�;3G+4M;即系統可以通過訪問這兩個段來訪問實際的0�;4M物理記憶體,也就是系統所在的區域;本來在實模式下初始化時已經建立了全局描述符表GDT,而此處重新建立全局描述符表GDT則主要是出於兩個原因:一個就是若內核是大內核bzimag,則以前建立的GDT,可能在解壓時已經被覆蓋了。所以在這個源碼檔中均只採用相對轉移指令jxx

nf或jxx

nb;二是以前建立的GDT是建立在實地址方式下的,而現在則是在啟用保護虛擬地址方式之後建立的,也即現在的GDT是建立在邏輯地址(即線性地址)上的;每次建立新的GDT後和啟用保護虛擬地址方式後都必須重新裝載系統棧和重新初始化各段寄存器:cs,ds,es,fs,gs;

從實模式下的初始化和保護模式下的初始化過程可以看出,Linux系統由實模式進入到保護模式的過程大致如圖2.9所示。由於分頁機制只能在保護模式下啟動,不能在實模式下啟動,所以第一步是必要的;又因為在386保護模式下GDT和IDT是建立在邏輯地址(線性地址)上的,所以第三步也是必要的;位置系統數據大小0x101000頁目錄swapper_pg_dir4K0x102000頁表pg04K0x103000empty_bad_page4K0x104000empty_bad_page_table4K0x105000empty_zero_page4K0x105000系統硬體參數2K0x105800命令緩衝區2K0x106000全局描述附表gdt_table4192B經過實模式和保護模式下的初始化後,主要系統數據的分佈如表2.2所示。

從上面對Linux系統的初始化過程的分析可以看出,以程式執行流程為線索,即按照程式的執行先後順序,弄懂程式執行的各個階段所進行的處理,及其各階段之間的相互聯繫。而流程圖應該是這種分析方法最合適的表達工具。事實上,以程式執行流程為線索,是分析任何源代碼都首選的方法。用這種方法來分析系統的初始化過程或用戶進程的執行流程應該說是很有效的。當然由於操作系統的特殊性,光用這種方法是遠遠不夠的。2.2.4系統初始化

Linux內核裝入之後,Linux內核進行硬體和設備驅動程式的初始化,然後運行init。init是Linux內核啟動的第一個用戶級進程,其進程標識號始終為1,該進程在系統引導和關機過程中扮演重要角色。Linux內核進行的初始化工作可大體描述如下:(1)Linux內核一般是壓縮保存的,因此,它首先要進行自身的解壓縮。內核映象前面的一些代碼完成解壓縮。(2)如果系統中安裝有可支持特殊文本模式的、且Linux可識別的SVGA卡,Linux會提示用戶選擇適當的文本顯示模式。但是,如果在內核的編譯過程中預先設置了文本模式,則不會提示選擇顯示模式。該顯示模式也可通過LILO或rdev

設置。(3)內核接下來檢測其他的硬體設備,例如硬碟、軟碟和網卡等,並對相應的設備驅動程式進行配置。這時,內核會輸出一些硬體資訊,類似下麵的輸出:LILOboot:

LoadingLinux.

Memory:sizedbyint13088h

Console:16pointfont,400scans

Console:colourVGA+80x25,1virtualconsole(max63)

pcibios_init:BIOS32ServiceDirectorystructureat0x000f7510

pcibios_init:BIOS32ServiceDirectoryentryat0xfd7d2

pcibios_init:PCIBIOSrevision2.10entryat0xfd9e6

ProbingPCIhardware.

Calibratingdelayloop..ok-231.83BogoMIPS

Memory:30760k/32704kavailable(748kkernelcode,384kreserved,812kdata)

SwanseaUniversityComputerSocietyNET3.035forLinux2.0

NET3:UNIXdomainsockets0.13forLinuxNET3.035.

SwanseaUniversityComputerSocietyTCP/IPforNET3.034

IPProtocols:IGMP,ICMP,UDP,TCP

LinuxIPmulticastrouter0.07.

VFS:Diskquotasversiondquot_5.6.0initialized

Checking386/387coupling...Ok

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论