2008年11月25日 星期二

Linux啓動分析(1)— 總體過程[轉貼]

系統引導過程總體介紹
啓動流程:
系統引導過程主要由以下幾個步驟組成(以硬碟啓動為例)
  1. 開機;

  2. BIOS加電自檢(POST——Power On Self Test),包括檢查RAM,keyboard,顯示器,軟硬磁盤等等。Intel系列的CPU首先進入的是實模式,並開始執行位於地址0xFFFF0處的代碼,也就是ROM-BIOS起始位置的代碼;

  3. 搜索啓動的操作系統,根據BIOS設置,可能會依次訪問每個軟碟的第一個扇區、硬碟、CD-ROW等;一旦找到有效的啓動設備,將第一個扇區(0頭0道1扇區,也就是Boot Sector)的内容讀入内存地址0x7c00處;

  4. 檢查(WORD)0000:7dfe是否等于0xaa55.若不等于則轉去嘗試其他介質;如果没有其他啓動介質,則顯示 “No ROM BASIC” ,然後當機;

  5. 跳轉到0000:7c00處執行MBR中的程序bootsect.S;

  6. MBR先將自己復制到0x90000處,然後將緊接其後的setup部分(第二扇區)拷貝到0x90200,將真正的内核代碼拷貝到0x100000。以上這些拷貝動作都是以bootsect.S、setup.S以及vmlinux在磁盤上連續存放為前提的;

  7. bootsect.S完成加載動作後,就直接跳轉到0x90200,這裏正是setup.S的程序入口。 setup.S的主要功能就是將系統參數(包括内存、磁盤等,由BIOS返回)拷貝到 0x90000-0x901FF内存中,這個地方正是bootsect.S存放的地方,這時它將被系統參數覆蓋。以後這些參數將由保護模式下的代碼來讀取。

  8. setup.S還將video.S中的代碼包含進來,檢測和設置顯示器和顯示模式。最後,setup.S將系統轉换到保護模式,並跳轉到0x100000(對于bzImage格式的大内核是 0x100000,對于zImage格式的是0x1000)的内核引導代碼,Bootloader過程結束;

  9. Bootloader跳轉到0x100000, 此處為"arch/I386/init/head.S"中的startup_32, startup_32的代碼只需要設置一下全局變量,然後就跳轉到start_kernel去了;start_kernel()是"init/main.c"中的asmlinkage函數,至此,啓動過程轉入體系結構無關的通用C代碼中;

  10. start_kernel()中設置與體系結構相關的環境、頁表結構初始化、Trap/IRQ初始化、核心進程調度器初始化、時間/定時器初始化、控制台初始化、核心Cache初始化、内存初始化、内部及通用等各種Cache初始化、信號量初始化、其他部分初始化(Init()及smp_init());

  11. 啓動Init()過程,創建第一個進程;Init()中,取得 run-level 信息, 執行 /etc/rc.d/rc.sysinit 脚本, 激活核心的外挂式模塊 (/etc/modules.conf), 然後init 執行 run-level 的各個脚本, 接着執行 /etc/rc.d/rc.local脚本, 最後執行 /bin/login 程序, 登入之後開始以 Shell 控管主機;

  12. 啓動完成。


資料來源:
http://blog.csdn.net/cxylaf/archive/2007/05/26/1626511.aspx

沒有留言: