UBOOT引導Linux核心及向核心傳遞引數的方式

2021-06-16 04:28:45 字數 929 閱讀 3287

一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。

在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導「uboot格式」的核心。先花點時間了解一下什麼是「uboot格式」的核心吧:用uboot自帶的mkimage命令生成的核心稱為"uboot"格式的核心。以下面這條命令為例:

mkimage -n "kernel 2.4.18" -a arm -o linux -t kernel -c none -a 30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img

其中與核心引導最密切的是-e 30008000,也就是核心的入口位址。其它引數可以參考幫助資訊。其它uboot格式的核心與原來相比,只是進行(可選)了壓縮,並在前面加了乙個0x40大小的頭。這個頭里放了核心的位置(0x30007fc0)和入口位址(0x30008000)和其它資訊。

bootm命令執行時,先對頭部資訊等進行校驗,然後把頭資訊放到乙個結構裡面。最後根據核心型別呼叫相應的啟動函式。對於linux而言就是do_bootm_linux,在啟動函式裡面,有這麼乙個操作:thekernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);,這是最關鍵的乙個操作,將核心的入口位址0x30008000賦給了thekernel,在啟動函式的最後,使用thekernel (0, bd->bi_arch_number, bd->bi_boot_params);啟動核心。

根據傳參規範,三個變數分別用r0,r1,r2傳給核心,這樣就巧妙地利用了函式指標進行了引數傳遞,實在是精妙!

上面講完了核心的引導及傳參,需要引起注意的就是在使用mkimage命令生成核心時,-e後面的位址要比-a後面的位址偏移0x40,原因很簡單,就不在細說了。

UBOOT引導Linux核心及向核心傳遞引數的方式

一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導 uboot格式 的核心。先花點時間了解一下什麼是 uboot格式 的核心吧 用uboot自帶的mkimage命令生成的核心稱為 ubo...

u boot引導核心及引數傳導

uboot實現了傳遞dtb的功能,define config of libfdt使能裝置樹 i.mx6ul實現方式 if defined config sys boot nand define config extra env settings config mfg env settings pan...

記錄u boot不能引導核心的解決過程

問題還沒有解決,記錄一下吧。一發來郵件求助,說是移植的u boot啟動不了核心,是2013.7版本的,移植到s5pv210上的。我之前移植的2013.1版本的沒有問題的。一開始覺得不是什麼事,從以下幾個方面查了 a.傳引數 機器碼 b.記憶體初始化 c.檢查拷貝到記憶體中的kernel是否完整 但是...