一梧躺,前言
因為學(xué)了uboot的啟動流程和kernel的啟動流程奥吩。為了檢驗自己的理解及靈活運(yùn)行,那么我就想到做一個uboot支持雙系統(tǒng)啟動构拳。我的文件系統(tǒng)一樣咆爽,只是kernel版本不同梁棠。
其實也可以再分個區(qū)做文件系統(tǒng)備份,就變成了具備系統(tǒng)還原功能了伍掀,mmc寫入數(shù)據(jù)掰茶,我的tf卡是老卡比較慢,這個就不嘗試了蜜笤。
二濒蒋,雙系統(tǒng)切換設(shè)計思路
先要有一個flag來區(qū)分到底引導(dǎo)哪個zImage及dtb。而引導(dǎo)的zImage和dtb名字若一樣的話需要放不同分區(qū)把兔,為了簡單起見沪伙,我就放同一個分區(qū),不常用的老版本boot就修改名字添加后綴1县好。
然后就是這個flag應(yīng)該保存在哪里围橡,用哪種方式識別的問題了。網(wǎng)上參考了下是放在自定義的新分區(qū)中缕贡,通過echo>"xx" /dev/sdb3等命令來設(shè)置flag翁授,而uboot代碼中直接通過mmc讀取地址中的內(nèi)容到ram中。這個方法我嘗試了晾咪,主要是mmc無法通過命令mmc dev 0 3切換到我的分區(qū)收擦。我按我的應(yīng)用需求的話,flag完全可以放入環(huán)境變量中的呀谍倦!
步驟1:自定義環(huán)境變量
setenv mybootflag "new"或setenv mybootflag "old"
saveenv
print mybootflag
步驟2:修改uboot添加判斷條件來引導(dǎo)不同kernel
/studybr/u-boot-2020.10-rc4工程中
c代碼修改塞赂,在autoboot.c的autoboot_command函數(shù)中一開始就添加
/* start add by applecai */
char *st = env_get("mybootflag");
if (st && !strcmp(st, "new"))
{
env_set("bootcmd", "mmc dev 0; fatload mmc 0:1 82000000 zImage;fatload mmc 0:1 88000000 am335x-boneblack.dtb; bootz 82000000 - 88000000;"); //use old one
}
else
{
env_set("bootcmd", "mmc dev 0; fatload mmc 0:1 82000000 zImage1;fatload mmc 0:1 88000000 am335x-boneblack1.dtb; bootz 82000000 - 88000000;");//use new one
}
/* end add by applecai */
步驟3:驗證通過
需要切換啟動kernel時候,按空格昼蛀,修改環(huán)境變量mybootflag后宴猾,通過reset重啟。設(shè)置new為啟動5.4.61是我當(dāng)前主要使用的叼旋。設(shè)置old為啟動之前buildroot自帶的4.19.59