0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开启MMU会出现的问题及解决方案

Linux阅码场 来源:Linux阅码场 作者: baron 2022-06-15 08:55 次阅读

作者简介:

Baron (csdn:代码改变世界ctw),九年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发

注:说明本文的介绍都是基于armv8-aarch64或armv9硬件架构

在mmu未开启阶段,PC操作的都是物理地址执行程序,这样看起来一切正常,没啥问题。

例如:取指(到物理地址0x4000处取指)、译码、执行取指(物理地址0x4004处取指)、译码、执行取指(物理地址0x4008处取指)、译码、执行取指(物理地址0x400C处取指)、译码、执行

但是呢,假如程序在执行的过程中,你突然打开了MMU,那么会发生什么呢?比如在前面的示例中,就会出现,程序本来执行在0X4000、0x4004处好好的,而0x4004切好是enable_mmu指令,那么接下来PC将取值0x4008处地址的指令,由于此时MMU已经被打开了,那么0x4008会被当作虚拟地址,经过MMU翻译...

经过MMU,那么就可能出现了两种问题:一是虚拟地址0x4008所对应的页表没有建立,此时会产生prefetch abort;二是虚拟地址0x4008所对应的页表已经建立了(例如指向物理0x9004处),那么此时cpu期望访问物理地址0x4008处的,就被突然变成了访问物理地址0x9004处了。

取指(到到物理地址0x4000处取指)、译码、执行取指(物理地址0x4004处取指)、译码、执行 -- 这条指令是开启MMU取指(到虚拟地址0x4008处取指,经MMU单元后,要么是invalid,要么是0x9004)、译码、执行......

d490aaa8-ec3f-11ec-ba43-dac502259ad0.png

为了解决上述描述的问题,下面给出了两种解决方案:第一种方案:在开启MMU之前,我先对正在执行的这一小块代码建立个页表(一一映射),那么此时的逻辑就变成了:

取指(到到物理地址0x4000处取指)、译码、执行取指(物理地址0x4004处取指)、译码、执行 -- 这条指令是开启MMU取指(到虚拟地址0x4008处取指,经MMU单元后,物理地址依然是是0x4008)、译码、执行 -- 程序没有跑飞......

d4a2db1a-ec3f-11ec-ba43-dac502259ad0.png

第二种方案:在开启MMU之前,我确实建立个页表(不是一一映射哦,这是正常业务的页表),此时的逻辑如下:

取指(到到物理地址0x4000处取指)、译码、执行取指(物理地址0x4004处取指)、译码、执行 -- 这条指令是开启MMU取指,到虚拟地址0x4008处取指,经MMU单元时在页表是找不到0x4008这个虚拟地址的(因为没做map),所以会产生prefetch abort异常、而在异常代码ERET返回时,正好返回到0xXXXX地址处,该地址是虚拟地址,正好MAP到0x4008物理地址,程序得到继续执行,译码、执行 -- 程序很顺利哦......

d4b714f4-ec3f-11ec-ba43-dac502259ad0.png

如果看到此处,您没有看懂,没关系,请看下列代码示例:

d4caa3a2-ec3f-11ec-ba43-dac502259ad0.png

程序在(1)处将 mmu_on_addr链接地址(虚拟地址)写入到了X30寄存器中程序在(2)处enable MMU,此时下一条指令取指,将被当作成虚拟地址,经过MMU翻译,而对应的页表中自然是没有这个地址(物理地址被当作成的虚拟地址),所以此时将产生sync abort...程序在(3)处不会被执行,因为上面已经sync abort了

跳转到sync abort后,代码如下方所示,什么都没干,直接ret返回了。


	
  1. vector_entry sync_exception_sp_elx

  2. ret

ret指令返回的,PC自然是自动指向X30地址处,即 mmu_on_addr链接地址(虚拟地址),程序继续跑,一切步入正常流程...

原文标题:Baron:程序运行过程中突然打开MMU会怎么样?

文章出处:【微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    606

    浏览量

    35612
  • 程序
    +关注

    关注

    116

    文章

    3754

    浏览量

    80738
  • MMU
    MMU
    +关注

    关注

    0

    文章

    91

    浏览量

    18245

