大家都知道硬件之上是軟件,本公眾號(hào)主要介紹“OS與AUTOSAR”,那么除了這兩種類型的軟件,是否還有別的軟件?本文以ARM SOC硬件為例,“打破砂鍋,問到底”,來看看還有哪些軟件我們沒接觸到,在OS之下和SOC硬件之上的,各種賣給我們底層軟件的廠商(一般都是SOC芯片原廠)所掩蓋的核心技術(shù),另外結(jié)合開源代碼進(jìn)行理解。
-
1.OS之下,SOC硬件之上有什么軟件?
-
我們?cè)诙ㄎ籓S的問題的時(shí)候突然一個(gè)SMC指令之后的代碼找不到了,代碼不在OS里面也不在u-boot里面,到底在哪里,之后的運(yùn)行又是什么,帶著這個(gè)問題,我們“打破砂鍋問到底”,看看到底怎么回事。
在之前的文章AUTOSAR入門-汽車電子構(gòu)架演進(jìn)(四) 未來已來,有一個(gè)NXP的汽車軟件方案圖,可以同時(shí)支持AP和BP,很經(jīng)典,我們回顧下:
可以看到標(biāo)識(shí)的是Firmware(固件),我們首先會(huì)想到這就像電腦里面的BIOS,焊在電腦主板上的一個(gè)存儲(chǔ)芯片,開機(jī)啟動(dòng)的時(shí)候,CPU尋址就會(huì)去執(zhí)行里面的代碼。那么這個(gè)東西的確是個(gè)軟件啊,有軟件就有代碼,有代碼就有開源的,來一起盤它。
NXP的圖,以功能為核心是給客戶看的,掩蓋了其使用ARM技術(shù)的細(xì)節(jié),也就是軟件實(shí)現(xiàn)的細(xì)節(jié),并不能直接反映ARM軟件的框架。然后重新起個(gè)高大上的模塊名字,好忽悠啊,我們直接來看ARM的特權(quán)級(jí)(重要:本文以下都是針對(duì)ArmA核):
這個(gè)圖了解ARM的都太熟悉了,EL(exception level)就是異常等級(jí),為什么會(huì)有異常等級(jí),那就是特權(quán)(privilege),不同的軟件有不同的特權(quán),EL0的特權(quán)最小,只能運(yùn)行App,EL3的特權(quán)是最大的,也就是說對(duì)所有硬件的訪問權(quán)限也是最大的。
ARMv8分為SecureWorld和Non-Secure World(NormalWorld),四種異常級(jí)別從高到低分別為EL3,EL2,EL1,EL0。
-
EL0:非安全態(tài)的Apps,安全態(tài)的Trusted Apps,EL0是無特權(quán)模式,所有APP應(yīng)用都在EL0。
-
EL1:非安全態(tài)的Normal world OS,安全態(tài)的Trusted OS ,EL1是一個(gè)特權(quán)模式,能夠執(zhí)行一些特權(quán)指令,用于運(yùn)行各類操作系統(tǒng)(例如Linux、FreeRTOS、TEE等)。
-
EL2:Hypervisor虛擬層
-
EL3:Secure Monitor,Arm trusted firmware安全固件,EL3具有最高管理權(quán)限,是一個(gè)微型的runtime系統(tǒng),為OS提供服務(wù),負(fù)責(zé)安全監(jiān)測(cè)和Secure World和Normal World之間的切換。
關(guān)于ARM體系結(jié)構(gòu)的基礎(chǔ)知識(shí)可以自己找資料看看。OS下面的軟件有Hypervisor和Securemonitor。Hypervisor是虛擬機(jī),后續(xù)有機(jī)會(huì)了介紹下,本文聚焦到Secure monitor。
Secure monitor到底是什么,如下圖中紅框中:
其中有U-Boot大家都比較熟悉,是一個(gè)bootloader, bootloader程序會(huì)先初始化 DDR等外設(shè),然后將 Linux內(nèi)核從 flash(NAND NOR FLASH SD MMC等 )拷貝到 DDR中,最后啟動(dòng) Linux內(nèi)核。后續(xù)有文章再詳細(xì)介紹。
這里我們看BL1、BL2、BL31、BL32、BL33是什么東西,下面介紹下ATF的概念:
ATF:Arm TrustedFirmware(ARM安全固件),運(yùn)行在EL3異常級(jí)別,ATF為Armv7-A 和 Armv8-A提供了一些安全可信固件。具體包括上面說的:ATF= BL1、BL2、BL31、BL32、BL33,其中BL33有就是U-Boot。都運(yùn)行在EL3模式。具體為:
BL1:也叫bootrom,rom的意思就是只讀的,具有最高的執(zhí)行權(quán)限EL3,在 CPU 出廠時(shí)就被寫死了。為什么要寫死,這里有一個(gè)安全驅(qū)動(dòng)概念(Secure Boot)。CPU上電啟動(dòng)的時(shí)候,加載鏡像的順序?yàn)锽L1 -》 BL2 -》 BL31 -》 BL32 -》BL33(uboot)-》OS(Linux),但是如果其中的一個(gè)鏡像被換掉了怎么辦?這里不是說網(wǎng)絡(luò)攻擊換掉,就是物理上拿到電路板,然后把存儲(chǔ)SD卡拔掉換了自己的OS,那不是想干啥就干啥,完全控制了硬件設(shè)備,俗稱“越獄”。答案就是沒一個(gè)鏡像進(jìn)行簽名校驗(yàn)。
例如BL33加載OS,需要OS鏡像算出hash利用私鑰加密,然后BL31在加載OS的時(shí)候會(huì)讀取這個(gè)加密的Hash,利用自己的公鑰解密,解密后的hash是對(duì)的就進(jìn)行加載。那么這么一級(jí)一級(jí)按照加密向前傳遞,那第一個(gè)根BL1如果可以在SD卡上偽造,那校驗(yàn)就沒用了。所以BL1需要只讀,并且作為只讀硬件直接搞進(jìn)到CPU里面,你從板子上也拆不下來,更替換不了。因?yàn)橐獙懰赖紺PU內(nèi)部,所以獨(dú)立出來了,也是其由來的原因。
BL2:BL2在flash中的一段可信安全啟動(dòng)代碼,主要完成一些平臺(tái)相關(guān)的初始化,比如對(duì)ddr的初始化等。因?yàn)锽L31和BL32是一個(gè)runtime,也就是上電后一直運(yùn)行的程序,那么需要加載到內(nèi)存里面,需要先初始化內(nèi)存ddr,BL2就干這個(gè)事情的。所謂的Loder。
BL31:作為EL3最后的安全堡壘,它不像BL1和BL2是一次性運(yùn)行的。如它的runtime名字暗示的那樣,它通過SMC指令為Non-Secure OS持續(xù)提供設(shè)計(jì)安全的服務(wù),在Secure World和Non-Secure World之間進(jìn)行切換。是對(duì)硬件最基礎(chǔ)的抽象,對(duì)OS提供服務(wù)。例如一個(gè)EL3級(jí)別的特權(quán)指令,比如關(guān)機(jī)、休眠等OS是無權(quán)處理的,就會(huì)交給BL31來繼續(xù)操作硬件處理。
BL32:是所謂的secure os,運(yùn)行在Secure mode。在ARM平臺(tái)下是ARM 家的 Trusted Execution Environment(TEE)實(shí)現(xiàn)。OP-TEE 是基于ARMTrustZone硬件架構(gòu)所實(shí)現(xiàn)的軟件Secure OS。
一般在BL32會(huì)運(yùn)行OPTee OS + 安全app,它是一個(gè)可信安全的OS運(yùn)行在EL1并在EL0啟動(dòng)可信任APP(如指紋信息,移動(dòng)支付的密碼等),并在Trust OS運(yùn)行完成后通過SMC指令返回BL31,BL31切換到Non-Seucre World繼續(xù)執(zhí)行BL33。關(guān)于OPTEE和Secure mode及TurstZone的機(jī)制,有機(jī)會(huì)再寫一個(gè)文章介紹。
BL33:這里就是Normal Wrold了,運(yùn)行的都是非安全固件,也就是我們常見的UEFI firmware或者u-boot,也可能是直接啟動(dòng)Linux kernel。
啟動(dòng)BL1,BL2,BL31,BL32則是一個(gè)完整的ATF信任鏈建立流程(ARM Trusted Firmware),像常見的PSCI(Power State Coordination Interface)功能則是在ATF的BL31上實(shí)現(xiàn)。對(duì)基本概念有認(rèn)識(shí)了后,你就知道OS之下還有的這些軟件通常稱為ATF,其啟動(dòng)流程如下:
詳細(xì)為:
2. ATF代碼下載編譯運(yùn)行
2.1 ATF代碼下載編譯
ATF代碼下載:
git clone https://github.com/ARM-software/arm-trusted-firmware.git
ATF代碼編譯:
makeCROSS_COMPILE=aarch64-linux-gnu-PLAT=qemuDEBUG=1all
編譯完成后在arm-trusted-firmware/build/qemu/debug目錄下生成bl1.bin、bl2.bin、bl31.bin。
ATF的BL33使用的u-boot,代碼下載:
git clone https://source.denx.de/u-boot/u-boot.git
編譯:
cd u-boot
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make qemu_arm64_defconfig
make -j8
編譯完成后在當(dāng)前目錄下生成u-boot.bin。
2.2 qemu運(yùn)行ATF
首先需要qemu,執(zhí)行
qemu-system-aarch64 –version
看下系統(tǒng)是否安裝過,如果沒安裝過,需要安裝:
git clone https://git.qemu.org/git/qemu.git
cd qemu
--target-list=aarch64-softmmu --prefix=
make -j8
sudo make install
有了qemu,然后新建一個(gè)run目錄,把各個(gè)鏡像軟連接進(jìn)來:
mkdir run
cd run
ln-s ~/arm/arm-trusted-firmware/build/qemu/debug/bl1.binbl1.bin
ln-s~/arm/arm-trusted-firmware/build/qemu/debug/bl2.bin bl2.bin
ln-s ~/arm/arm-trusted-firmware/build/qemu/debug/bl31.binbl31.bin
ln -s ~/arm/u-boot/u-boot.bin bl33.bin
在run目錄執(zhí)行命令:
qemu-system-aarch64-nographic-machine virt,secure=on
-cpu cortex-a53
-smp 2 -m 2048
-d guest_errors,unimp
-bios ./bl1.bin
-semihosting-config enable=on,target=native
可以看到u-boot已經(jīng)啟動(dòng)了,我們輸入u-boot支持的version命令會(huì)有輸出。
這里主要分析ATF,qemu只加載了ATF包括u-boot。如果想一塊加載Linux可以參考:https://zhuanlan.zhihu.com/p/521196386
-
ARM
+關(guān)注
關(guān)注
134文章
9111瀏覽量
368034 -
OS
+關(guān)注
關(guān)注
0文章
91瀏覽量
34778 -
軟件
+關(guān)注
關(guān)注
69文章
4973瀏覽量
87734
原文標(biāo)題:ARM ATF入門-安全固件軟件介紹和代碼運(yùn)行
文章出處:【微信號(hào):OS與AUTOSAR研究,微信公眾號(hào):OS與AUTOSAR研究】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論