前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >aarch64系统级体系架构之异常级别

aarch64系统级体系架构之异常级别

作者头像
bigmagic
发布2020-05-07 09:56:25
1.7K0
发布2020-05-07 09:56:25
举报
文章被收录于专栏:嵌入式iot嵌入式iot

aarch64系统级体系架构之异常级别

  • 1.简述
  • 2.树莓派启动深度解析
  • 3.不同异常级别需要注意的问题

1.简述

系统的异常级别对于arm芯片来说非常的重要,对于操作系统层面上来说,理解芯片的体系架构,将很容易的进入状态,随心所欲的去玩转芯片,对于做应用来说,熟悉芯片的体系架构,可以解决非常棘手的问题,比如系统的安全还有就是实时性响应问题。比如我们的手机指纹加密数据,实际上是在安全模式下的,此时对于运行在非安全模式下的操作系统,其实是获取不到指纹的数据的,只是处理安全模式下发送过来的结果,类似的还有支付安全。

对于armv8异常级别,其实是一个很大的话题,但是深入理解之后,就会发现这时一个很有意思的东西。看过盗梦空间的电影都知道,梦有好多层,但是那一层是真实的,那一层是梦境,真实到梦境如何切换,梦境到真实如何切换,这真的是不识庐山真面目,只缘生在此山中

本文简单介绍一下树莓派启动的异常级别,如何从不同的exception level进行切换,同时启动的时候如何指定exception level,大体上去理解异常级别。

2.树莓派启动深度解析

树莓派的启动流程,我想简单叙述一下,就是上电之后,启动了GPU,然后通过GPU去启动arm的核,然后就是读取配置文件,设置ddr等等。如果sd卡里有kernel8.img文件,那这个就是Linux内核执行的程序。此时,Linux就执行起来了。

对于rt-thread来说,情况是一样的,可以在config.txt里写下如此的文件

代码语言:javascript
复制
kernel=kernel8.img
kernel_addr=0x80000
enable_uart=1

这就告诉树莓派,需要启动的固件名字是kernel8.img,入口地址0x80000

其实这并不是芯片上电后执行的第一个程序,还运行了一个叫start.elf的文件,该文件会加载kernel8.img。通过测试得知,树莓派其实在kernel8.img的入口的第一条指令是在el2下的。关于el3,el2,el1,el0可以看下面的图进行理解。

应用程序运行在EL0上,此时可以访问的寄存器很有限,比如我们安卓手机安装的app,其实都是运行在EL0的。而EL1是运行Kernel的,比如Linux的或者是rt-thread。

到了EL2就是提供了虚拟化的实现,这一层涉及到虚拟化,在服务器上用的比较多。

然后就是EL3,这个比较厉害,权限比较大,基本上可以访问所有寄存器,而且电源管理,也在里面。另外这个就类似于一个电梯,打通了安全与非安全的通道。

树莓派启动内核在EL2里面,那么我们知道操作系统运行在EL1的非安全模式下,安全模式是对于安全应用场景的,这里不做考虑,但是如果要访问GIC的组,一般是在安全模式。

目的就是从EL2->EL1。

代码语言:javascript
复制
    // enable AArch64 in EL1
    mov     x0, #(1 << 31)          // AArch64
    orr     x0, x0, #(1 << 1)       // SWIO hardwired on Pi3
    msr     hcr_el2, x0
    mrs     x0, hcr_el2

    // change execution level to EL1
    mov     x2, #0x3c4
    msr     spsr_el2, x2        // 1111000100
    adr     x2, .L__in_el1
    msr     elr_el2, x2
    eret                        // exception return. from EL2. continue from .L__in_el1

主要就是使能el1在64位模式下运行,然后配置系统从EL2->>EL1,采用的是eret指令,该指令会将pc指针指向elr_el2对应的地址。

如果我们想要树莓派在el3上运行,可以采用MVC指令进行模式切换。

svc,hvc,smc指令切换,对EL1~3有三种不同的中断向量。

不想进行指令切换,最简单的办法,就是编译一个链接地址为0的固件,在config.txt中写下

代码语言:javascript
复制
armstub=kernel8.img

此时,系统从el3运行,并且起始地址为0。和芯片上电执行第一条指令模式类似。

3.不同异常级别需要注意的问题

既然涉及到异常级别,那就不得不说一下使用异常级别需要注意的问题了。安全和非安全这是物理隔离的,但是异常级别却是需要进行切换的。比如我们从非安全到安全,是不能直接切换过去的,需要借助el3这个电梯,可以借助这个过去。

然后就是你在el1上访问某些寄存器的时候,突然系统hard fault,这时就要看aarch64的芯片手册了,看这个寄存器是在那个异常级别下可以访问的。有些寄存器在不对应的异常级别,读为零,写无效。比如GIC的某些寄存器。

异常级别对于芯片的体系架构非常重要,做底层开发,离不开体系架构知识,做上层开发理解芯片体系架构更好,设计更加符合芯片设计的产品,做更加性能优化的产品是非常好的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • aarch64系统级体系架构之异常级别
    • 1.简述
      • 2.树莓派启动深度解析
        • 3.不同异常级别需要注意的问题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档