0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

鴻蒙輕內(nèi)核源碼分析:MMU 協(xié)處理器

王程 ? 來(lái)源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-20 14:28 ? 次閱讀

1、 ARM C15 協(xié)處理器

在 ARM 嵌入式應(yīng)用系統(tǒng)中, 很多系統(tǒng)控制由 ARM CP15 協(xié)處理器來(lái)完成的。CP15 協(xié)處理器包含編號(hào) 0-15 的 16 個(gè) 32 位的寄存器。例如,ARM 處理器使用 C15 協(xié)處理器的寄存器來(lái)控制 cache、TCM(Tightly-Coupled Memory)和存儲(chǔ)器管理。CP15 的各個(gè)寄存器的概要信息如下圖,圖片來(lái)自官方資料《ARM? Cortex?-A Series Version: 4.0 Programmer’s Guide》。

wKgZomXURhaAGcYoAAMU1aaKtPg526.png

wKgaomXURh-AUmc6AAF_vM3IDzA715.png

wKgaomXURjKAZrqSAAHXMTBCZzI662.png


在這些 C15 寄存器中和 MMU 關(guān)系較大的有 C2、C7、C17 寄存器,這些寄存器的作用,從上圖可以看出,分別是:

CP15 C2 寄存器

Memory protection and control registers,內(nèi)存保護(hù)和控制寄存器,包含 Translation Table Base Register 0 (TTBR0)、Translation Table Base Register 1 (TTBR1) 和 Translation Table Base Control Register (TTBCR)。TTBR0、TTBR1 是 L1 轉(zhuǎn)換頁(yè)表的基地址,TTCR 控制 TTBR0 和 TTBR1 的使用。

CP15 C7 寄存器

Cache and branch predictor maintenance functions、Data and instruction barrier operations 用于高速緩存和寫(xiě)緩存控制。

CP15 C13 寄存器

Context ID Register (CONTEXTIDR)、Software thread ID registers 用于保存進(jìn)程標(biāo)識(shí)符(asid 地址空間編號(hào))。

2、ARM C15 協(xié)處理器匯編指令

訪問(wèn) CP15 寄存器的指令主要是 MCR 和 MRC 這兩個(gè)指令。本小節(jié)詳細(xì)介紹下這 2 個(gè)匯編指令。先看下指令的含義,MCR 是 ARM 處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令,英文為 Move CPU register to coprocessor register,MRC 是協(xié)處理器寄存器到 ARM 處理器寄存器的數(shù)據(jù)傳送指令,英文為 Move from coprocessor register to CPU register。這 2 個(gè)指令的語(yǔ)義格式如下,可以看出語(yǔ)義格式是一樣的,但是讀取寫(xiě)入含義會(huì)有差異。MCR 是讀取 Rt 寄存器寫(xiě)入?yún)f(xié)處理器寄存器 CRn、CRm,而 MRC 是讀取協(xié)處理器寄存器 CRn、CRm 寫(xiě)入 Rt 寄存器。

MCR{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} MRC{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2}

MCR 詳細(xì)的語(yǔ)義介紹如下:

Syntax MCR{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} where: cond is an optional condition code. 可選的條件碼。 coproc is the name of the coprocessor the instruction is for. The standard name is pn, where n is an integer in the range 0 to 15.協(xié)處理器的名稱,標(biāo)準(zhǔn)名稱為pn,其中n為0-15,例如p14、p15。 opcode1 is a 3-bit coprocessor-specific opcode. 3位的操作碼。 opcode2 is an optional 3-bit coprocessor-specific opcode.可選的3位操作碼。 Rt is an ARM source register. Rt must not be PC. 要讀取的ARM寄存器,不能為PC寄存器。 CRn, CRm are coprocessor registers.要寫(xiě)入的協(xié)處理器寄存器。

MRC 詳細(xì)的語(yǔ)義介紹如下:

