歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux之Bootloader了解概念和啟動過程

Bootloader,簡而言之就是:它是一段小程序,在系統上電時開始執行,主要功能是初始化硬件設備、准備好軟件環境,最後調用操作系統內核。

Bootloader種類比較多,常見的X86上的有LILO,GRUB,ARM架構上比較有名的是U-boot,VIVI.  還有其他的RedBoot / Etherboot等

啟動Bootloader指令地址(ARM結構的cpu一般放在0x0000000地址處,而MIPS結構的CPU一般放在0xBFC00000)

Bootloader常見兩種操作模式:1。啟動加載模式(沒用戶介入) 2.下載模式(用戶命令操作)

Bootloader中典型分區結構圖:

*Bootloader上電後第一個程序。

*Boot parameters分區中一般存放一些可設置的參數,比如IP地址、串口波特率,要傳遞給內核的命令行參數。

*kernel,嵌入式板定制的內核,包含內核啟動參數

*Root filesystem文件系統,裡面包含了linux能夠運行的應用程序,和相關庫等。

@Bootloader的兩個階段了解

1.第一階段(使用匯編語言實現,依賴於cpu體系結構的初始化)

。硬件初始化(看門狗、RAM初始化等)

。為加載Bootloader的第二階段代碼准備RAM空間

。復制Bootloader的第二階段代碼到RAM空間中

。設置好棧

。調轉到第二階段代碼的入口點

2.第二階段(通常C語言實現,好處可讀性和移植性)

。初始化本階段要用到的硬件設備

。檢測系統內存映射(memory map)

。將內核映像和根文件系統系統映像從Flash讀到RAM內存中

。為內核設置啟動參數

 

@Bootloader與內核交互

Bootloader和內核交互是單向的,因為它們啟動有先後。

Bootloader傳遞參數給內核,有書說明:linux2.4.x後都是以數據結構:標記列表形式來傳遞啟動參數。

標記的數據結構為tag,由tag_header結構和 一個聯合union組成。如下:

  1. struct tag_header {  
  2. __u32 size;  
  3. __u32 tag;  
  4. ;  
 
  1. struct tag_mem32 {  
  2.     __u32   size;  
  3.     __u32   start;  /* physical start address */  
  4. };  
 
  1. struct tag {  
  2.     struct tag_header hdr;  
  3.     union {  
  4.         struct tag_core     core;  
  5.         struct tag_mem32    mem;  //內存標記   
  6.         struct tag_videotext    videotext;  
  7.         struct tag_ramdisk  ramdisk;  
  8.         struct tag_initrd   initrd;  
  9.         struct tag_serialnr serialnr;  
  10.         struct tag_revision revision;  
  11.         struct tag_videolfb videolfb;  
  12.         struct tag_cmdline  cmdline;  
  13.   
  14.         /* 
  15.          * Acorn specific 
  16.          */  
  17.         struct tag_acorn    acorn;  
  18.   
  19.         /* 
  20.          * DC21285 specific 
  21.          */  
  22.         struct tag_memclk   memclk;  
  23.     } u;  
  24. };  
Copyright © Linux教程網 All Rights Reserved