本篇說清楚CPU的工作模式
讀本篇之前建議先讀鴻蒙內(nèi)核源碼分析(總目錄)其他篇.
正如一個互聯(lián)網(wǎng)項目的后臺管理系統(tǒng)有權限管理一樣,CPU工作是否也有權限(模式)? 一個成熟的軟硬件架構,肯定會有這些設計,只是大部分人不知道,也不需要知道,老百姓就干好老百姓的活就行了,有工作能吃飽飯就知足了,宮的事你管那么多干嘛,你也管不了.
應用程序就只關注應用功能,業(yè)務邏輯相關的部分就行了,底層實現(xiàn)對應用層屏蔽的越干凈系統(tǒng)設計的就越優(yōu)良.
但鴻蒙內(nèi)核源碼分析系列篇的定位就是要把整個底層解剖,全部掰開,看看宮里究竟發(fā)生了么事.從本篇開始要接觸大量的匯編的代碼,將鴻蒙內(nèi)核的每段匯編代碼一一說明白.如此才能知道最開始的開始發(fā)生了什么,最后的最后又發(fā)生了什么.
七種模式
先看一張圖,圖來源于ARM720T.pdf第43頁,在ARM體系中,CPU工作在以下七種模式中:
用戶模式(usr):屬于正常的用戶模式,ARM處理器正常的程序執(zhí)行狀態(tài)??焖僦袛嗄J剑╢iq):用于處理快速中斷,對高速數(shù)據(jù)傳輸或通道處理外部中斷模式(irq):對一般情況下的中斷進行處理。管理模式(svc):屬于操作系統(tǒng)使用的保護模式,處理軟件中斷swi reset。數(shù)據(jù)訪問終止模式(abt):當數(shù)據(jù)或指令預取終止時進入該模式,可用于處理存儲器故障、實現(xiàn)虛擬存儲器和存儲器保護。系統(tǒng)模式(sys):運行具有特權的操作系統(tǒng)任務。未定義指令中止模式(und):處理未定義的指令陷阱,當未定義的指令執(zhí)行時進入該模式,可用于支持硬件協(xié)處理器的軟件仿真。除了用戶模式外,其它六種均為特權模式或者叫異常模式。每種模式都有自己獨立的入口和獨立的運行棧空間.系列篇之CPU篇已介紹過只要提供了入口函數(shù)和運行空間,CPU就可以干活了.入口函數(shù)解決了指令來源問題,運行空間解決了指令的運行問題. 而且在多核情況下,每個CPU核的每種異常模式都有自己獨立的??臻g.注意是異常模式下的棧空間,用戶模式的??臻g是由用戶(應用)程序提供的.
如何讓這七種模式能流暢的跑起來呢? 至少需要以下解決三個基本問題.
??臻g是怎么申請的?申請了多大?被切換中的模式代碼放在哪里?誰來安排它們放在哪里?模式之間是怎么切換的?狀態(tài)怎么保存?本篇代碼來源于鴻蒙內(nèi)核源碼之reset_vector_mp.S,點擊查看 這個匯編文件大概 500多行,非常重要,本篇受限于篇幅只列出一小部分,說清楚以上三個問題.系列其余篇中將詳細說明每段匯編代碼的作用和實現(xiàn),可前往查閱.
1.異常模式棧空間怎么申請?
鴻蒙是如何給異常模式申請??臻g的
代碼解讀
六種異常模式都有自己獨立的棧空間每種模式的OS_EXC_***_STACK_SIZE棧大小都不一樣,最大是管理模式(svc)8K,最小的只有40個字節(jié). svc模式為什么要這么大呢? 因為開機代碼和系統(tǒng)調(diào)用代碼的運行都在管理模式,系統(tǒng)調(diào)用的函數(shù)實現(xiàn)往往較復雜,最大不能超過8K. 例如:某個系統(tǒng)調(diào)用中定義一個8K的局部變量,內(nèi)核肯定立馬閃蹦.因為棧將溢出,處理異常的程序出現(xiàn)了異常,后面就再也沒人兜底了,只能是死局.鴻蒙是支持多核處理的,CORE_NUM表明,每個CPU核的每種異常模式都有自己的獨立??臻g.注意理解這個是理解內(nèi)核代碼的基礎.否則會一頭霧水.2.異常模式入口地址在哪?
再看一張圖,圖來源于ARM720T.pdf第56頁
這就是一切一切的開始,指定所有異常模式的入口地址表,這就是規(guī)定,沒得商量的.在低地址情況下.開機代碼就是放在0x00000000的位置,觸發(fā)開機鍵后,硬件將PC寄存器置為0x00000000,開始了萬里長征的第一步.在系統(tǒng)運行過程中就這么來回跳.
以上是各個異常情況下的入口地址,在reset_vector_mp.S中都能找到,經(jīng)過編譯鏈接后就會變成
不管是主動切換的異常,還是被動切換的異常,都會先跳到對應的入口去處理.每個異常的代碼都起始于匯編,處理完了再切回去.舉個例子: 某個應用程序調(diào)用了系統(tǒng)調(diào)用(比如創(chuàng)建定時器),會經(jīng)過以下大致過程:
swi指令將用戶模式切換到管理模式(svc)在管理模式中先保存用戶模式的現(xiàn)場信息(R0-R15寄存器值入棧)獲取系統(tǒng)調(diào)用號,知道是調(diào)用了哪個系統(tǒng)調(diào)用查詢系統(tǒng)調(diào)用對應的注冊函數(shù)執(zhí)行真正的創(chuàng)建定時器函數(shù)執(zhí)行完成后,恢復用戶模式的現(xiàn)場信息(R0-R15寄存器值出棧)跳回用戶模式繼續(xù)執(zhí)行各異常處理代碼很多,不一一列出,本篇只列出開機代碼,請嘗試讀懂鴻蒙內(nèi)核開機代碼,后續(xù)講詳細說明每行代碼的用處.
開機代碼
異常的權限
當同時出現(xiàn)多個異常時,該響應哪一個呢?就涉及到了異常的權限,如下
Reset (highest priority).Data Abort.FIQ.IRQ.Prefetch Abort.Undefined Instruction, SWI (lowest priority).可以看出swi的權限最低,swi就是軟件中斷,系統(tǒng)調(diào)用就是通過它來實現(xiàn)的.
3.異常模式怎么切換?
寫應用程序經(jīng)常會用到狀態(tài),來記錄各種分支邏輯,傳遞參數(shù).這么多異常模式,相互切換,中間肯定會有很多的狀態(tài)需要保存.比如:如何能知道當前運行在哪種模式下?怎么查?去哪里查呢? 答案是: CPSR 和 SPSR CPSR:程序狀態(tài)寄存器(current program status register) (當前程序狀態(tài)寄存器),在任何處理器模式下被訪問。 SPSR:程序狀態(tài)保存寄存器(saved program status register),每一種處理器模式下都有一個狀態(tài)寄存器SPSR,SPSR用于保存CPSR的狀態(tài),以便異常返回后恢復異常發(fā)生時的工作狀態(tài)。當特定 的異常中斷發(fā)生時,這個寄存器用于存放當前程序狀態(tài)寄存器的內(nèi)容。在異常中斷退出時,可以用SPSR來恢復CPSR。
這些寄存器:
保存有關最近執(zhí)行的ALU操作的信息控制中斷的啟用和禁用設置處理器操作模式
編輯:hfy
-
寄存器
+關注
關注
31文章
5294瀏覽量
119814 -
定時器
+關注
關注
23文章
3231瀏覽量
114326
發(fā)布評論請先 登錄
相關推薦
評論