linux起動順序


1.BIOSフェーズ
BIOSについてはここでは説明しないが、BIOSは起動装置の最初のセクタをRAMにコピーするために使用され、このセクタはMBRを格納し、後者はGRUBなどのブートプログラムである可能性がある.ブートプログラムはRAM中の0 x 7 C 00アドレスに格納、
2.ブートストラップ実行フェーズ
BIOSフェーズでブートプログラムが0 x 0007 C 00アドレスにコピーされ、PCポインタがそのアドレスにジャンプすると、ブートプログラム命令が実行される.ここで、ブートプログラムはGRUBであると仮定し、linuxの古いバージョンでは、GRUBはカーネルミラーbzImageのsetup部分を0 x 0000 9000アドレスにコピーし、残りの部分を0 x 0000 10000にコピーする.一方、Linuxの新しいバージョンでは、GRUBはカーネルミラーbzImageのsetup部分を0 x 100000以下のアドレスXにコピーし、残りの部分を0 x 00000アドレスにコピーします.なお、ここでsetup部分は、実モード関連コード、すなわち/arch/XX/boot/を指す.メモリ分布については/Documentation/x 86/bootを参照する.txtの内容.
3.setup実モードフェーズ
実モードは主にメモリ、キーボードなどのデバイスを検出し、基本的に初期化し、最後に保護モードに切り替えて動作します.ここでは通常、0 x 100000にジャンプして保護モードコードを実行します.
    copy_boot_params();           boot header   "zeropage"
        validate_cpu();                        CPU
        set_bios_mode();              BIOS  CPU       
        detect_memory();              Memory
        keyboard_set_repeat();           repeat rate (Why ?)
        set_video();                     Video mode
        query_mca();                    MCA   
        query_voyager();             Voyager ?
        query_ist();                       Query Intel SpeedStep (IST)   
        query_apm_bios();              APM   
        query_edd();                    EDD  

protected_mode_jump(boot_params.hdr.code32_start,    (u32)&boot_params + (ds() << 4));
code32_start   header.s (arch/i386/boot/header.s)      :
 
code32_start:                           # here loaders can put a different
                                        # start address for 32-bit code.
                .long   0x100000        # 0x100000 = default for big kernel

4.保護モードフェーズ
通常0 x 10000000アドレスにvmlinuxが格納.binであるが、カーネルが大きすぎるのを防止するために、カーネルを圧縮する方式でカーネルのサイズを減らすため、vmlinux.binは一般的に圧縮後のカーネル、vmlinuxである.binは/boot/compressed/中コード、圧縮カーネルpiggy、および解凍コード、vmlinuxを含む.binのエントリ関数はstartup_32(arch/x 86//boot/compress/head_32.S)なのでstartup_32で実行されます.ここでは、カーネルの解凍が含まれ、最終的には本物のカーネルエントリのstartup_にジャンプします.32関数(arch/x 86/kernel/head_32.S)で実行します.