<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙內核源碼分析:鴻蒙內核的每段匯編代碼解析

鴻蒙系統HarmonyOS ? 來源:百家號 ? 作者:計算機java編程 ? 2021-03-02 09:56 ? 次閱讀

本篇說清楚CPU的工作模式

讀本篇之前建議先讀鴻蒙內核源碼分析(總目錄)其他篇.

正如一個互聯網項目的后臺管理系統有權限管理一樣,CPU工作是否也有權限(模式)? 一個成熟的軟硬件架構,肯定會有這些設計,只是大部分人不知道,也不需要知道,老百姓就干好老百姓的活就行了,有工作能吃飽飯就知足了,宮的事你管那么多干嘛,你也管不了.

應用程序就只關注應用功能,業務邏輯相關的部分就行了,底層實現對應用層屏蔽的越干凈系統設計的就越優良.

但鴻蒙內核源碼分析系列篇的定位就是要把整個底層解剖,全部掰開,看看宮里究竟發生了么事.從本篇開始要接觸大量的匯編的代碼,將鴻蒙內核的每段匯編代碼一一說明白.如此才能知道最開始的開始發生了什么,最后的最后又發生了什么.

七種模式

先看一張圖,圖來源于ARM720T.pdf第43頁,在ARM體系中,CPU工作在以下七種模式中:

o4YBAGA9mhqAITVgAAKa3KWMsqU730.png

用戶模式(usr):屬于正常的用戶模式,ARM處理器正常的程序執行狀態??焖僦袛嗄J剑╢iq):用于處理快速中斷,對高速數據傳輸或通道處理外部中斷模式(irq):對一般情況下的中斷進行處理。管理模式(svc):屬于操作系統使用的保護模式,處理軟件中斷swi reset。數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,可用于處理存儲器故障、實現虛擬存儲器和存儲器保護。系統模式(sys):運行具有特權的操作系統任務。未定義指令中止模式(und):處理未定義的指令陷阱,當未定義的指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真。除了用戶模式外,其它六種均為特權模式或者叫異常模式。每種模式都有自己獨立的入口和獨立的運行??臻g.系列篇之CPU篇已介紹過只要提供了入口函數和運行空間,CPU就可以干活了.入口函數解決了指令來源問題,運行空間解決了指令的運行問題. 而且在多核情況下,每個CPU核的每種異常模式都有自己獨立的??臻g.注意是異常模式下的??臻g,用戶模式的??臻g是由用戶(應用)程序提供的.

如何讓這七種模式能流暢的跑起來呢? 至少需要以下解決三個基本問題.

??臻g是怎么申請的?申請了多大?被切換中的模式代碼放在哪里?誰來安排它們放在哪里?模式之間是怎么切換的?狀態怎么保存?本篇代碼來源于鴻蒙內核源碼之reset_vector_mp.S,點擊查看 這個匯編文件大概 500多行,非常重要,本篇受限于篇幅只列出一小部分,說清楚以上三個問題.系列其余篇中將詳細說明每段匯編代碼的作用和實現,可前往查閱.

1.異常模式??臻g怎么申請?

鴻蒙是如何給異常模式申請??臻g的

代碼解讀

六種異常模式都有自己獨立的??臻g每種模式的OS_EXC_***_STACK_SIZE棧大小都不一樣,最大是管理模式(svc)8K,最小的只有40個字節. svc模式為什么要這么大呢? 因為開機代碼和系統調用代碼的運行都在管理模式,系統調用的函數實現往往較復雜,最大不能超過8K. 例如:某個系統調用中定義一個8K的局部變量,內核肯定立馬閃蹦.因為棧將溢出,處理異常的程序出現了異常,后面就再也沒人兜底了,只能是死局.鴻蒙是支持多核處理的,CORE_NUM表明,每個CPU核的每種異常模式都有自己的獨立??臻g.注意理解這個是理解內核代碼的基礎.否則會一頭霧水.2.異常模式入口地址在哪?

