色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

鴻蒙輕內核源碼分析:MMU 協處理器

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-20 14:28 ? 次閱讀

1、 ARM C15 協處理器

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

wKgZomXURhaAGcYoAAMU1aaKtPg526.png

wKgaomXURh-AUmc6AAF_vM3IDzA715.png

wKgaomXURjKAZrqSAAHXMTBCZzI662.png


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

CP15 C2 寄存器

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

CP15 C7 寄存器

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

CP15 C13 寄存器

Context ID Register (CONTEXTIDR)、Software thread ID registers 用于保存進程標識符(asid 地址空間編號)。

2、ARM C15 協處理器匯編指令

訪問 CP15 寄存器的指令主要是 MCR 和 MRC 這兩個指令。本小節詳細介紹下這 2 個匯編指令。先看下指令的含義,MCR 是 ARM 處理器寄存器到協處理器寄存器的數據傳送指令,英文為 Move CPU register to coprocessor register,MRC 是協處理器寄存器到 ARM 處理器寄存器的數據傳送指令,英文為 Move from coprocessor register to CPU register。這 2 個指令的語義格式如下,可以看出語義格式是一樣的,但是讀取寫入含義會有差異。MCR 是讀取 Rt 寄存器寫入協處理器寄存器 CRn、CRm,而 MRC 是讀取協處理器寄存器 CRn、CRm 寫入 Rt 寄存器。

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

MCR 詳細的語義介紹如下:

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.協處理器的名稱,標準名稱為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.要寫入的協處理器寄存器。

MRC 詳細的語義介紹如下:

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.協處理器的名稱,標準名稱為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.要寫入的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.要讀取的協處理器寄存器。

3、MMU 匯編代碼

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

3.1 CP15 C2 TTBR 轉換表基地址寄存器

代碼比較簡單,結合下圖,自行查看即可。該圖來自《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 高速緩存寄存器

代碼比較簡單,結合下圖,自行查看即可。該圖是 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 進程標識符寄存器

代碼比較簡單,結合下圖,自行查看即可。

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 上下文切換

在之前的系列,我們了解到每個用戶進程都有獨立的進程空間。在進程切換時,MMU 上下文也會切換,相應的函數為 LOS_ArchMmuContextSwitch ()。快速分析下該函數的代碼。

⑴處讀取 TTBCR 寄存器的狀態值,如果傳入參數 archMmu 不為空,執行⑵使能 TTBR0,否則執行⑶使其失能 TTBR0。⑷處把內核地址空間的進程空間標識符 asid 寫入 C13 寄存器。⑸處更新 TTB 頁表基地址和 TTB 狀態信息到相應寄存器。⑹處把進程空間的進程標識符寫入 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 }



審核編輯 黃宇

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

    關注

    68

    文章

    19548

    瀏覽量

    231872
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9217

    瀏覽量

    371162
  • 源碼
    +關注

    關注

    8

    文章

    657

    瀏覽量

    29799
  • MMU
    MMU
    +關注

    關注

    0

    文章

    92

    瀏覽量

    18450
  • 鴻蒙
    +關注

    關注

    57

    文章

    2411

    瀏覽量

    43303
