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