再看一張圖,圖來源于ARM720T.pdf第56頁

o4YBAGA9mlWAfm2AAAIRJFlZYII637.png

這就是一切一切的開始,指定所有異常模式的入口地址表,這就是規定,沒得商量的.在低地址情況下.開機代碼就是放在0x00000000的位置,觸發開機鍵后,硬件將PC寄存器置為0x00000000,開始了萬里長征的第一步.在系統運行過程中就這么來回跳.

以上是各個異常情況下的入口地址,在reset_vector_mp.S中都能找到,經過編譯鏈接后就會變成

不管是主動切換的異常,還是被動切換的異常,都會先跳到對應的入口去處理.每個異常的代碼都起始于匯編,處理完了再切回去.舉個例子: 某個應用程序調用了系統調用(比如創建定時器),會經過以下大致過程:

swi指令將用戶模式切換到管理模式(svc)在管理模式中先保存用戶模式的現場信息(R0-R15寄存器值入棧)獲取系統調用號,知道是調用了哪個系統調用查詢系統調用對應的注冊函數執行真正的創建定時器函數執行完成后,恢復用戶模式的現場信息(R0-R15寄存器值出棧)跳回用戶模式繼續執行各異常處理代碼很多,不一一列出,本篇只列出開機代碼,請嘗試讀懂鴻蒙內核開機代碼,后續講詳細說明每行代碼的用處.

開機代碼

異常的權限

當同時出現多個異常時,該響應哪一個呢?就涉及到了異常的權限,如下

Reset (highest priority).Data Abort.FIQ.IRQ.Prefetch Abort.Undefined Instruction, SWI (lowest priority).可以看出swi的權限最低,swi就是軟件中斷,系統調用就是通過它來實現的.

3.異常模式怎么切換?

寫應用程序經常會用到狀態,來記錄各種分支邏輯,傳遞參數.這么多異常模式,相互切換,中間肯定會有很多的狀態需要保存.比如:如何能知道當前運行在哪種模式下?怎么查?去哪里查呢? 答案是: CPSR 和 SPSR CPSR:程序狀態寄存器(current program status register) (當前程序狀態寄存器),在任何處理器模式下被訪問。 SPSR:程序狀態保存寄存器(saved program status register),每一種處理器模式下都有一個狀態寄存器SPSR,SPSR用于保存CPSR的狀態,以便異常返回后恢復異常發生時的工作狀態。當特定 的異常中斷發生時,這個寄存器用于存放當前程序狀態寄存器的內容。在異常中斷退出時,可以用SPSR來恢復CPSR。

這些寄存器:

保存有關最近執行的ALU操作的信息控制中斷的啟用和禁用設置處理器操作模式

o4YBAGA9mqyAfg-xAAKGLUkpyBY428.png


編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    30

    文章

    5028

    瀏覽量

    117719
  • 定時器
    +關注

    關注

    23

    文章

    3147

    瀏覽量

    112034
