• 正文
    • 一、IVT(Image Vector Table)
    • 二、Boot data
    • 三、DCD
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動(dòng)流程分析之boot ROM階段

05/28 15:14
233
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

CPU上電之后執(zhí)行的第一段代碼并不是uboot代碼,因?yàn)閡boot存儲(chǔ)在啟動(dòng)介質(zhì)(存儲(chǔ)介質(zhì)),如eMMC Flash、NAND Flash、SD卡,CPU想要執(zhí)行啟動(dòng)介質(zhì)中的uboot代碼,就需要將uboot代碼從啟動(dòng)介質(zhì)取出,加載到內(nèi)存中去執(zhí)行。那么就需要某個(gè)程序來做這些工作。i.MX6ULL內(nèi)部有一塊ROM,存儲(chǔ)著一段代碼,這部分代碼是SOC設(shè)計(jì)時(shí)實(shí)現(xiàn)的,上電后會(huì)首先運(yùn)行,uboot的引導(dǎo)就由這段代碼實(shí)現(xiàn),我們稱這段代碼為boot ROM。boot ROM會(huì)去讀取設(shè)置好的硬件啟動(dòng)信息(硬件啟動(dòng)信息一般通過撥碼開關(guān)進(jìn)行配置,不同的引腳電平,對(duì)應(yīng)不同的啟動(dòng)模式,不同的啟動(dòng)介質(zhì),關(guān)于啟動(dòng)這部分內(nèi)容可以去參考硬件手冊(cè)),判斷啟動(dòng)介質(zhì),然后初始化內(nèi)存以及啟動(dòng)介質(zhì),最后讀取uboot代碼程序到內(nèi)存中開始運(yùn)行,因此boot ROM需要做這么幾個(gè)工作:CPU初始化,時(shí)鐘初始化,內(nèi)存初始化,啟動(dòng)介質(zhì)初始化,加載uboot程序并執(zhí)行。

將uboot程序從啟動(dòng)介質(zhì)加載到內(nèi)存中是boot ROM完成的,所以boot ROM就需要知道,從哪里拷貝程序,程序有多大,拷貝到哪里。這些信息都存儲(chǔ)在啟動(dòng)介質(zhì)起始的一片區(qū)域,boot ROM從此區(qū)域獲取到這些信息后,才進(jìn)行后續(xù)的加載工作。因此,我們燒寫到啟動(dòng)介質(zhì)上的鏡像文件,除了應(yīng)用程序uboot.bin本身,還需要包含一些額外的頭信息,配合boot ROM的工作。這些額外的頭信息,包括IVT、Boot data、DCD(Device Configuration Data)。

所以一個(gè)完整的鏡像主要由IVT(Image Vector Table offset)、Boot Data、DCD(Device Configuration Data)、User code and data(Application+CSF)幾部分組成,如下圖的左半部分。

一、IVT(Image Vector Table)

IVT(Image Vector Table)是一個(gè)統(tǒng)一格式的structure,其原型如下面結(jié)構(gòu)體所示,從結(jié)構(gòu)體定義我們得知,IVT中記錄了Boot data、Application、DCD、CSF以及IVT本身在內(nèi)存中的位置信息:

這些信息對(duì)boot ROM加載啟動(dòng)至關(guān)重要。IVT大小固定為32byte,其在Bootable image中的偏移位置也是固定的,例如對(duì)于eMMC版,IVT在eMMC中的偏移地址為1Kbyte=0X400 bytes。其他啟動(dòng)介質(zhì)如下圖:

二、Boot data

Boot data也是一個(gè)structure,其組成如下圖所示:

BD(Boot data)中記錄了Bootable image的起始地址與總長度。BD大小固定為16byte,BD信息雖然記錄在了IVT中,但其在Bootable image中的偏移位置并不是任意的,BD是緊挨著IVT的。

三、DCD

CPU上電之后,在進(jìn)入uboot之前,需要對(duì)內(nèi)存進(jìn)行初始化,以便將uboot從啟動(dòng)介質(zhì)引導(dǎo)到內(nèi)存中。這些外設(shè)的一些初始化配置信息就存儲(chǔ)在DCD中。下面這個(gè)表就是可以在DCD中可配置的一些寄存器地址范圍,從表中看出,DCD區(qū)域中不僅可以初始化內(nèi)存,也可以對(duì)其他的一些外設(shè)或者其他功能進(jìn)行初始化:

四、User code and data

User code就是我們的app即uboot.bin程序,data指的是CSF,certificates and signatures,跟安全啟動(dòng)相關(guān)的簽證證書信息,目前沒有用到,這里不再講解。boot ROM在完成一些初始化工作之后,將uboot.bin加載到內(nèi)存指定地址中,最終跳轉(zhuǎn)到該地址執(zhí)行uboot.bin,此時(shí)boot ROM生命周期結(jié)束,開啟uboot生命周期。

相關(guān)推薦