一、uboot常用命令與環境變量
1.命令:
(1)環境變量操作命令
命令 | 功能 | 格式 |
printenv | 查看環境變量 | printenv |
setenv | 新建/修改環境變量 | setenv 環境變量名 環境變量值 |
saveenv | 保存環境變量 | saveenv |
(2)內存操作命令
命令 | 功能 | 格式 | 示例 |
md | 顯示內存值 | md[.b,.w,.l] address [#of objects] | md.b 80000000 14 |
nm | 修改指定地址的內存值 | nm[.b,.w,.l] address | nm.l 80000000 |
mw | 使用個指定的數據填 充一段內存 | mw[.b,.w,.l] address value [count] | mw,l 80000000 0A0A0A0A 10 |
cp | 數據拷貝命令 | cp[.b,.w,.l] source target count | cp.l 80000000 80000100 10 |
cmp | 比較兩段內存數據是否 相等 | cmp [.b,.w,.l] addr1 addr2 count | cmp.l 80000000 80000100 10 |
(3)網絡命令
(4)mmc操作命令
注意:千萬不要寫SD卡或者EMMC的前兩個塊(扇區),里面保存著分區表!
(5)boot命令
分區表
room固件 = 分區表
二、工程管理Makefile
1.語法
要生成的文件 : 依賴的所有文件
? ? ? ? 生成的方式
2.步驟
make - > Makefile \makefile -> 尋找文件中要生成的目標a.out - >尋找以來的所有的文件 - > 存在就利用命令生成目標文件、不存在,Makefile向下尋找依賴文件的生成方式
3.符號說明
- :=? ? ?覆蓋原來的值
- ?=? ?如果原來沒有值,就賦新值,原來有值,不賦新值??
- +=? ?原來值的基礎上新加一個值
偽指令:.PHONY
示例代碼
4.分類處理(不同的平臺)
條件編譯1
????????
gcc main.c -D
makefile傳參
三、Uboot
1.Uboot編譯
?(1)uboot(跨平臺)作用
- ? ? ? ??初始化硬件設備
- ????????為加載內核做準備
(2)使用宏實現條件編譯,滿足條件的加入編譯中,不滿足的從編譯中去除
? ? ? ? 最頂層目錄.config 配置文件(宏的配置,如果宏配置到該文件中,則代碼加入uboot編譯);
(3)make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
? ? ? ? 當前平臺為ARM,工具鏈為arm-linux-gnueabihf-,開啟16核編譯
????????ubootuboot.bin ->uboot.imx
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean? ? ? ? ? ? ? ? //清除.configmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-? ?mx6ull_alientek_emmc_defconfig????????//按照板子默認的來make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16? ? ? ? //生成。bin文件
2.Linux系統啟動流程
Uboot第一階段:在芯片內部SRAM進行
(1)開發板上電,加載0x0地址,IMX6ULL96k出廠固件代碼(ROM),會根據啟動方式將對應的存儲設備前面的一段uboot代碼加載到RAM中執行
(2)出廠固件代碼以及uboot通過IMX6uLL內部的RAM;只能完成簡單操作
(3)對外設初始化(初始化DDR和EMMC)
(4).將IMX6ULL 96K ROM固件代碼搬移到 DDR中運行
Uboot第二階段:可對代碼進行運行,實現與用戶的交互
(5)外設逐一初始化
(6)進入與用戶交互的系統中,等待用戶按下按鍵
(7)如果用戶不操作uboot,倒計時結束后,會執行bootcmd
(8)引|導啟動內核 ( 需要串口、需要網口、文件系統的方式及路徑、需要設備樹... )
內核啟動階段:(加載驅動和五大功能實現的展開)
(9)內核啟動執行init進程 ( 0號內核進程 ,掛載文件系統)
Linux系統用戶態
(10)啟動用戶進程(fork+exec)啟動所有的進程
(11)啟動終端(可以與用戶實現交互
三、內核與設備樹文件
1.步驟
(1)源碼解壓
(2)進入源代碼中
(3)編譯生成.bin
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean //清楚之前編譯的文件
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig //以這次的imx_alientek_emmc_defconfig的設置作為.config設置,.config決定了額那些代碼加入編譯、那些嗲嗎從編譯中去除
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig //用戶可以通過界面自行選擇或者修改.config
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16? ? ? ? ?//編譯-J16
(4)編譯完成后可以獲得設備樹文件和內核鏡像文件
????????設備樹文件:????????arch/arm/boot/dts/imx6ull-alientek-emmc.dtb
????????內核鏡像鏡像:????????arch/arm/boot/zImage
(5)將以上兩個文件(內核鏡像、設備樹文件)拷貝到 ~/tftpboot
2.make menuconfig
* 驅動項 | 編譯生成的zImage中包含該驅動項 | 驅動(靜態加載) |
M 驅動項 | 編譯生成的zImage中不包含該驅動項,該驅動將會成為一個獨立的模塊 | 驅動(動態加載) |
(1)打開圖像界面 - > 圖形界面的配置項(根據Kconfig中語法解析得到)
Kconfig決定了menuconfig中有哪些選項,make menuconfig可以寫進.config
(2)勾選/去除/模塊選擇編譯目標 -> 根據用戶勾選將對應的宏寫入.config? ? ? ? 宏名 = y/m
(3)make -j16編譯的時候,頂層的makefile會調用每一層的makefile,每層makefile都會根據.config中的宏的配置決定哪些.o文件加入編譯,哪些.o文件不加入編譯 ---> vmlinux(可以調試的內核,體積很大)->Image(對vmlinux壓縮后的鏡像文件) ----> zImage(添加解壓算發的Image)
四、文件系統
1.文件系統生成工具
- busybox:最核心最簡單,如果需要下載,需要自己搭建
- buildboot:
- yacto
2.流程
內核啟動后 ->掛載文件系統 ->執行linuxrc ->/etc/initab腳本(決定系統啟動執行哪些腳本、重啟執行哪些腳本、ctrlaltdel執行哪些腳本)->系統啟動執行 /etc/init.d/rcS腳本 ->設置環境變量、參數->掛載所有文件系統(mount-a)->執行/etc/fstab文件-> 掛載所有文件系統 ->/etc/profile腳本 ->啟動bash shell ->與用戶交互 ->./a.out ->fork+exec(./a.out)
3.自動啟動
把代碼放在/etc/profile 或者 /etc/init.d/rcS下,就可實現一啟動運行里面代碼;