optee中core_init_mmu_regs函数解读
★★★ 个人博客导读首页—点击此处 ★★★
在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函数解读相关推荐
- optee中添加一个中断以及底层代码的相关解读
optee.中断.gic.gicv3.itr_add.安全中断.tee.trustzone.ATF ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aa ...
- optee内核中malloc函数的原理介绍
文章目录 1.链接文件和汇编文件的对比分析 2.malloc和calloc 3.optee中的内核栈 ★★★ 友情链接 : 个人博客导读首页-点击此处 ★★★ 1.链接文件和汇编文件的对比分析 可用查 ...
- 语义分割中的mIoU计算函数解读
代码来自于CVPR2018的一篇文章Context Encoding for Semantic Segmentation. github工程地址为:https://github.com/zhangha ...
- Python中range函数的基本用法完全解读
range函数大多数时常出现在for循环中,在for循环中可做为索引使用,下面这篇文章主要给大家介绍了关于Python中range函数的基本用法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 ...
- c语言中 允许函数重载么,简述C++语言支持函数重载问题介绍
对于C++语言作为一种欲与C兼容的语言,C++语言保留了一部分过程式语言和特点,foo_int_int这样的名字包含了函数名.函数参数数量及类型信息,C++语言就是靠这种机制来实现函数重载的. 因而它 ...
- c++和c语言中的函数相互调用的问题
1.如何C++程序要调用 已编译后的C函数,该怎么办? (1)假设某个C函数的声明如下: void foo(int x, int y); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则 ...
- optee中User TA的加载/验签和运行
文章目录 1.TA的加载到TEE内存 思考:- User TA是怎样编译的?- User TA是怎样签名的?- User TA是怎样被load到内存的?- 怎样验证TA签名的?- 如何解析TA hea ...
- [optee]-optee中的异常向量表的实现
Optee异常向量表 ARMV8-aarch64 1.optee中定义的异常向量表 2.optee中设置向量表基地址VBAR_EL1 ARMV8-aarch32.ARMV7-aarch32 1.opt ...
- dart系列之:dart语言中的函数
文章目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函 ...
最新文章
- DP----解码,输出多少种译码结果
- 运动会管理系统php,运动会管理系统源代码.doc
- 多于2个字符串的拼接,禁止使用“+”,而应该用join
- Quartus16.0如何使用TCL脚本
- 链式运动JavaScript实现
- Android 设置定时刷新页面数据,最小自动刷新时间
- 力扣700. 二叉搜索树中的搜索(JavaScript)
- eclipse build慢问题
- 下个月计划【2009-5】
- UVA 839 Not so Mobile 数据结构
- 中切片工具怎么使用_技巧|Excel中切片器的2个使用方法!
- response.sendRedirect()与request.getRequestDispatcher().forward()区别
- 第三章 硅谷宠儿 Friendster (二)
- c 实现走迷宫流程图_迷宫求解(有流程图).doc
- Xshell快速命令集解放生产力
- 软件测试-web自动化测试教程
- 腾讯文智自然语言处理-分词API Python小实验
- 微盟副总裁樊欣:洞见下一个风口
- tableau实战案例-分析120个国家和地区的自杀率情况
- 高德离线地图WMS/WMTS服务
热门文章
- 国内数据中心制冷系统设计与发展
- 如何处理数据中心电缆管理问题?
- 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?
- 北京排查利用数据中心挖矿,IDC矿场受影响较大
- 机房空调清理杨柳絮操作
- 开发商微信选房后不退认筹金_认筹金贸然转定金退不回 购房人认栽?
- 成功解决Exception “unhandled ImportError“cannot import name ‘imresize‘ from ‘imageio‘
- Py之tornado:tornado库的简介、安装、使用方法之详细攻略
- 成功解决ModuleNotFoundError: No module named ‘sklearn.learning_curve‘
- DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现