背景: 一個嵌入式linux系統從軟件的角度看通??梢苑譃樗膫€層次: 1、 引導加載程序。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。 2、Linux內核。特定于嵌入式板子的定制內核以及內核的啟動參數。 3、 文件系統。包括根文件系統和建立于Flash內存設備之上文件系統。通常用ramdisk來作為rootfs。 4、 用戶應用程序。特定于用戶的應用程序。有時在用戶應用程序和內核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。 一個嵌入式的存儲設備通常包括四個分區: 第一分區:存放的當然是u-boot 第二個分區:存放著u-boot要傳給系統內核的參數 第三個分區:是系統內核(kernel) 第四個分區:則是根文件系統。 Bootloader定義: Bootloader是在操作系統運行之前執行的一小段程序,通過這一小段程序,我們可以初始化硬件設備、建立內存空間的映射表,從而建立適當的系統軟硬件環境,為最終調用操作系統內核做好準備。意思就是說如果我們要想讓一個操作系統在我們的板子上運轉起來,我們就必須首先對我們的板子進行一些基本配置和初始化,然后才可以將操作系統引導進來運行。具體在Bootloader中完成了哪些操作我們會在后面分析到,這里我們先來回憶一下PC的體系結構:PC機中的引導加載程序是由BIOS和位于硬盤MBR中的OS Boot Loader(比如LILO和GRUB等)一起組成的,BIOS在完成硬件檢測和資源分配后,將硬盤MBR中的Boot Loader讀到系統的RAM中,然后將控制權交給OS Boot Loader。Boot Loader的主要運行任務就是將內核映象從硬盤上讀到RAM中,然后跳轉到內核的入口點去運行,即開始啟動操作系統。在嵌入式系統中,通常并沒有像BIOS那樣的固件程序(注:有的嵌入式cpu也會內嵌一段短小的啟動程序),因此整個系統的加載啟動任務就完全由Boot Loader來完成。比如在一個基于ARM7TDMI core的嵌入式系統中,系統在上電或復位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的Boot Loader程序。 U-boot: 常見的bootloader有:Redboot,ARMboot,U-Boot,Blob等,其中U-boot,全稱Universal Boot Loader,是由DENX小組的開發的遵循GPL條款的開放源碼項目,它的主要功能是完成硬件設備初始化、操作系統代碼搬運,并提供一個控制臺及一個指令集在操作系統運行前操控硬件設備。U-boot之所以這么通用,原因是他具有很多特點:開放源代碼、支持多種嵌入式操作系統內核、支持多種處理器系列、較高的穩定性、高度靈活的功能設置、豐富的設備驅動源碼以及較為豐富的開發調試文檔與強大的網絡技術支持。 U-Boot源代碼下載地址: 免費下載地址在 http://linux.linuxidc.com/具體下載目錄在 /pub/u-boot/ 用戶名與密碼都是www.linuxidc.com uboot官網:http://www.denx.de/wiki/U-Boot/WebHome; 飛思卡爾的芯片有自己的uboot源碼及編譯工程可供免費下載;
U-Boot—kernel 以飛思卡爾的imx6q為例: 燒錄入板子的文件有三個: uboot.bin; //由單獨的工程生成 boot.img; //實際==kernel + ramdisk + cmdline; system.img; //文件系統,與boot.img一起生成 其中cmdline來源于:M~~4.3_android/device/Q~i~s/q~i~s/BoardConfig.mk,
BOARD_KERNEL_CMDLINE := console=ttymxc0,115200 init=/init ~~~~~~~ androidboot.console=ttymxc0 androidboot.hardware=freescale bluetoothuboot通過解析BOARD_KERNEL_CMDLINE,setenv,生成bootargs傳遞給kernel。
Linux內核在啟動的時候需要一些參數,以獲得當前硬件的信息或者啟動所需資源在內存中的位置等等。這些信息可以通過bootloader傳遞給kernel,也可以kernel強制使用自己的cmdline。 1、kernel若是采用uboot傳遞的cmdline,需要M~~4.3_android/kernel_imx/arch/arm/configs/imx6_android_eng_defconfig下的
#CONFIG_CMDLINE_FORCE is not set2、kernel強制使用自己的cmdline,需要M636_JB4.3_android/kernel_imx/arch/arm/configs/imx6_android_eng_defconfig下的
CONFIG_CMDLINE="console=ttymxc0,115200 video=mxcfb0:dev=lcd,lcd_640x480_2,if=RGB24,bpp=32 video=mxcfb1:ldb,LDB-8PLCD if=RGB24,bpp=32 video=mxcfb2:off fbmem=30M vmalloc=400M init=/init androidboot.console=ttymxc0 androidboot.hardware=freescale ldo_active=off"# CONFIG_CMDLINE_FROM_BOOTLOADER is not set# CONFIG_CMDLINE_EXTEND is not setCONFIG_CMDLINE_FORCE=y //強制使用自己的cmdline運行時進入uboot的方式是運行到如下時敲回車鍵或者其他鍵,就會進入uboot,
##### PAD6_DDR_VERSION_ISSI_1G #####Net: got MAC address from IIM: 00:00:00:00:00:00FEC0 [PRIME]Hit any key to stop autoboot: 0可以輸入help查看支持的指令,若想繼續引導,可以輸入boot kernel指令。
參考:http://www.360doc.com/content/12/0913/12/9072830_235879252.shtml
新聞熱點
疑難解答