Syntax MRC{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} where: cond is an optional condition code. 可選的條件碼。 coproc is the name of the coprocessor the instruction is for. The standard name is pn, where n is an integer in the range 0 to 15.協(xié)處理器的名稱,標(biāo)準(zhǔn)名稱為pn,其中n為0-15,例如p14、p15。 opcode1 is a 3-bit coprocessor-specific opcode.3位的操作碼。 opcode2 is an optional 3-bit coprocessor-specific opcode.可選的3位操作碼 Rt is the ARM destination register. Rt must not be PC.要寫(xiě)入的ARM寄存器,不能為PC寄存器。 Rt can be APSR_nzcv. This means that the coprocessor executes an instruction that changes the value of the condition flags in the APSR. Rt也可以為APSR_nzcv。 CRn, CRm are coprocessor registers.要讀取的協(xié)處理器寄存器。

3、MMU 匯編代碼

在 archarmarmincludearm.h 文件中,封裝了 CP15 協(xié)處理器相關(guān)的寄存器操作匯編函數(shù)。我們主要看下 MMU 相關(guān)的部分。

3.1 CP15 C2 TTBR 轉(zhuǎn)換表基地址寄存器

代碼比較簡(jiǎn)單,結(jié)合下圖,自行查看即可。該圖來(lái)自《ARM Cortex-A9 Technical Reference Manual r4p1》CP15 system control registers grouped by CRn order 部分。

wKgZomXURkuAVcDTAAC0gU-1zPI091.png

STATIC INLINE UINT32 OsArmReadTtbr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,0" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,0" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbr0(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,0" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr0(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,0" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbr1(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,1" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbr1(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,1" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadTtbcr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c2,c0,2" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteTtbcr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c2,c0,2" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

3.2 CP15 C7 高速緩存寄存器

代碼比較簡(jiǎn)單,結(jié)合下圖,自行查看即可。該圖是 C7 寄存器的部分截圖。

wKgZomXURlWASRI-AAD0Y7kcroU999.png

STATIC INLINE UINT32 OsArmReadBpiall(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c7,c5,6" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteBpiall(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c7,c5,6" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); } STATIC INLINE UINT32 OsArmReadBpiallis(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c7,c1,6" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteBpiallis(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c7,c1,6" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

3.3 CP15 C13 進(jìn)程標(biāo)識(shí)符寄存器

代碼比較簡(jiǎn)單,結(jié)合下圖,自行查看即可。

wKgZomXURl6AMvzCAACc0RjQUio347.png

STATIC INLINE UINT32 OsArmReadContextidr(VOID) { UINT32 val; __asm__ volatile("mrc p15, 0, %0, c13,c0,1" : "=r"(val)); return val; } STATIC INLINE VOID OsArmWriteContextidr(UINT32 val) { __asm__ volatile("mcr p15, 0, %0, c13,c0,1" ::"r"(val)); __asm__ volatile("isb" ::: "memory"); }

4 MMU 上下文切換

在之前的系列,我們了解到每個(gè)用戶進(jìn)程都有獨(dú)立的進(jìn)程空間。在進(jìn)程切換時(shí),MMU 上下文也會(huì)切換,相應(yīng)的函數(shù)為 LOS_ArchMmuContextSwitch ()??焖俜治鱿略摵瘮?shù)的代碼。

⑴處讀取 TTBCR 寄存器的狀態(tài)值,如果傳入?yún)?shù) archMmu 不為空,執(zhí)行⑵使能 TTBR0,否則執(zhí)行⑶使其失能 TTBR0。⑷處把內(nèi)核地址空間的進(jìn)程空間標(biāo)識(shí)符 asid 寫(xiě)入 C13 寄存器。⑸處更新 TTB 頁(yè)表基地址和 TTB 狀態(tài)信息到相應(yīng)寄存器。⑹處把進(jìn)程空間的進(jìn)程標(biāo)識(shí)符寫(xiě)入 C13 寄存器。

