爲什麼需要bootloader 實現雙系統 刷機 配置CPU 升級操作系統 U盤系統
bootloader 目的,加載OS 是一類 軟件的統稱
設備: bootloader os fs
你可以把bootloader當成 一個 單任務的 單片機程序
啓動CPU --> 硬件初始化 --> [交互模式] --> 加載OS
過程:
彙編[開機啓動 -->核心硬件初始化(串口 flash RAM CPU) --> 設置堆棧]
C[ 大部分硬件初始化(網卡,SD卡 USB…)–>交互模式–>加載OS ]
不同的板子 不同的芯片 代碼都不一樣,所以 需要對每款板子都要定製 bootloader
bootloader種類
系統 | BootLoader | 界面 | 功能 | 大小 | 領域比例 |
---|---|---|---|---|---|
PC | bios/UEFI | UI界面 鼠標鍵盤支持 | 支持顯示屏網卡 | 功能強大 | 300MB |
安卓 | recovery | UI界面 | 功能簡單 | 5M | 99% |
嵌入式 | u-boot | 字符界面/命令行 | 功能基本夠用 | 200KB | 嵌入式90% |
如何使用u-boot
1、命令:
printenv 查看環境變量
setenv 環境變量名 值 :##setenv bootdelay 5
如果環境變量名字不存在,則創建該 環境變量
如果值爲空,那麼 則刪除該環境變量
saveenv 將你修改的環境變量保存到flash中.
tftp 下載地址 文件名 前提是 ipaddr serverip 都要制定好
bootm: bootm os地址 dtb地址 fs地址
go : 地址,運行程序
ping ip地址:
2、環境變量: printenv 查看環境變量
baudrate=115200 波特率
bootargs=root=/dev/nfs nfsroot=192.168.3.193:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.3.244
bootcmd=tftp 41000000 uImage; tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
bootdelay=5 進入交互模式的延時
ethact=dm9000
ethaddr=11:22:33:44:55:66 01:34:23:39:11:24
fileaddr=41000000
filesize=26D213
ipaddr=192.168.3.244 ip地址,板子的ip地址 netmask=255.255.255.0 子網掩碼,板子的
serverip=192.168.3.193 服務器的ip地址 [ tftp ]
stderr=serial
stdin=serial
stdout=serial
Environment size: 452/16380 bytes
u-boot如何啓動操作系統
1、告訴u-boot如何去啓動,你在哪裏告訴u-boot如何啓動呢??? bootcmd環境變量裏面
set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\; bootm 41000000 - 42000000
2、uboot 每次啓動, 如果沒有進入交互模式, 會 按照bootcmd裏面的指示,去 加載系統.
3、如何告訴內核,文件系統在哪裏
set bootargs root=/dev/nfs nfsroot=192.168.2.29:/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.2.234
root=/dev/nfs: 告訴內核文件系統的類型, 是=nfs
nfsroot=192.168.2.165:/home/lsf/src/rootfs rw
console=ttySAC2,115200 波特率
ip=192.168.3.244 指定內核起來之後,使用的ip地址
u-boot源碼
從FAE哪裏獲取. 頂層目錄: 在該目錄下可以看到 uboot所有的源碼 後續的編譯 查找 都是從該目錄開始.
平臺相關: 不同的芯片 不同的板子 他們的初始化代碼 配置文件 都不一樣.
arch /cpu 平臺: 裏面 存放不同的 cpu的 初始化 代碼
board: 存放不同板子的代碼. 每個板子 都有一個自己的 目錄源碼
配置 可以控制整個u-boot源碼的編譯過程 ########通過修改配置文件,可以控制u-boot##########
存放在 include/configs/板子名字.h
裏面都是一堆的宏定義/宏參數: 這些宏定義 決定了 u–booot源碼的編譯動作
平臺無關: 一些命令 網絡協議 環境邊境 工作環境,不隨着 芯片 板子的不同而不同,
編譯
1、配置,告訴u-boot你想編譯 哪一個板子的
make 板子名字_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
默認x86 默認gcc
2、編譯
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
結果,在頂層目錄生成 u-boot.bin bin:binary 二進制,可以直接燒寫到flash中去執行的.
3.清空
make distclean
認識u-boot源碼
彙編: 開機啓動 初始化核心硬件 自拷貝 設置堆棧
C: 大部分硬件初始化 [交互模式] 加載os
讀代碼,目的: 移植做準備,你需要關注 board 配置目錄.
第一段代碼: arch/arm/cpu/armv7/start.S b reset
b reset: 初始化 CPU, 切換到svc,關閉中斷
–>bl cpu_init_cp15 初始化RAM相關的: 關閉緩存 關閉MMU
–>bl cpu_init_crit --> b lowlevel_init 實現在板子裏面 在 board/samsung/origen/lowlevel_init.S 描述了 板子的相關 模塊初始化,這裏面的代碼,你是可以改的.
–>b _main @@arch/arm/lib/crt0.S
1)初始化棧 ,爲C做準備
2)b board_init_f @@arch/arm/lib/board.c 執行大部分硬件初始化 ,會調用 我們板子的 代碼實現的函數 board/samsung/origen/origen.c
3)回到彙編, 執行 自拷貝, 將後續的代碼全部拷貝到 RAM中,然後跳轉到 RAM去執行.
4) ldr pc,=board_init_r @@arch/arm/lib/board.c for(;;) { main_loop(); //進入交互模式 + 加載OS }
u-boot 簡單的移植
u-boot移植,相對 還是簡單. 因爲大部分外設不需要 關心, 重點需要 關注核心板上的
改動的地方: fs4412 <— origen
板子代碼: board 每一個板子都不一樣,所以每個板子都需要有自己目錄
配置部門: include/configs 每個板子配置都不一樣,所以每個板子都要有自己配置文件
1、 拷貝板子 相關代碼
cp board/samsung/origen board/samsung/fs4412 -a
mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c 修改 board/samsung/fs4412/Makefile, 將 origen.o 替換爲 fs4412.o
2、 配置文件
cp include/configs/origen.h include/configs/fs4412.h
3、修改boards.cfg 裏面記錄了 某個板子的 詳細信息,包括 cpu 公司 配置文件 …
每次 make xxx_config
,都會去查找 boards.cfg ,找到該板子xxx的詳細信息
模擬origen, 增加一行 fs4412 arm armv7 fs4412 samsung exynos
4、編譯
make fs4412_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-