RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙內(nèi)核源碼分析:鴻蒙內(nèi)核的每段匯編代碼解析

鴻蒙系統(tǒng)HarmonyOS ? 來源:百家號(hào) ? 作者:計(jì)算機(jī)java編程 ? 2021-03-02 09:56 ? 次閱讀

本篇說清楚CPU的工作模式

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

正如一個(gè)互聯(lián)網(wǎng)項(xiàng)目的后臺(tái)管理系統(tǒng)有權(quán)限管理一樣,CPU工作是否也有權(quán)限(模式)? 一個(gè)成熟的軟硬件架構(gòu),肯定會(huì)有這些設(shè)計(jì),只是大部分人不知道,也不需要知道,老百姓就干好老百姓的活就行了,有工作能吃飽飯就知足了,宮的事你管那么多干嘛,你也管不了.

應(yīng)用程序就只關(guān)注應(yīng)用功能,業(yè)務(wù)邏輯相關(guān)的部分就行了,底層實(shí)現(xiàn)對(duì)應(yīng)用層屏蔽的越干凈系統(tǒng)設(shè)計(jì)的就越優(yōu)良.

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

七種模式

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

o4YBAGA9mhqAITVgAAKa3KWMsqU730.png

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

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

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

1.異常模式??臻g怎么申請(qǐng)?

鴻蒙是如何給異常模式申請(qǐng)??臻g的

代碼解讀

六種異常模式都有自己獨(dú)立的??臻g每種模式的OS_EXC_***_STACK_SIZE棧大小都不一樣,最大是管理模式(svc)8K,最小的只有40個(gè)字節(jié). svc模式為什么要這么大呢? 因?yàn)殚_機(jī)代碼和系統(tǒng)調(diào)用代碼的運(yùn)行都在管理模式,系統(tǒng)調(diào)用的函數(shù)實(shí)現(xiàn)往往較復(fù)雜,最大不能超過8K. 例如:某個(gè)系統(tǒng)調(diào)用中定義一個(gè)8K的局部變量,內(nèi)核肯定立馬閃蹦.因?yàn)闂⒁绯?處理異常的程序出現(xiàn)了異常,后面就再也沒人兜底了,只能是死局.鴻蒙是支持多核處理的,CORE_NUM表明,每個(gè)CPU核的每種異常模式都有自己的獨(dú)立棧空間.注意理解這個(gè)是理解內(nèi)核代碼的基礎(chǔ).否則會(huì)一頭霧水.2.異常模式入口地址在哪?

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

o4YBAGA9mlWAfm2AAAIRJFlZYII637.png

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

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

不管是主動(dòng)切換的異常,還是被動(dòng)切換的異常,都會(huì)先跳到對(duì)應(yīng)的入口去處理.每個(gè)異常的代碼都起始于匯編,處理完了再切回去.舉個(gè)例子: 某個(gè)應(yīng)用程序調(diào)用了系統(tǒng)調(diào)用(比如創(chuàng)建定時(shí)器),會(huì)經(jīng)過以下大致過程:

swi指令將用戶模式切換到管理模式(svc)在管理模式中先保存用戶模式的現(xiàn)場信息(R0-R15寄存器值入棧)獲取系統(tǒng)調(diào)用號(hào),知道是調(diào)用了哪個(gè)系統(tǒng)調(diào)用查詢系統(tǒng)調(diào)用對(duì)應(yīng)的注冊(cè)函數(shù)執(zhí)行真正的創(chuàng)建定時(shí)器函數(shù)執(zhí)行完成后,恢復(fù)用戶模式的現(xiàn)場信息(R0-R15寄存器值出棧)跳回用戶模式繼續(xù)執(zhí)行各異常處理代碼很多,不一一列出,本篇只列出開機(jī)代碼,請(qǐng)嘗試讀懂鴻蒙內(nèi)核開機(jī)代碼,后續(xù)講詳細(xì)說明每行代碼的用處.

開機(jī)代碼

異常的權(quán)限