VOID LOS_ArchMmuContextSwitch(LosArchMmu *archMmu) { UINT32 ttbr; ⑴ UINT32 ttbcr = OsArmReadTtbcr(); if (archMmu) { ⑵ ttbr = MMU_TTBRx_FLAGS | (archMmu->physTtb); /* enable TTBR0 */ ttbcr &= ~MMU_DESCRIPTOR_TTBCR_PD0; } else { ⑶ ttbr = 0; /* disable TTBR0 */ ttbcr |= MMU_DESCRIPTOR_TTBCR_PD0; } #ifdef LOSCFG_KERNEL_VM /* from armv7a arm B3.10.4, we should do synchronization changes of ASID and TTBR. */ ⑷ OsArmWriteContextidr(LOS_GetKVmSpace()->archMmu.asid); ISB; #endif ⑸ OsArmWriteTtbr0(ttbr); ISB; OsArmWriteTtbcr(ttbcr); ISB; #ifdef LOSCFG_KERNEL_VM if (archMmu) { ⑹ OsArmWriteContextidr(archMmu->asid); ISB; } #endif }



審核編輯 黃宇

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

    關(guān)注

    68

    文章

    19586

    瀏覽量

    232140
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9237

    瀏覽量

    371990
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    658

    瀏覽量

    29889
  • MMU
    MMU
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    18489
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2457

    瀏覽量

    43440
收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    設(shè)計(jì)了一個(gè)基于浮點(diǎn)數(shù)運(yùn)算的協(xié)處理器,使用C語(yǔ)言編程時(shí)沒(méi)法輸入float型數(shù)據(jù),請(qǐng)問(wèn)有哪些部分需要修改?

    我設(shè)計(jì)了一個(gè)基于浮點(diǎn)數(shù)運(yùn)算的協(xié)處理器,使用C語(yǔ)言編程時(shí)沒(méi)法輸入float型數(shù)據(jù),請(qǐng)問(wèn)有哪些部分需要修改?SDK,EXU_decoder浮點(diǎn)寄存都需要修改嗎,謝謝
    發(fā)表于 03-07 16:03

    低功耗處理器的優(yōu)勢(shì)分析

    隨著科技的飛速發(fā)展,電子設(shè)備的種類和數(shù)量不斷增加,人們對(duì)設(shè)備的能效要求也越來(lái)越高。低功耗處理器因其在節(jié)能、環(huán)保和成本效益方面的優(yōu)勢(shì)而受到廣泛關(guān)注。 低功耗處理器的定義 低功耗處理器是指在設(shè)計(jì)時(shí)
    的頭像 發(fā)表于 02-07 09:14 ?500次閱讀

    EE-200:ADSP-TS20x TigerSHARC處理器引導(dǎo)加載程序內(nèi)核操作

    電子發(fā)燒友網(wǎng)站提供《EE-200:ADSP-TS20x TigerSHARC處理器引導(dǎo)加載程序內(nèi)核操作.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 16:16 ?0次下載
    EE-200:ADSP-TS20x TigerSHARC<b class='flag-5'>處理器</b>引導(dǎo)加載程序<b class='flag-5'>內(nèi)核</b>操作

    EE-174:ADSP-TS101S TigerSHARC處理器引導(dǎo)加載程序內(nèi)核操作

    電子發(fā)燒友網(wǎng)站提供《EE-174:ADSP-TS101S TigerSHARC處理器引導(dǎo)加載程序內(nèi)核操作.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 15:35 ?0次下載
    EE-174:ADSP-TS101S TigerSHARC<b class='flag-5'>處理器</b>引導(dǎo)加載程序<b class='flag-5'>內(nèi)核</b>操作

    EE-345:SHARC處理器的啟動(dòng)內(nèi)核定制和固件可升級(jí)性

    電子發(fā)燒友網(wǎng)站提供《EE-345:SHARC處理器的啟動(dòng)內(nèi)核定制和固件可升級(jí)性.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 14:14 ?0次下載
    EE-345:SHARC<b class='flag-5'>處理器</b>的啟動(dòng)<b class='flag-5'>內(nèi)核</b>定制和固件可升級(jí)性

    EE-290:管理SHARC處理器上的內(nèi)核PLL

    電子發(fā)燒友網(wǎng)站提供《EE-290:管理SHARC處理器上的內(nèi)核PLL.pdf》資料免費(fèi)下載
    發(fā)表于 01-05 09:41 ?0次下載
    EE-290:管理SHARC<b class='flag-5'>處理器</b>上的<b class='flag-5'>內(nèi)核</b>PLL

    OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開(kāi)發(fā)板演示

    本文介紹瑞芯微主板/開(kāi)發(fā)板編譯OpenHarmony源碼后燒錄鏡像的教程,觸覺(jué)智能Purple Pi OH鴻蒙開(kāi)發(fā)板演示。搭載了瑞芯微RK3566四核處理器,樹(shù)莓派卡片電腦設(shè)計(jì),支持開(kāi)源鴻蒙
    的頭像 發(fā)表于 12-30 10:08 ?403次閱讀
    OpenHarmony<b class='flag-5'>源碼</b>編譯后燒錄鏡像教程,RK3566<b class='flag-5'>鴻蒙</b>開(kāi)發(fā)板演示

    全志T536系列處理器特性概述 集成RISC-V E907協(xié)處理器

    ,E907協(xié)處理器,含有2Tops NPU、G2D、VPU 4K高清視頻編解碼。支持多種多媒體接口MIPI-DSI、Parallel DSI、Dual-LVDS和MIPI-CSI、Parallel
    的頭像 發(fā)表于 11-18 15:21 ?2880次閱讀
    全志T536系列<b class='flag-5'>處理器</b>特性概述 集成RISC-V E907<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>

    使用TMS320C6416協(xié)處理器:Turbo協(xié)處理器(TCP)

    電子發(fā)燒友網(wǎng)站提供《使用TMS320C6416協(xié)處理器:Turbo協(xié)處理器(TCP).pdf》資料免費(fèi)下載
    發(fā)表于 10-23 10:16 ?0次下載
    使用TMS320C6416<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>:Turbo<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>(TCP)

    使用TMS320C6416協(xié)處理器:Viterbi協(xié)處理器(VCP)

    電子發(fā)燒友網(wǎng)站提供《使用TMS320C6416協(xié)處理器:Viterbi協(xié)處理器(VCP).pdf》資料免費(fèi)下載
    發(fā)表于 10-21 09:36 ?0次下載
    使用TMS320C6416<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>:Viterbi<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>(VCP)

    TMS320C6416協(xié)處理器和誤碼率

    電子發(fā)燒友網(wǎng)站提供《TMS320C6416協(xié)處理器和誤碼率.pdf》資料免費(fèi)下載
    發(fā)表于 10-17 10:35 ?0次下載
    TMS320C6416<b class='flag-5'>協(xié)</b><b class='flag-5'>處理器</b>和誤碼率

    【開(kāi)源鴻蒙】使用QEMU運(yùn)行OpenHarmony量系統(tǒng)

    本文將會(huì)介紹如何從源碼安裝QEMU 6.2.0,以及如何使用QEMU運(yùn)行OpenHarmony量系統(tǒng)。通過(guò)本文,你將會(huì)對(duì)QEMU和OpenHarmony量系統(tǒng)又一個(gè)初步的認(rèn)知,并對(duì)如何使用QEMU又一個(gè)初步的理解和體會(huì)。
    的頭像 發(fā)表于 09-14 08:51 ?931次閱讀
    【開(kāi)源<b class='flag-5'>鴻蒙</b>】使用QEMU運(yùn)行OpenHarmony<b class='flag-5'>輕</b>量系統(tǒng)

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    1 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核 ? 6月21日,在華為開(kāi)發(fā)者大會(huì)上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨(dú)立于安卓和iOS的
    的頭像 發(fā)表于 06-27 11:30 ?1001次閱讀

    請(qǐng)問(wèn)ESP32s3 ULP RISC-V協(xié)處理器是否支持ADC的讀???

    我在ULP RISC-V協(xié)處理器的例程中,沒(méi)有發(fā)現(xiàn)有對(duì)ADC的操作,請(qǐng)問(wèn)RISC-V協(xié)處理器目前還不支持嗎?使用的IDF版本為4.4.2。 我想在ULP模式下,通過(guò)ADC來(lái)讀取外部器件
    發(fā)表于 06-14 07:38

    AOSP源碼定制-內(nèi)核驅(qū)動(dòng)編寫(xiě)

    有時(shí)候?yàn)榱?b class='flag-5'>分析一些殼的檢測(cè),需要在內(nèi)核層面對(duì)讀寫(xiě)相關(guān)的操作進(jìn)行監(jiān)控,每次去修改對(duì)應(yīng)的內(nèi)核源碼編譯重刷過(guò)于耗時(shí)耗力,這里就來(lái)嘗試編寫(xiě)一個(gè)內(nèi)核驅(qū)
    的頭像 發(fā)表于 04-23 11:15 ?1620次閱讀
    AOSP<b class='flag-5'>源碼</b>定制-<b class='flag-5'>內(nèi)核</b>驅(qū)動(dòng)編寫(xiě)

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品