收藏 人收藏

    評論

    相關推薦

    鴻蒙內核源碼Task/線程技術分析

    前言 在鴻蒙內核中,廣義上可理解為一個Task就是一個線程 一、怎么理解Task 1. 官方文檔是怎么描述線程 基本概念 從系統的角度看,線程是競爭系統資源的最小運行單元。線程可以使用或等待CPU
    的頭像 發表于 10-18 10:42 ?1948次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內核</b><b class='flag-5'>源碼</b>Task/線程技術<b class='flag-5'>分析</b>

    鴻蒙內核源碼分析:用通俗易懂的語言告訴你鴻蒙內核發生了什么?

    查看。內存在內核的比重極大內存模塊占了鴻蒙內核約15%代碼量, 近50個文件,非常復雜。鴻蒙源碼
    發表于 11-19 10:14

    鴻蒙內核源碼分析源碼注釋篇):給HarmonyOS源碼逐行加上中文注釋

    源碼分析(總目錄) 查看,兩大站點持續更新注釋中文版 進入>> 鴻蒙內核源碼注釋中文版 【 Gitee倉】閱讀,三大倉庫每日同步更新…加注釋
    發表于 11-19 10:32

    鴻蒙內核源碼分析:給HarmonyOS源碼逐行加上中文注釋

    原文鏈接:https://bbs.elecfans.com/jishu_2010058_1_1.html 每個碼農,職業生涯,都應精讀一遍內核源碼. 鴻蒙內核
    發表于 11-19 15:06

    鴻蒙源碼分析系列(總目錄) | 給HarmonyOS源碼逐行加上中文注釋

    注解|-鴻蒙內核源碼分析(內存映射篇) | 虛擬內存和物理內存之間是怎么映射的|-鴻蒙內核
    發表于 11-20 11:24

    鴻蒙內核源碼分析(必讀篇):用故事說內核

    本文基于開源鴻蒙內核分析,官方源碼【kernel_liteos_a】官方文檔【docs】參考文檔【Huawei LiteOS】本文作者:鴻蒙
    發表于 11-23 10:15

    鴻蒙內核源碼分析(調度機制篇):Task是如何被調度執行的

    認任務上下文!這里看不到任何代碼了,因為這是跟CPU相關的,不同的CPU需要去適配不同的匯編代碼,所以這些匯編代碼不會出現在一個通用工程中。
    發表于 11-23 10:53

    鴻蒙內核源碼分析(雙循環鏈表篇) :內核最重要結構體

    鴻蒙源碼分析系列文章圖解鴻蒙內核, 從 HarmonyOS 架構層視角整理成文, 并首創用生活場景講故事的方式試圖去解構
    發表于 11-24 13:39

    鴻蒙內核源碼分析(必讀篇)

    本文基于開源鴻蒙內核分析,官方源碼【kernel_liteos_a】官方文檔【docs】參考文檔【Huawei LiteOS】本文作者:鴻蒙
    發表于 11-25 09:28

    HarmonyOS內核源碼分析(上)電子書-上線了

    `為方便大家開發鴻蒙系統,小編為大家編輯整理了一本HarmonyOS內核源碼分析系列電子書,需要參考學習的朋友快來下吧!本電子書主要介紹如何給鴻蒙
    發表于 11-25 17:13

    鴻蒙內核源碼分析(百篇博客分析.挖透鴻蒙內核)

    致敬內核開發者感謝開放原子開源基金會,致敬鴻蒙內核開發者??梢院敛豢鋸埖恼f鴻蒙內核源碼可作為大學
    發表于 07-04 17:16

    為何要精讀鴻蒙內核源碼?

    一個沒學過計算機知識的賣菜大媽就不可能知道內核的基本運作了嗎? 不一定!在系列篇中試圖用 鴻蒙內核源碼分析(總目錄)之故事篇 去引導這一層級
    的頭像 發表于 04-26 15:00 ?1454次閱讀
    為何要精讀<b class='flag-5'>鴻蒙</b><b class='flag-5'>內核</b><b class='flag-5'>源碼</b>?

    淺談鴻蒙內核源碼的棧

    上面的代碼鴻蒙內核用棧方式一樣,都采用了遞減滿棧的方式, 什么是遞減滿棧?
    的頭像 發表于 04-24 11:21 ?1110次閱讀
    淺談<b class='flag-5'>鴻蒙</b><b class='flag-5'>內核</b><b class='flag-5'>源碼</b>的棧

    鴻蒙內核源碼分析內核最重要結構體

    為何鴻蒙內核源碼分析系列開篇就說 LOS_DL_LIST ? 因為它在鴻蒙 LOS 內核中無處
    發表于 11-24 17:54 ?35次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b> :<b class='flag-5'>內核</b>最重要結構體

    華為鴻蒙系統內核源碼分析上冊

    鴻蒙內核源碼注釋中文版【 Gitee倉】給 Harmoηy○S源碼逐行加上中文注解,詳細闡述設計細節,助你快速精讀 Harmonyos內核源碼
    發表于 04-09 14:40 ?16次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>