热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《ARMv8A编程指南》阅读笔记01

前言ARMv8是ARM公司在2013年推出的架构,对于面向系统底层开发的工程师来说,准确理解ARM处理器内部的工作原理是至关重要的。本书专注于陈述处理
前言

ARMv8是ARM公司在2013年推出的架构,对于面向系统底层开发的工程师来说,准确理解ARM处理器内部的工作原理是至关重要的。
本书专注于陈述处理器的行为,而不会详细解释处理器内部的工作原理以及如此设计的原因。

第一章 简介

ARMv8有64-bit或32-bit两种运行状态,分别用AArch64和AArch32表示,其中AArch32的保留使v8架构向后兼容ARMv7。换句话说,基于ARMv7架构编写的代码可以在v8架构上运行,但是反过来不行。
Cortex-A系列处理器以及它们所属的架构如下所示:

ARMv7-AARMv8-A
Cortex-A5, Cortex-A7, Cortex-A8, Cortex-A9, Cortex-A15, and Cortex-A17Cortex-A53, Cortex-A57 and Cortex-A72

从ARMv7的32位升级到v8架构的64位所带来的好处有:

  1. A64指令集可以带来显著的性能提升,它提供了一个更大的寄存器池(register pool)。这些相比于之前的ARMv7多出来的寄存器可以用于函数之间的传参,使最大形参数量从原来的4个提高到8个,减少了堆栈操作,提高效率。
  2. 提高了64位数据进行算数运算的速度。
  3. 64位的操作允许使用更大的虚拟内存空间,从原来的32bits(4GB)拓展到了40bits。这样所带来的好处是可以处理更大体积的文件,即使我们没有足够大的物理内存空间,可以通过虚拟内存对文件内容进行映射。
  4. 当然,64bits的位宽也会带来一些负面影响:①指针长度的增加会产生额外的内存空间消耗。②可访问内存空间的增加会导致cache的命中率降低,降低运行效率。

第二章 ARMv8-A 架构和处理器

在这里插入图片描述
上图为Cortex-A53处理器的结构示意图,这是一款中规格,主打低功耗、高效率的处理器架构,最多封装4个核心协同工作。
在这里插入图片描述
上图为Cortex-A57架构处理器的示意图,这是ARMv8架构的全规格处理器,最多封装4个核心在一个处理器中,支持CoreSight调试技术。使用无序,15+级流水线,对L2 Cache进行优化,何以使多个核心同时访问。

第三章 ARMv8基础

使用ARMv8架构的处理器运行时,会在4个异常模式中切换。在AArch64中,异常模式的级别决定了优先级,也就是说ELn(Exception Level)对应于PLn(Privilege Level)。n的数值越大,异常等级越高。

异常等级运行状态
EL0正常用户应用程序所使用的等级
EL1操作系统内核专用
EL2超级管理员模式
EL3底层固件(包括安全监视器),所使用的异常等级

在这里插入图片描述
在这里插入图片描述
总而言之,一段代码在运行时,无论这段代码是属于普通应用程序还是系统内核又或是超级管理员,只能占据一个异常等级。但是核内超级管理员(in-kernal hypervisors)是一个例外,例如KVM(kernal-based virtual machine),它在EL2和EL1异常等级中穿插运行。

3.1 运行域

ARMv8-A提供安全和非安全(Secure and Non-secure)两种运行域(World)。其中,非安全域也被认为是正常域(Normal World)。在正常域中,可以允许另外一个操作系统与可信操作系统(trusted OS)在同一套硬件平台上并行运行,并且提供特定的软硬件攻击保护。ARM TrustZone 技术允许操作系统在正常域和安全域之间分区。和ARMv7-A架构一样,安全监视器(Secure monitor)充当正常域和安全域间转移门户的角色。如下图所示:
在这里插入图片描述

ARMv8-A在正常域(Normal World)中提供对虚拟化的支持,这意味着CPU可以运行超级管理员或虚拟机管理器(VMM,Virtual Machine Manager)的相关代码,并且支持多用户操作系统。
在多用户操作系统中,每一个用户的操作系统本质上都是虚拟机,但每一个虚拟机操作系统都不会察觉到正在和其他的系统共享资源。

  • 正常域,由如下几种程序可以运行在特权模式(PL0不属于特权模式):
    1. 用户系统内核(Guest OS Kernal):这类内核包括运行在EL1异常等级的Linux或Windows内核。当它们的异常等级低于超级管理员(EL2),多个系统内核可以运行在客户端模式或主机模式,这取决于超级管理员的调度。
    2. 超级管理员:该状态的异常等级为EL2,通常是非安全的。当使能并运行在超级管理员模式时,可以向多个系统内核提供虚拟化服务。
  • 安全域(Secure World)
    1. 安全固件(Secure firmware):在处理器上电时,处理器固件是首先被运行的。固件可以提供诸多服务,包括硬件平台的初始化,可信操作系统(Trusted OS)的启动以及安全监视器的调度。
    2. 可信操作系统:可信操作系统为正常域提供安全服务,并且为执行安全(executing Secure)和可信应用(trusted applications)提供实时运行环境。
      安全监视器(Secure monitor)在ARMv8架构中享有最高异常等级,和最大优先级,它掌管软件的优先级调度逻辑。

3.2 运行状态(Execution states)

