?? 1.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富國,http://winking.126.com"> <TITLE>啟動</TITLE></HEAD><BODY style="font-family: 宋體; font-size: 9pt"> <CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--標題由此開始-->啟動</TD></TR></TABLE></CENTER><p><h3>目 錄</h3><!--目錄由此開始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I24">啟動</A></LI><OL><LI><A HREF="#I25">開機簡述</A></LI><LI><A HREF="#I26">啟動過程跟蹤</A></LI><LI><A HREF="#I27">lilo</A></LI><OL><LI><A HREF="#I28">lilo原理</A></LI><LI><A HREF="#I29">man手冊</A></LI><LI><A HREF="#I30">LILO配置</A></LI></OL><LI><A HREF="#I31">GRUB</A></LI><OL><LI><A HREF="#I32">下載并安裝GRUB</A></LI><LI><A HREF="#I33">設備命名規則</A></LI><LI><A HREF="#I34">引導多系統</A></LI><LI><A HREF="#I35">實例</A></LI><LI><A HREF="#I36">菜單設置</A></LI><LI><A HREF="#I37">用戶界面</A></LI><LI><A HREF="#I38">命令列表</A></LI></OL><LI><A HREF="#I39">init(for BSD)</A></LI><LI><A HREF="#I40">/etc/rc?.d目錄和/etc/rc?文件</A></LI><LI><A HREF="#I41">/etc/inittab文件</A></LI><LI><A HREF="#I42">守候進程</A></LI><LI><A HREF="#I43">系統啟動loader</A></LI><LI><A HREF="#I746">多系統安裝</A></LI><OL><LI><A HREF="#I747">分配磁盤空間</A></LI><LI><A HREF="#I748">安裝Linux</A></LI><LI><A HREF="#I749">進一步:NTloader引導雙系統</A></LI></OL></OL></OL><hr><br><A NAME="I24" ID="I24"></A><center><b><font size=+2>啟動</font></b></center><br>1. lilo<br>2. kernal<br>3. init 1/2/3/5<br> important files:<br> /etc/inittab<br> /etc/rc.d/...<br>4. xdm (graphics interface)<br> important file:<br> /etc/X11/xinit/xsession<br> It seemed that different distribution has differrent xsession.<br>5. see how /etc/X11/xinit/xsession is written.<br> some related files:<br> Xclients, xinitrc,<br> .xsession, .Xclients, .xinitrc<center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I25" ID="I25"></A><center><b><font size=+2>開機簡述</font></b></center><br> 開機過程制的是從打開計算機電源直到LINUX顯示用戶登錄畫面的全過程。分析LINUX開機過程也是深入了解LINUX核心工作原理的一個很好的途徑。在不同的計算機平臺上,LINUX的開機過程稍有不同,本節以X386微機系統為例,介紹LINUX的開機過程。<p>1。開機自檢<p> 在剛開機時,根據X386CUP的特性,代碼段(CS,CODE SEGMENT)寄存器的值為全1,指令計數器(IP,INSTRUCTION POINTER)的值為全0,既CS=FFFF、IP=0000。這時CPU根據CS和IP 的值執行FFFF0H處的指令。由于FFFF0H已經到了基本內存的高地址頂端,所以,FFFF0H處的指令一般總是一個JMP指令,以便CPU能夠跳到比較低的地址去執行那里的代碼,這個地址通常是ROM BIOS 的入口地址。接著,ROM BIOS 進行開機自檢,如檢查內存,鍵盤等。在自檢過程中,ROM BIOS會在上位內存(UMB,UPPERMEMORY BLOCK)中進行掃描,侃侃是否存在合法的設備控制卡ROM BIOS(如:SCSI卡上的ROM),如果有,就執行其中的一些初始化代碼。最后,ROM BIOS 讀取磁盤上的第一個扇區并將這個扇區的內存裝入內存。<p>2。預引導<p> 假定硬盤是系統的啟動磁盤。硬盤的第一扇區稱為主引導記錄(MBR, MASTER BOOTRECORD)。MBR 的長度為512字節。可分為兩部分:第一部分為引導(PRE-BOOT)區,占了446個字節;第二部分為分區表(PARTITION PABLE),共有66個字節,記錄硬盤的分區信息。預引導區的作用之一是找到標記為活動(ACTIVE)的分區,并將活動分區的引導區讀入內存。<p> 如果用軟盤啟動計算機,ROM BIOS 讀入的是軟盤的引導區,既軟盤的第一個扇區。<p>3。核心映像裝入<p> 在LINUX系統中,人們通常把LILO(LINUX LOADER)放在MBR或某個分區的超級塊(SUPERBLOCK)中。假定LILO在MBR中,讀取MBR后,LILO就會被首先執行。此時,屏幕上出現“BOOT:”字樣,接下來的工作是裝入LINUX核心映像。如果LILO安裝在某個分區的超級塊中,通常還會有一個管理開機的程序,這個管理開機的程序負責讀取LILO,進而進行核心映像的裝入工作。<p>4。核心啟動<p> 核心裝入完畢后,CPU的控制權就交給了核心啟動代碼。此時,核心首先進行硬件的檢測和設備驅動程序的初始化,然后運行INIT。INIT 是LINUX核心啟動的第一個用戶進程,其進程號為1,是系統其它用戶進程的祖先。<p>5。系統初始化<p> INIT進程負責進行一系列系統初始化程序和腳本文件,/ETC/INITTAB中包含了INIT所做的所有工作。<p>6。等待用戶登錄<p> 系統初始化完畢后,INIT 切換到多用戶模式,并為每一個虛擬控制臺和川行終端啟動一個GETTY進程。GETTY進程負責接受和檢驗用戶的登錄要求。<p> 至此,LINUX系統的啟動工作全部完成。不同核心版本的LINUX 的啟動過程有一定的差異,不同發行版本的LINUX 的啟動也可能稍有不同,但基本過程是類似的。另外,在“BOOT:”后,利用“LINUX SINGLE”命令可以迫使LINUX進入單用戶模式,除不要求用戶登錄和不啟動虛擬終端以外,啟動過程的其它部分也基本類似。<p><p><center><A HREF="#Content">[目錄]</A></center><hr><br><A NAME="I26" ID="I26"></A><center><b><font size=+2>啟動過程跟蹤</font></b></center><br> 本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP為平臺,描述了從開機到登錄的 Linux 啟動全過程。該文對i386平臺同樣適用。<p>一. Bootloader<br> 在Alpha/AXP平臺上引導Linux通常有兩種方法,一種是由MILO及其他類似的引導程序引導,另一種是由Firmware直接引導。MILO功能與i386平臺的LILO相近,但內置有基本的磁盤驅動程序(如IDE、SCSI等),以及常見的文件系統驅動程序(如ext2,iso9660等), firmware有ARC、SRM兩種形式,ARC具有類BIOS界面,甚至還有多重引導的設置;而SRM則具有功能強大的命令行界面,用戶可以在控制臺上使用boot等命令引導系統。ARC有分區(Partition)的概念,因此可以訪問到分區的首扇區;而SRM只能將控制轉給磁盤的首扇區。兩種firmware都可以通過引導MILO來引導Linux,也可以直接引導Linux的引導代碼。<p> “arch/alpha/boot”下就是制作Linux Bootloader的文件。“head.S”文件提供了對 OSF PAL/1的調用入口,它將被編譯后置于引導扇區(ARC的分區首扇區或SRM的磁盤0扇區),得到控制后初始化一些數據結構,再將控制轉給“main.c”中的start_kernel(), start_kernel()向控制臺輸出一些提示,調用pal_init()初始化PAL代碼,調用openboot() 打開引導設備(通過讀取Firmware環境),調用load()將核心代碼加載到START_ADDR(見 “include/asm-alpha/system.h”),再將Firmware中的核心引導參數加載到ZERO_PAGE(0) 中,最后調用runkernel()將控制轉給0x100000的kernel,bootloader部分結束。<p> “arch/alpha/boot/bootp.c”以“main.c”為基礎,可代替“main.c”與“head.S” 生成用于BOOTP協議網絡引導的Bootloader。<br> Bootloader中使用的所有“srm_”函數在“arch/alpha/lib/”中定義。<p> 以上這種Boot方式是一種最簡單的方式,即不需其他工具就能引導Kernel,前提是按照 Makefile的指導,生成bootimage文件,內含以上提到的bootloader以及vmlinux,然后將 bootimage寫入自磁盤引導扇區始的位置中。<p> 當采用MILO這樣的引導程序來引導Linux時,不需要上面所說的Bootloader,而只需要 vmlinux或vmlinux.gz,引導程序會主動解壓加載內核到0x1000(小內核)或0x100000(大內核),并直接進入內核引導部分,即本文的第二節。<p>對于I386平臺<br> i386系統中一般都有BIOS做最初的引導工作,那就是將四個主分區表中的第一個可引導分區的第一個扇區加載到實模式地址0x7c00上,然后將控制轉交給它。<p> 在“arch/i386/boot”目錄下,bootsect.S是生成引導扇區的匯編源碼,它首先將自己拷貝到0x90000上,然后將緊接其后的setup部分(第二扇區)拷貝到0x90200,將真正的內核代碼拷貝到0x100000。以上這些拷貝動作都是以bootsect.S、setup.S以及vmlinux在磁盤上連續存放為前提的,也就是說,我們的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux這樣的順序組織,并存放于始于引導分區的首扇區的連續磁盤扇區之中。<p> bootsect.S完成加載動作后,就直接跳轉到0x90200,這里正是setup.S的程序入口。 setup.S的主要功能就是將系統參數(包括內存、磁盤等,由BIOS返回)拷貝到 0x90000-0x901FF內存中,這個地方正是bootsect.S存放的地方,這時它將被系統參數覆蓋。以后這些參數將由保護模式下的代碼來讀取。<p> 除此之外,setup.S還將video.S中的代碼包含進來,檢測和設置顯示器和顯示模式。最后,setup.S將系統轉換到保護模式,并跳轉到0x100000(對于bzImage格式的大內核是 0x100000,對于zImage格式的是0x1000)的內核引導代碼,Bootloader過程結束。<p>對于2.4.x版內核<br> 沒有什么變化。<p>二.Kernel引導入口<p> 在arch/alpha/vmlinux.lds的鏈接腳本控制下,鏈接程序將vmlinux的入口置于 "arch/alpha/kernel/head.S"中的__start上,因此當Bootloader跳轉到0x100000時, __start處的代碼開始執行。__start的代碼很簡單,只需要設置一下全局變量,然后就跳轉到start_kernel去了。start_kernel()是"init/main.c"中的asmlinkage函數,至此,啟動過程轉入體系結構無關的通用C代碼中。<p><br>對于I386平臺<br> 在i386體系結構中,因為i386本身的問題,在"arch/alpha/kernel/head.S"中需要更多的設置,但最終也是通過call SYMBOL_NAME(start_kernel)轉到start_kernel()這個體系結構無關的函數中去執行了。<p> 所不同的是,在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代碼。<p>對于2.4.x版內核<br> 沒有變化。<p>三.核心數據結構初始化--內核引導第一部分<br> start_kernel()中調用了一系列初始化函數,以完成kernel本身的設置。這些動作有的是公共的,有的則是需要配置的才會執行的。<p>在start_kernel()函數中,<p> ·輸出Linux版本信息(printk(linux_banner))<br> ·設置與體系結構相關的環境(setup_arch())<br> ·頁表結構初始化(paging_init())<br> ·使用"arch/alpha/kernel/entry.S"中的入口點設置系統自陷入口(trap_init())<br> ·使用alpha_mv結構和entry.S入口初始化系統IRQ(init_IRQ())<br> ·核心進程調度器初始化(包括初始化幾個缺省的Bottom-half,sched_init())<br> ·時間、定時器初始化(包括讀取CMOS時鐘、估測主頻、初始化定時器中斷等,time_init())<br> ·提取并分析核心啟動參數(從環境變量中讀取參數,設置相應標志位等待處理,(parse_options())<br> ·控制臺初始化(為輸出信息而先于PCI初始化,console_init())<br> ·剖析器數據結構初始化(prof_buffer和prof_len變量)<br> ·核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())<br> ·延遲校準(獲得時鐘jiffies與CPU主頻ticks的延遲,calibrate_delay())<br> ·內存初始化(設置內存上下界和頁表項初始值,mem_init())<br> ·創建和設置內部及通用cache("slab_cache",kmem_cache_sizes_init())<br> ·創建uid taskcount SLAB cache("uid_cache",uidcache_init())<br> ·創建文件cache("files_cache",filescache_init())<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -