關於RISC-V啓動部分的思考~

1.本文說明

RISC-V的架構有着非常鮮明的特點,如果看過arm,aarch64,mips等架構的一些架構手冊的基礎知識,再看RISC-V的芯片的架構設計,就會覺得非常有意思,可以找到一些影子,但是又比這些架構設計簡潔的多。當我看完aarch64的芯片手冊,再看RISC-V的boot時,設計思想竟然可以做一些對比,同樣去看RISC-V和mips的寄存器,也可看到高度的一致性。對於x86的架構我未曾深入瞭解,但是在risc-v上應該也可以找到一些設計元素。總體說來,RISC-V的架構設計集合了各種架構的設計的優點。我突然覺得這種堆疊即模塊的設計思想,在當前IoT物聯網發展的如火如荼的時代又要被賦予最新的使命了。我十分看好RISC-V的設計思想,也期待着與軟件界的Linux一樣,發展的繁榮昌盛。

1.1 RISC-V的誕生的時代背景

RISC-V至誕生之日起,就賦予了良好的設計模式,吸收了大量的arm、x86、以及mips中良好的設計基因,將過時指令設計的與架構設計中的坑都避免了。這幾十年的芯片的發展過程中,不少的芯片架構都曾因爲設計問題消失在歷史長河中,有着曾經一度輝煌的sparc,還有當時被十分看好的mips。如今市場上最熱門的就屬x86和arm了,一個主打移動市場,一個主打pc市場,兩個在芯片架構的市場上發展的如火如荼。

然而,兩個巨頭都牢牢的把控着核心技術的門檻,用arm必須去買ip授權,以及x86的交叉授權模式等等。這些都讓很多崇尚開源的人看不下去了。那麼設計芯片的指令集很難麼?設計芯片的指令並非難事,這要很多人使用纔行,因爲芯片上需要搭載操作系統,需要去運行各種各樣的軟件,比如瀏覽器、數據庫、辦公系統、專業軟件等等。這些適配工作投入的精力和難度恐怕是需要集結各國最強的研發實力才能發展完善的。而risc-v就有這個魔力,竟然可以一呼百應,大概是大家受到arm與因特爾的壓迫已經很久了,大家都想自己造芯片玩玩。

arm與x86架構由於時間累計的問題,都積累了大量的指令集,x86當時誕生時不過80條指令,而今也有着上千條指令集了,各種複雜的指令集,多媒體指令集等等,使得寫底層軟件的人苦不堪言。喬布斯有句名言:至繁歸於至簡。歷史遺留的問題既然不能克服和解決,那就乾脆抽取精華,設計出一個優秀的架構出來,於是risc-v在這種時代背景下開始了其新的使命。

1.2 發展現狀

新事物的崛起,必會引來衆多人的圍觀,技術的風所到之處,均是機會的影子。

而今risc-v已經成爲衆多大學生積極學習的課程,各大公司也已經啓動了預研和探索的腳步。

RISC-V雖仍是星星之火,卻已現出燎原之態。

2.RISC-V 的芯片boot過程

2.1 RISC-V的啓動模式

在理解RISC-V的boot流程之前,首先需要知道的是RISC-V設計的三種模式:

  • M-mode(Machine Mode)

  • S-mode(Supervisor Mode)

  • U-mode(User Mode)

對於arm64來說,系統上電後啓動會處於EL3 secure world ,所以對於arm64來說,一般都會使用ARM Trusted firmware (TF-A)  在normal world EL2 與 secure EL3  進行切換。

而對於RISC-V來說,系統上電啓動後會在M-Mode,而RISC-V目前是沒有Hypervisor這一層的概念的,所以目前採用的是opensbi。

2.2 RISC-V的啓動順序

對於標準的RISC-V啓動順序,可查看FU540的芯片手冊,其中有如下的順序描述:

MSEL(Mode Select):啓動模式,一般爲選擇撥碼開關等方式進行選擇。

ZSBL (Zeroth Stage Boot Loader):片上ROM程序。

FSBL(First Stage Boot Loader ):啓動PLLs和初始化DDR內存。

BBL(Berkeley Boot Loader  ):提供加載,並且管理着二進制接口(SBI)。

下面詳細分析一下FU540的啓動流程。

復位向量表

當芯片上電後,當芯片有33.3MHz外部晶振時鐘時,所有的核會跳轉到地址0x1004地址處去執行程序。

程序會根據MSEL選擇,選擇如下的跳轉地址:

Zeroth Stage Boot Loader (ZSBL)

零級引導程序加載會從GUID分區中下載更加複雜的FSBI,一般都是QSPI的flash或者sd卡中下載FSBI,然後將該程序放到地址0x08000000處,至於從哪個介質查找FSBI,可以看到如下的選項:

The First Stage Boot Loader (FSBL)

該執行的地址位於L2 LIM,也就是地址0x08000000。該程序的目的是DDR初始化後,將系統在DDR中執行起來。

  • 切換頻率到1GHz。

  • 配置ddr pll,外設時鐘和控制器等等。

  • 拷貝設備樹和SBI固件到DDR中。

  • 跳轉到0x80000000開始執行程序。

Berkeley Boot Loader (BBL)

Berkeley引導加載程序(BBL)從位於0x8000_0000的DDR執行。它負責提供管理器二進制接口(SBI)以及模擬所需的任何RISC-V不是由芯片本身實現的指令。該接口可以爲Linux等其他的os提供調用接口。

3.什麼是SBI?

SBI的全稱是RISC-V Supervisor Binary Interface 。它提供了risc-v標準的S-mode OS與Supervisor Execution Environment (SEE)  接口。

一般來說,操作系統都不會直接管理硬件資源,會通過SBI去調用到M-mode。

4.什麼是opensbi

簡單的說,opensbi就是一個開源的RISC-V虛擬化二進制接口的通用的規範。

使用的是BSD-2的開源協議,也就是任何人都可以隨意修改和使用,也提供了通用的規範化的接口實現。

這裏就需要理解一下爲什麼需要規範化了。

以往芯片廠家都會按照自己的啓動規則定義一些啓動的流程,比如有些需要SPL+UBOOT,有些可以是直接從SPI或SD卡中boot,這些啓動的規則很多,每當使用一款芯片,都需要去理解其啓動的流程,十分的複雜。於是就出現了一些規則和定義。

比如蘋果公司定義了個人PC電腦的規則:

又比如Linux定義了設備規則等等:

而RISC-V雖然目前芯片種類少,但是也需要制定一些啓動規則,於是有了下面的規則:

當有了opensbi後,再回頭看啓動流程,與aarch64之間進行一個對比:

aarch64藉助atf框架,從EL3跳轉到EL1,並啓動u-boot。

對於RISC-V,上圖是一個標準的加載啓動流程,其中Opensbi提供了M模式的運行時庫。

5.openSBI call接口的實現

opensbi不僅僅具有加載和引導功能,也能夠供S-Mode的OS使用,比如提供串口控制檯或者中斷的分發等等。調用方式可以通過ecall來實現。類似於syscall的實現規則。當前階段實現了下面的接口:

詳細可以看下面的官方文檔描述。

https://github.com/riscv/riscv-sbi-doc/blob/master/riscv-sbi.adoc

6.總結

RISC-V的啓動規範可以按照opensbi的接口實現來自行定義,芯片廠家也可以通過適配opensbi的接口來實現平臺通用化的移植,這樣將會大大簡化上層設計的複雜度。同時規範化的啓動流程對於使用者來說更加的友好。相信在這種規範化的模式下,RISC-V的設計將會越來越完善。


1.楊福宇專欄 | 新車用CAN FD,你可能還會被忽悠!

2.中芯國際深夜大瓜:蔣尚義回來梁孟松要走?

3.美國再發實體清單,北理、南航、南理工上榜,“國防七子”終於齊了!

4.分析:全球性芯片缺貨超乎想象

5.Windows 擁抱 Android,微軟在下怎樣的一步棋?

6.散裝vs批發誰效率高?變量訪問被ARM架構安排的明明白白

免責聲明:本文系網絡轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯繫,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章