當(dāng)同時(shí)出現(xiàn)多個(gè)異常時(shí),該響應(yīng)哪一個(gè)呢?就涉及到了異常的權(quán)限,如下

Reset (highest priority).Data Abort.FIQ.IRQ.Prefetch Abort.Undefined Instruction, SWI (lowest priority).可以看出swi的權(quán)限最低,swi就是軟件中斷,系統(tǒng)調(diào)用就是通過它來實(shí)現(xiàn)的.

3.異常模式怎么切換?

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

這些寄存器:

保存有關(guān)最近執(zhí)行的ALU操作的信息控制中斷的啟用和禁用設(shè)置處理器操作模式

o4YBAGA9mqyAfg-xAAKGLUkpyBY428.png


編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120228
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3246

    瀏覽量

    114715
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙內(nèi)核源碼Task/線程技術(shù)分析

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

    鴻蒙內(nèi)核源碼分析:用通俗易懂的語言告訴你鴻蒙內(nèi)核發(fā)生了什么?

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

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

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

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

    原文鏈接:https://bbs.elecfans.com/jishu_2010058_1_1.html 每個(gè)碼農(nóng),職業(yè)生涯,都應(yīng)精讀一遍內(nèi)核源碼. 鴻蒙內(nèi)核
    發(fā)表于 11-19 15:06

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

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

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

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

    鴻蒙內(nèi)核源碼分析(雙循環(huán)鏈表篇) :內(nèi)核最重要結(jié)構(gòu)體

    鴻蒙源碼分析系列文章圖解鴻蒙內(nèi)核, 從 HarmonyOS 架構(gòu)層視角整理成文, 并首創(chuàng)用生活場景講故事的方式試圖去解構(gòu)
    發(fā)表于 11-24 13:39

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

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

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

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

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

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

    淺談鴻蒙內(nèi)核源碼的棧

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

    鴻蒙內(nèi)核源碼分析: 虛擬內(nèi)存和物理內(nèi)存是怎么管理的

    有了上篇鴻蒙內(nèi)核源碼分析(內(nèi)存概念篇)的基礎(chǔ),本篇講內(nèi)存管理部分,本章源碼超級(jí)多,很燒腦,但筆者關(guān)鍵處都加了注釋。廢話不多說,開始吧。內(nèi)存一
    發(fā)表于 11-23 11:45 ?19次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b>: 虛擬內(nèi)存和物理內(nèi)存是怎么管理的

    鴻蒙內(nèi)核源碼分析:task是內(nèi)核調(diào)度的單元

    從系統(tǒng)的角度看,線程是競爭系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨(dú)立于其它線程運(yùn)行。 鴻蒙內(nèi)核每個(gè)進(jìn)程內(nèi)的線程獨(dú)立運(yùn)行、獨(dú)立調(diào)度,當(dāng)前進(jìn)程內(nèi)線程的調(diào)度不受其它
    發(fā)表于 11-23 15:51 ?22次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b>:task是<b class='flag-5'>內(nèi)核</b>調(diào)度的單元

    鴻蒙內(nèi)核源碼分析內(nèi)核最重要結(jié)構(gòu)體

    為何鴻蒙內(nèi)核源碼分析系列開篇就說 LOS_DL_LIST ? 因?yàn)樗?b class='flag-5'>鴻蒙 LOS 內(nèi)核中無處
    發(fā)表于 11-24 17:54 ?35次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b> :<b class='flag-5'>內(nèi)核</b>最重要結(jié)構(gòu)體

    華為鴻蒙系統(tǒng)內(nèi)核源碼分析上冊(cè)

    鴻蒙內(nèi)核源碼注釋中文版【 Gitee倉】給 Harmoηy○S源碼逐行加上中文注解,詳細(xì)闡述設(shè)計(jì)細(xì)節(jié),助你快速精讀 Harmonyos內(nèi)核源碼
    發(fā)表于 04-09 14:40 ?17次下載
    RM新时代网站-首页