★★★ 个人博客导读首页—点击此处 ★★★

在optee中有下列一段代码,未开启MMU之前,先使用了virt_to_phys,然后才将页表基地址写入到TTBR0,然后才开启MMU,是否感到很奇怪?

bl   core_init_mmu_map
bl  core_init_mmu_regs
bl  cpu_mmu_enable
bl  cpu_mmu_enable_icache
bl  cpu_mmu_enable_dcache
void core_init_mmu_regs(void)
{uint64_t mair;uint64_t tcr;paddr_t ttbr0;uint64_t ips = calc_physical_addr_size_bits(max_pa);ttbr0 = virt_to_phys(l1_xlation_table[0][get_core_pos()]);   ------------------------ 虚拟地址转物理地址mair  = MAIR_ATTR_SET(ATTR_DEVICE, ATTR_DEVICE_INDEX);mair |= MAIR_ATTR_SET(ATTR_IWBWA_OWBWA_NTR, ATTR_IWBWA_OWBWA_NTR_INDEX);write_mair_el1(mair);tcr = TCR_RES1;tcr |= TCR_XRGNX_WBWA << TCR_IRGN0_SHIFT;tcr |= TCR_XRGNX_WBWA << TCR_ORGN0_SHIFT;tcr |= TCR_SHX_ISH << TCR_SH0_SHIFT;tcr |= ips << TCR_EL1_IPS_SHIFT;tcr |= 64 - __builtin_ctzl(CFG_LPAE_ADDR_SPACE_SIZE);/* Disable the use of TTBR1 */   ------------------------ 禁止TTBR1tcr |= TCR_EPD1;/** TCR.A1 = 0 => ASID is stored in TTBR0* TCR.AS = 0 => Same ASID size as in Aarch32/ARMv7*/write_tcr_el1(tcr);write_ttbr0_el1(ttbr0);   ------------------------ 设置TTBR0的基地址write_ttbr1_el1(0);
}

相关的理解
virt_to_phys将虚拟地址写入到AT S1E1R寄存器,然后从PAR_EL1寄存器读出物理地址
有于MMU没开启,output=input,也就是你读出的物理地址其实就是等于虚拟地址的.

那么为什么还要加上virt_to_phys这一句呢,直接改为ttbr0 = l1_xlation_table[0][get_core_pos()]不更好吗?
可能是因为在系统运行过程中,页表基地址会更新,会重新设置页表基地址。
在首次开机的时候,从l1_xlation_table数组读出的物理地址等虚拟地址,但是等到MMU开启之后,页表更新了,再次调用core_init_mmu_regs想使用l1_xlation_table[0][get_core_pos()]做为基地址时,
它的虚拟地址已经不等于物理地址了,所以需要通过virt_to_phys转一下

optee中core_init_mmu_regs函数解读相关推荐

  1. optee中添加一个中断以及底层代码的相关解读

    optee.中断.gic.gicv3.itr_add.安全中断.tee.trustzone.ATF ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aa ...

  2. optee内核中malloc函数的原理介绍

    文章目录 1.链接文件和汇编文件的对比分析 2.malloc和calloc 3.optee中的内核栈 ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.链接文件和汇编文件的对比分析 可用查 ...

  3. 语义分割中的mIoU计算函数解读

    代码来自于CVPR2018的一篇文章Context Encoding for Semantic Segmentation. github工程地址为:https://github.com/zhangha ...

  4. Python中range函数的基本用法完全解读

    range函数大多数时常出现在for循环中,在for循环中可做为索引使用,下面这篇文章主要给大家介绍了关于Python中range函数的基本用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 ...

  5. c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍

    对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...

  6. c++和c语言中的函数相互调用的问题

    1.如何C++程序要调用 已编译后的C函数,该怎么办? (1)假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则 ...

  7. optee中User TA的加载/验签和运行

    文章目录 1.TA的加载到TEE内存 思考:- User TA是怎样编译的?- User TA是怎样签名的?- User TA是怎样被load到内存的?- 怎样验证TA签名的?- 如何解析TA hea ...

  8. [optee]-optee中的异常向量表的实现

    Optee异常向量表 ARMV8-aarch64 1.optee中定义的异常向量表 2.optee中设置向量表基地址VBAR_EL1 ARMV8-aarch32.ARMV7-aarch32 1.opt ...

  9. dart系列之:dart语言中的函数

    文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...

最新文章

  1. DP----解码,输出多少种译码结果
  2. 运动会管理系统php,运动会管理系统源代码.doc
  3. 多于2个字符串的拼接,禁止使用“+”,而应该用join
  4. Quartus16.0如何使用TCL脚本
  5. 链式运动JavaScript实现
  6. Android 设置定时刷新页面数据,最小自动刷新时间
  7. 力扣700. 二叉搜索树中的搜索(JavaScript)
  8. eclipse build慢问题
  9. 下个月计划【2009-5】
  10. UVA 839 Not so Mobile 数据结构
  11. 中切片工具怎么使用_技巧|Excel中切片器的2个使用方法!
  12. response.sendRedirect()与request.getRequestDispatcher().forward()区别
  13. 第三章 硅谷宠儿 Friendster (二)
  14. c 实现走迷宫流程图_迷宫求解(有流程图).doc
  15. Xshell快速命令集解放生产力
  16. 软件测试-web自动化测试教程
  17. 腾讯文智自然语言处理-分词API Python小实验
  18. 微盟副总裁樊欣:洞见下一个风口
  19. tableau实战案例-分析120个国家和地区的自杀率情况
  20. 高德离线地图WMS/WMTS服务

热门文章

  1. 国内数据中心制冷系统设计与发展
  2. 如何处理数据中心电缆管理问题?
  3. 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?
  4. 北京排查利用数据中心挖矿,IDC矿场受影响较大
  5. 机房空调清理杨柳絮操作
  6. 开发商微信选房后不退认筹金_认筹金贸然转定金退不回 购房人认栽?
  7. 成功解决Exception “unhandled ImportError“cannot import name ‘imresize‘ from ‘imageio‘
  8. Py之tornado:tornado库的简介、安装、使用方法之详细攻略
  9. 成功解决ModuleNotFoundError: No module named ‘sklearn.learning_curve‘
  10. DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现