Linux Boot Process 分析與研究__Linux

來源:互聯網
上載者:User

pre { font-family: "Times New Roman"; }p { margin-bottom: 0.08in; }

Linux Boot Process 分析與研究                         作者: 錢國正 (淮陰師範學院)   對於linux的研究正在緊鑼密鼓的進行著,源於對系統啟動的興趣,開始對其啟動過程全面的分析,建立在以前玩過Linux的基礎上,知道Linux啟動時有GRUB可以選擇想要啟動的系統,開始進行啟動深入剖析。大家不要擔心,即使您對電腦的啟動過程一無所知也可以看下面的文章。   當我們按下開機電源開關的時候,系統就在啟動的過程中了,相信使用過Windows的人或多或少的都對其啟動速度有些意見,但是對它的啟動過程卻一無所知,這就讓人很鬱悶,呵呵,不急,下面進入本文。所有的電腦開機時都會有BIOS(Basic Input and Output System)對電腦進行自檢,如記憶體測試等,並對本地裝置進行枚舉和初始化工作,接下來搜尋BIOS中設定的處於活動狀態並且可以引導的啟動裝置。通常情況下,Linux系統是從硬碟(也可以從CD,DVD,USB等)引導的,硬碟的開機磁區在每個分區中都存在,但是主開機磁區只有一個並位於第一個物理扇區。主開機磁區包含主引導記錄(MBR)和硬碟分區表(DPT)。硬碟的主開機磁區中包含了主引導記錄(MBR)的引導載入程式。此時BIOS將控制權交給MBR。Windows作業系統在這一步與Linux相同。   主開機磁區大小為512B,包含MBR程式碼,分區表DPT(64KB)以及結束標誌(AA55)。MBR中包含了關於GRUB(或者早期的LILO)資訊。MBR載入並執行GRUB(Grand Unified Bootloader) boot loader。下面的事情就由GRUB boot loader來控制執行了。   在Windows中MBR直接引導Windows作業系統,如果有兩個版本的Windows系統,要先安裝低版本的,否則只能進入一個作業系統!簡單的說就是,Windows只認自己人,別的都不認,足見其霸道之處,所以如果要安裝雙系統如Windows和Linux要先安裝Windows,然後安裝Linux系統。現在回到GRUB,GRUB載入後基本上就完成了大部分工作了。BIOS與MBR都是硬體上的東東,咱不太熟悉,到了GRUB咱就可以對其代碼進行分析了,由於篇幅限制,這裡就不贅述了,其原始碼大家可以到www.sourceforge.org下載。GRUB的工作是顯示一個啟動畫面,如果你不輸入或者選擇,它將啟動預設選擇的作業系統(Ubuntu中如果想修改啟動選項可以修改/boot/grub/grub.cfg,慎用。。。),其還可以識別檔案系統,下面'Ubuntu, with Linux 2.6.32-27-generic'是系統啟動所顯示的預設選項### BEGIN /etc/grub.d/10_linux ###menuentry 'Ubuntu, with Linux 2.6.32-27-generic' --class ubuntu --class gnu-linux --class gnu --class os {        recordfail        insmod ext2        set root='(hd0,10)'        search --no-floppy --fs-uuid --set e36d89d9-ad79-467d-8acf-fadef717c6b7        linux   /boot/vmlinuz-2.6.32-27-generic root=UUID=e36d89d9-ad79-467d-8acf-fadef717c6b7 ro  splash vga=758  quiet splash        initrd  /boot/initrd.img-2.6.32-27-generic}。由於咱側重的是Linux的啟動過程,下面介紹下Linux下的一個被成組自舉引導的程式(bootsect-loader),在Linux源碼樹中的arch/i386/boot/bootsect.S,其為CPU實模式下的組譯工具,為了方便分析,對其源碼進行簡單介紹。SETUPSECTS=4               //安裝時的預設值BOOTSEG   =0x07C0          //引導時的原始地址INITSEC   =DEF_INITSEG     //移動引導程式SETUPSEG  =DEF_SETUPSEG    //從這裡開始安裝SYSSEG    =DEF_SYSSEG      //系統裝載SYSSIZE   =DEF_SYSSIZE     //系統大小在include/asm-i386/boot.h中的宏定義#define DEF_INITSEG    0x9000#define DEF_SYSSEG     0x1000#define DEF_SETUPSEG   0x9020#define DEF_SYSSIZE    0x7F00以下這段初學者可以略過(摘自《Linux系統分析與實踐》)。    bootsect.S在核心編譯時間產生bootsect模組,在整個核心鏡像檔案的最前面。當電腦啟動時先進入實模式,首先執行位於0xffff0這個地址的程式碼,這個地址實際上是映射到電腦ROM BIOS地址,也就是說首先執行BIOS的代碼,執行某些檢測,在地址0x0000位置設定中斷向量表,並把第一個扇區讀入到記憶體絕對位址0x7c00這個位置。bootsect的代碼就位於第一扇區,所以跳到這個位置執行。bootsect將自己移動到0x90000,並把setup模組搬運到0x90200這個位置,bootsect執行完後,執行setup模組。在setup執行過程中,完成必要設定,並把system搬移到0x10000這個位置。但system前面的head部分執行完畢後,然後把system搬運到0x0000的地址以後,system模組中代碼地址就等於物理地址,這樣便於對核心操作,之所以不在開始的時候直接把system模組搬運到0x0000的位置是因為,當setup模組沒有執行完畢的時候,0x0000這個位置還存放這BIOS的資訊和一些中斷向量表。如果開始就搬運就會把這些內容覆蓋掉而出錯。    setup.S的主要功能就是將系統參數(包括記憶體、磁碟等,由BIOS返回)複製到0x90000~0x901FF記憶體中。這個位置原本是bootsect.S被存放的位置,這時它將被系統參數覆蓋。以後這些參數將由保護模式下的代碼來讀取。除此之外,setup.S還將video.S中的程式碼封裝含進來,檢測和設定顯示器和顯示模式。最後,setup.S將系統轉換到保護模式,並跳轉到0x100000的核心引導代碼,Bootloader將控制權移交系統核心。    Kernel負責載入根檔案系統,執行/sbin/init中的程式,以及一些驅動程式。其由head.S開始執行初始地址為0x100000,主要完成一些初始化工作,清除BSS,複製啟動參數,初始化寄存器,初始化GDT和IDT等,然後執行start_kernel()。    Init為Linux的核心線程,完成外設的初始化工作,包括SMP(),以及調用do_basic_setup()完成外設及驅動的加在和初始化。    至此,Linux已經啟動完畢,雖然寫了這麼多,但是其速度快的驚人阿,只有不到30秒的時間,哈哈,快的可以達到10多秒,比Windows可好多啦。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.