ARMv8架构定义有AArch64和AArch32两个运行状态,这两个状态分别使用64bits位宽的通用寄存器或是32bits位宽的通用寄存器。为了向后兼容,AArch32仍然保持ARMv7的优先级定义,但在AArch64中优先级与异常等级一致,即ELn对应于PLn。
当运行在AArch64状态时,处理器使用A64指令级;当运行在AArch32状态时,处理器既可以执行A32(原ARM指令集)指令级也可以执行T32(Thumb)指令级。
在这里插入图片描述
在这里插入图片描述
通过对比可以发现,在AArch32中,可信操作系统的软件执行在EL3中而在AArch64状态下则是运行在EL1中。

3.3 改变异常等级

在ARMv7架构中,处理器模式可以在特权软件的控制下改变或是在异常发生时自动改变。当一个异常出现时,CPU内核会保存异常状态并且返回当前的运行地址,进入到需要的模式,并且有可能禁止硬件中断。
用户应用程序的优先级最低,PL0,也就是之前的非特权模式;操作系统内核在PL1优先级运行;在一个启用虚拟化拓展的系统中,超级管理员(管理程序)的运行优先级是PL2;安全监视器作为安全域和正常域之间转换的门户,也运行在PL1优先级(这里指的是ARMv7)。对应的表格描述如下:
在这里插入图片描述
在ARMv8,AArch32架构中,处理器模式与异常等级之间的映射关系如下图所示:
在这里插入图片描述
当异常发生时,处理器会改变到对应的异常等级来处理发生的异常。
异常之间的跳转遵循以下原则:

  1. 当异常等级提高时,例如从EL0到EL1,同时也意味这软件执行优先级的提高。

  2. 任何异常都不能降级到比原来更低的异常级别。

  3. 异常会改变原来程序的执行顺序,当大于EL0的异常发生时,一个异常句柄(handler)将会随即启动,该句柄的地址由中断向量表进行映射。
    这类异常包括:

    • 中断请求(IRQ)以及快速中断请求(FIQ)
    • 存储系统终止(Memory System Abort)
    • 未定义指令
    • 系统级调用(System calls),该异常可以允许非特权(PL0)向操作系统程序发起系统及调用请求。
    • 安全监视器或超级管理员(管理程序)陷阱
  4. 结束异常处理,返回到之前的异常等级的动作是通过执行ERETERETERET指令完成的。

  5. 从一个异常返回时,可以继续停留在该等级或进入一个较低的异常等级。不能在异常返回时进入一个更高的异常等级。

  6. 安全域会随着异常等级的改变而改变,除了从EL3返回到正常域的情况。


3.3 改变运行状态

有时候我们不得不改变系统的运行状态。例如我们想在一个64位的操作系统中运行异常等级为EL0的32位的应用程序,为了实现这个目的,CPU必须从AArch64进入到AArch32运行状态。
当应用程序运行结束或交还CPU使用权给操作系统,CPU则必须从AArch32切换回到AArch64。但是需要注意,一个AArch32的操作系统不能切换到AArch64执行64位的应用程序。
为了改变CPU的运行状态并维持切换前后的异常等级不变。必须先切换到更高的异常等级然后再回到原本的异常等级。例如,我们的应用项目中同时有32位和64位的应用程序,在64位操作系统的环境下运行。在这种情况下,32位的应用程序可以产生、执行一个超级管理员调度(Supervisor Call,SVC)指令,或是收到一个中断,使异常等级升高到EL1,完成从AArch32到AArch64的切换。之后操作系统可以进行任务切换,回到AArch64运行模式下的EL0异常等级。从实际操作的角度,这意味着我们不能运行一个混合了64bits和32bits指令的应用程序,因为这些指令之间无法相互调用。
总结:我们通过触发异来实现运行状态之间(AArch32和AArch64之间)的相互转换。
另外,执行在EL3等级的代码无法通过异常来到更高的异常等级,所以也就无法从该异常等级改变运行状态,除非进行复位。
下面是在AArch32和AArch64运行状态之间进行转换的要点总结:

  1. AArch32和AArch64的执行状态有大致类似的异常等级,但是在安全域和非安全域的划分上稍有区别。异常发生时,处理器所处的运行状态会对另一运行状态的可用异常等级有所限制。
  2. 切换到AArch32需要从一个更高的异常等级切换到较低的异常等级,这是由执行异常句柄过程中的ERETERETERET指令导致的。
  3. 从AArch32切换回到AArch64需要从一个较低的异常等级升高到较高的异常等级,触发异常等级切换的异常事件可以是外部信号也可以是指令的执行。
  4. 如果处理异常事件或从异常事件中返回时,异常等级没有发生改变,运行状态不会发生改变。
  5. 当CPU运行在AArch32状态时,异常状态的切换逻辑同ARMv7保持一致。当运行在AArch64状态时,异常的切换逻辑参阅第十章。

两个运行状态的相互配合发生在安全监控器,超级管理员或操作系统层面。一个运行在AArch64超级管理员(管理程序)或操作系统可以支持较低优先级的AArch32操作。这意味着,一个运行在AArch64状态的操作系统可以支持运行在AArch32以及AArch64的应用。类似的,一个AArch64的超级管理员(管理程序)可以支持AArch32以及AArch64的操作系统。但是反过来,一个32位的操作系统不能兼容64位的应用程序,同样,32位的超级管理员(管理程序)也不能兼容64位的操作系统。
在这里插入图片描述
对于最高的应用程序异常状态EL3,当异常发生时,用于每一个异常等级的运行状态是一定的。异常等级只有在处理器复位后才能改变。对于EL2和EL1,运行状态由系统寄存器决定。


推荐阅读
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温Linux内核:互斥和同步相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
author-avatar
14795823364-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有