收藏 人收藏

    評論

    相關推薦

    設計了一個基于浮點數運算的處理器,使用C語言編程時沒法輸入float型數據,請問有哪些部分需要修改?

    我設計了一個基于浮點數運算的處理器,使用C語言編程時沒法輸入float型數據,請問有哪些部分需要修改?SDK,EXU_decoder浮點寄存都需要修改嗎,謝謝
    發表于 03-07 16:03

    低功耗處理器的優勢分析

    隨著科技的飛速發展,電子設備的種類和數量不斷增加,人們對設備的能效要求也越來越高。低功耗處理器因其在節能、環保和成本效益方面的優勢而受到廣泛關注。 低功耗處理器的定義 低功耗處理器是指在設計時
    的頭像 發表于 02-07 09:14 ?394次閱讀

    EE-174:ADSP-TS101S TigerSHARC處理器引導加載程序內核操作

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

    EE-345:SHARC處理器的啟動內核定制和固件可升級性

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

    EE-290:管理SHARC處理器上的內核PLL

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

    OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發板演示

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

    全志T536系列處理器特性概述 集成RISC-V E907處理器

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

    使用TMS320C6416處理器:Turbo處理器(TCP)

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

    使用TMS320C6416處理器:Viterbi處理器(VCP)

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

    TMS320C6416處理器和誤碼率

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

    【開源鴻蒙】使用QEMU運行OpenHarmony量系統

    本文將會介紹如何從源碼安裝QEMU 6.2.0,以及如何使用QEMU運行OpenHarmony量系統。通過本文,你將會對QEMU和OpenHarmony量系統又一個初步的認知,并對如何使用QEMU又一個初步的理解和體會。
    的頭像 發表于 09-14 08:51 ?863次閱讀
    【開源<b class='flag-5'>鴻蒙</b>】使用QEMU運行OpenHarmony<b class='flag-5'>輕</b>量系統

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

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

    請問ESP32s3 ULP RISC-V處理器是否支持ADC的讀取?

    我在ULP RISC-V處理器的例程中,沒有發現有對ADC的操作,請問RISC-V處理器目前還不支持嗎?使用的IDF版本為4.4.2。 我想在ULP模式下,通過ADC來讀取外部器件
    發表于 06-14 07:38

    AOSP源碼定制-內核驅動編寫

    有時候為了分析一些殼的檢測,需要在內核層面對讀寫相關的操作進行監控,每次去修改對應的內核源碼編譯重刷過于耗時耗力,這里就來嘗試編寫一個內核
    的頭像 發表于 04-23 11:15 ?1550次閱讀
    AOSP<b class='flag-5'>源碼</b>定制-<b class='flag-5'>內核</b>驅動編寫

    什么是嵌入式微處理器?嵌入式微處理器有哪些?

    嵌入式微處理器是指嵌入到特定應用系統中的微處理器,它是整個嵌入式系統的核心,由通用處理器演變而來,具有體積小、重量、成本低、可靠性高等優點。與通用
    的頭像 發表于 03-29 11:39 ?1238次閱讀
    主站蜘蛛池模板: 99热婷婷国产精品综合 | 国产亚洲精品在线视频 | 性绞姿始动作动态图 | 亚欧成人毛片一区二区三区四区 | 天天狠狠色噜噜 | 午夜视频无码国产在线观看 | 国产欧美日韩中文视频在线 | 亚洲一品AV片观看五月色婷婷 | 亚洲乱码日产精品BD在线下载 | 伊人久久青草 | 国产亚洲精品久久久久久线投注 | 暖暖 免费 高清 日本视频5 | 国产人在线成免费视频 | 青青草国产自偷拍 | p影院永久免费 | 97视频免费观看2区 97视频免费观看 | 麻豆人妻无码性色AV | 日韩a视频在线观看 | 免费人成网站在线观看10分钟 | 久久久无码精品亚洲A片猫咪 | 最新无码二区日本专区 | 久久高清内射无套 | 视频一区国产精戏刘婷30 | 一个人的免费完整在线观看HD | 鸭子玩富婆流白浆视频 | 九色PORNY真实丨国产免费 | 男人的天堂久久精品激情a 男人的天堂黄色片 | 在线观看免费亚洲 | 麻豆第一区MV免费观看网站 | 海角社区在线视频播放观看 | 在线播放国产视频 | 国产一区二区内射最近更新 | 97超在线视频 | 伊人久久大线蕉香港三级 | 黑丝美女娇喘 | 果冻传媒完整免费网站在线观看 | 天美传媒果冻传媒入口视频 | 中文字幕在线观看亚洲 | 久久91精品国产91 | 亚洲免费观看视频 | 啊轻点啊再深点视频免费 |