女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當前位置:首頁 > > 嵌入式IoT

aarch64系統級體系架構之異常級別

  • 1.簡述

  • 2.樹莓派啟動深度解析

  • 3.不同異常級別需要注意的問題

1.簡述

系統的異常級別對于arm芯片來說非常的重要,對于操作系統層面上來說,理解芯片的體系架構,將很容易的進入狀態(tài),隨心所欲的去玩轉芯片,對于做應用來說,熟悉芯片的體系架構,可以解決非常棘手的問題,比如系統的安全還有就是實時性響應問題。比如我們的手機指紋加密數據,實際上是在安全模式下的,此時對于運行在非安全模式下的操作系統,其實是獲取不到指紋的數據的,只是處理安全模式下發(fā)送過來的結果,類似的還有支付安全。

對于armv8異常級別,其實是一個很大的話題,但是深入理解之后,就會發(fā)現這時一個很有意思的東西??催^盜夢空間的電影都知道,夢有好多層,但是那一層是真實的,那一層是夢境,真實到夢境如何切換,夢境到真實如何切換,這真的是不識廬山真面目,只緣生在此山中。

本文簡單介紹一下樹莓派啟動的異常級別,如何從不同的exception level進行切換,同時啟動的時候如何指定exception level,大體上去理解異常級別。

2.樹莓派啟動深度解析

樹莓派的啟動流程,我想簡單敘述一下,就是上電之后,啟動了GPU,然后通過GPU去啟動arm的核,然后就是讀取配置文件,設置ddr等等。如果sd卡里有kernel8.img文件,那這個就是Linux內核執(zhí)行的程序。此時,Linux就執(zhí)行起來了。

對于rt-thread來說,情況是一樣的,可以在config.txt里寫下如此的文件

kernel=kernel8.img
kernel_addr=0x80000
enable_uart=1

這就告訴樹莓派,需要啟動的固件名字是kernel8.img,入口地址0x80000。

其實這并不是芯片上電后執(zhí)行的第一個程序,還運行了一個叫start.elf的文件,該文件會加載kernel8.img。通過測試得知,樹莓派其實在kernel8.img的入口的第一條指令是在el2下的。關于el3,el2,el1,el0可以看下面的圖進行理解。

應用程序運行在EL0上,此時可以訪問的寄存器很有限,比如我們安卓手機安裝的app,其實都是運行在EL0的。而EL1是運行Kernel的,比如Linux的或者是rt-thread。

到了EL2就是提供了虛擬化的實現,這一層涉及到虛擬化,在服務器上用的比較多。

然后就是EL3,這個比較厲害,權限比較大,基本上可以訪問所有寄存器,而且電源管理,也在里面。另外這個就類似于一個電梯,打通了安全與非安全的通道。

樹莓派啟動內核在EL2里面,那么我們知道操作系統運行在EL1的非安全模式下,安全模式是對于安全應用場景的,這里不做考慮,但是如果要訪問GIC的組,一般是在安全模式。

目的就是從EL2->EL1。

// enable AArch64 in EL1
 mov     x0, #(1 << 31) // AArch64
 orr     x0, x0, #(1 << 1) // SWIO hardwired on Pi3
 msr     hcr_el2, x0
 mrs     x0, hcr_el2

 // change execution level to EL1
 mov     x2, #0x3c4
 msr     spsr_el2, x2        // 1111000100
 adr     x2, .L__in_el1
 msr     elr_el2, x2
 eret                        // exception return. from EL2. continue from .L__in_el1

主要就是使能el1在64位模式下運行,然后配置系統從EL2->>EL1,采用的是eret指令,該指令會將pc指針指向elr_el2對應的地址。

如果我們想要樹莓派在el3上運行,可以采用MVC指令進行模式切換。

svc,hvc,smc指令切換,對EL1~3有三種不同的中斷向量。

不想進行指令切換,最簡單的辦法,就是編譯一個鏈接地址為0的固件,在config.txt中寫下

armstub=kernel8.img

此時,系統從el3運行,并且起始地址為0。和芯片上電執(zhí)行第一條指令模式類似。

3.不同異常級別需要注意的問題

既然涉及到異常級別,那就不得不說一下使用異常級別需要注意的問題了。安全和非安全這是物理隔離的,但是異常級別卻是需要進行切換的。比如我們從非安全到安全,是不能直接切換過去的,需要借助el3這個電梯,可以借助這個過去。

然后就是你在el1上訪問某些寄存器的時候,突然系統hard fault,這時就要看aarch64的芯片手冊了,看這個寄存器是在那個異常級別下可以訪問的。有些寄存器在不對應的異常級別,讀為零,寫無效。比如GIC的某些寄存器。

異常級別對于芯片的體系架構非常重要,做底層開發(fā),離不開體系架構知識,做上層開發(fā)理解芯片體系架構更好,設計更加符合芯片設計的產品,做更加性能優(yōu)化的產品是非常好的。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
關閉