原文标题:Baron:程序运行过程中突然打开MMU会怎么样?

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TLE9879开启看门狗后不喂狗也不会出现复位的现象是为什么?

    开启看门狗后不喂狗也不会出现复位的现象,用官方例程也是一样的效果,有人遇到过这个情况吗?
    发表于 02-19 07:06

    uart串口和mqtt同时启用,开启蓝牙扫描就会出现wifi连接超时和mqtt心跳包收不到的情况,为什么?

    uart串口和mqtt同时启用,这时候开启蓝牙扫描就会出现wifi连接超时和mqtt心跳包收不到的情况。 也可以是我蓝牙扫描和mqtt在共存时,这时加上一个uart就会出现wifi超时,mqtt
    发表于 06-05 06:06

    立体智慧仓储解决方案.#云计算

    解决方案智能设备
    学习电子知识
    发布于 :2022年10月06日 19:45:47

    关于页表和MMU的问题

    刚开始学,好多东西都云里雾里的TT为什么在bootloader里要进行页表初始化然后开启MMU,然后在进入内核后还要创建页表开启MMU?这两个有什么不一样么?s3c2410,bootl
    发表于 05-06 17:25

    有对MMU比较了解的吗?

    我最近在写一个MMU的裸机程序,但是无论怎么映射都不行,一旦开启MMU,程序就会卡住。我想问的是写MMU的程序对链接脚本和程序本身有什么特别的要求吗?我的映射代码如下(0~0x6000
    发表于 01-10 21:43

    裸机MMU实验出现以下问题该怎么办?

    刚接触裸板程序,自己编mmu,make出问题,然后用韦老师MMU实验代码,make也出现问题如图,
    发表于 08-28 22:42

    为什么使用STM32F103的RTC会出现外部的晶振不起振现象呢

    为什么使用STM32F103的RTC会出现外部的晶振不起振现象呢?有什么解决方案吗?
    发表于 11-24 06:44

    am335x裸机开启mmu和cache后,ucos2任务不能调度如何排查?

    beaglebone 开启mmu和cache后,ucos2卡在 OSStartHighRdy,无法调度任务,请问如何排查?
    发表于 01-12 06:41

    为什么笔记本会出现暗屏

    为什么笔记本会出现暗屏   您好,为什么笔记本会出现暗屏呢? 屏暗是怎样产生呢?普遍有以下4种情况:第一种是灯管出
    发表于 01-21 11:27 815次阅读

    MMU和页表工作机制的简单评析

    对于一个有MMU的CPU而言,MMU开启后,CPU是这样寻址的:CPU任何时候,一切时候,发出的地址都是虚拟地址,这个虚拟地址发给MMU后,MMU
    的头像 发表于 02-02 14:08 1.1w次阅读
    对<b class='flag-5'>MMU</b>和页表工作机制的简单评析

    MacBook Air会出现防反射涂层问题

    苹果本周在与苹果授权服务提供商共享的备忘录中指出,配备Retina显示屏的MacBook Air型号可能会出现防反射涂层问题。备忘录指出:“某些MacBook,MacBook Air和MacBook Pro电脑上的视网膜显示屏可能会出现防反射涂层问题。”
    的头像 发表于 03-27 14:39 2897次阅读

    内存条坏了电脑会出现什么现象

    内存条坏了电脑会出现什么状况呢,下面我们来告诉你吧。内存条坏了电脑会出现以下状况:
    发表于 06-17 10:33 3.6w次阅读

    为什么要用MMU?为什么要用虚拟地址?

    既然MMU开启后,硬件会自动的将虚拟地址转换成物理地址,那么还需要我们软件做什么事情呢?即创建一个页表翻译都需要做哪些事情呢?或者说启用一个MMU需要软件做什么事情呢?
    的头像 发表于 04-26 14:37 4797次阅读

    Wi-Fi 6 开启物联网解决方案

    新技术星期二:Wi-Fi 6 开启物联网解决方案
    的头像 发表于 12-30 09:40 745次阅读

    为什么我的电源会出现振铃和过热?

    重点分析 电感问题。设计人员为了获得各种优势,例如减少输出纹波和尽量缩减解决方案尺寸,往往会选择超出推荐范围的电感值。然而,选择电感值过大或过小的元件都会导致意想不到 的后果,可能会造成芯片严重损坏
    的头像 发表于 05-22 12:52 324次阅读
    为什么我的电源<b class='flag-5'>会出现</b>振铃和过热?