目录

01.重头戏RISC

​​​​​​02.ARMv8诞生的契机

​​​​​​03.ARMv8-A架构的主要特性

04.基于SkyEye的ARMv8-A架构的仿真实现


1978年底,物理学家Hermann Hauser工程师Chris Curry,在英国剑桥创办了CPU公司(Cambridge Processing Unit),主要业务是为当地市场供应电子设备。1979年,CPU公司改名为Acorn计算机公司。

▲图源网上  Hermann Hauser和Chris Curry

1981年,Acorn计算机公司迎来了一个难得的机遇 。英国广播公司BBC,为提高英国电脑普及水平,打算制作一档节目,他们希望Acorn能生产一款与之配套的电脑。英国政府也参与其中,这意味着电脑一旦采购,将进入英国的每一间教室。

在Acorn计算机公司即将大展身手之际,他们很快发现,自己设计的产品硬件并不能满足需求。因为当时中央处理器的发展潮流,正在从8位变成16位。但Acorn并没有合适的芯片可以用。

起初,Acorn计算机公司在验证了市面上的主流芯片后,由于各种缺陷不能满足要求而苦恼。于是,他们打算去找当时如日中天的Intel,希望对方提供一些80286处理器的设计资料和样品。但是却遭到了拒绝。备受打击的Acorn公司,一气之下决定自己干,从头开始造芯片(别人的山珍海味再香,也不如自己的窝窝头好吃~)。

当时,Acorn公司的研发人员,从美国加州大学伯克利分校,找到了一个关于新型处理器的研究——精简指令集,恰好可以满足他们的设计要求。在此基础上,经过多年的艰苦奋斗,来自剑桥大学的计算机科学家Sophie Wilson和Steve Furber最终完成了微处理器的设计。

▲图源网上-Sophie Wilson和Steve Furber

对于这块芯片,Acorn给它命名为Acorn RISC Machine。Acorn是公司名称,Machine是机器,RISC是精简指令集。嗯,这就是大名鼎鼎的“ARM”三个字母的由来。

01.重头戏RISC

RISC的全称是"精简指令集计算机"(reduced instruction set computer),它支持的指令比较简单,所以功耗小、价格便宜,特别适合移动设备。早期使用ARM芯片的典型设备,就是苹果公司的牛顿PDA。“简化指令集”,是相对于“复杂指令集”(CISC,complex instruction set computer)的一个概念。

早期的处理器都是CISC架构(包括英特尔的处理器),随著时间推移,有越来越多的指令集加入。由于当时编译器的技术并不纯熟,程序都会直接以机器码或是组合语言写成,为了减少程序的设计时间,逐渐开发出指令单一,但可以做复杂操作的程序代码。设计师只需写下简单的指令,再交给CPU去执行就可以了。

但是后来有人发现,整个指令集中,只有约20%的指令常常会被使用到,大约占了整个程序的80%;剩余80%的指令,只占了整个程序的20%。于是,1979年美国加州大学伯克利分校的David Patterson教授提出了RISC的想法,主张硬件应该专心加速常用的指令,较为复杂的指令则利用常用的指令去组合。

最后,ARM“有意无意地”选择了与Intel不同的设计路线——Intel持续迈向x86高效能设计,ARM则专注于低成本、低功耗的研发方向。

02.ARMv8诞生的契机

历史总是诡谲荒诞,原来被Intel最瞧不起的移动端市场业务,竟然在苹果iPhone问世以后,呈现井喷式的爆发增长起来。获利最大的公司之一,当属ARM。因为此时的ARM早已调整了业务方向,改为IP授权的方式,将自己的ARM设计卖给全球的芯片设计和制造公司。

▲图源网上

后面的事情大家都知道了,苹果安卓两家在全球移动端市场平分江山,以ARM的IP为核心的芯片充斥到我们生活的方方面面。并且在芯片制程技术的快速发展下,以及ARM公司的不断努力,手机移动端的处理器性能在不断拔高。彼时,已经出现使用ARM芯片的电脑和服务器了。微软非常机智,很快就发布了适配ARM架构的windows操作系统。

与此同时,新的趋势正在酝酿,主要包括大内存(Large Memory)虚拟化(Virtualization)安全(Security)。Virtualization在ARMv7上已经有简单的硬件实现,Security也有可能基于当前架构扩展,唯有Large memory的需求,有点棘手。

▲图源网上

由于处理器性能越来越强,运行于其上的软件也来越复杂,复杂到单一应用对内存的需求可能超出32-bit架构所能支持的最大内存(4G),这就是Large memory需求的起因。不过,后来的ARMv7架构通过Large Physical Address Extensions (LPAE) 技术,可以支持高达40bits的物理地址空间。但受限于32-bit的指令集,虚拟地址空间依旧只有32bits(4G),如果有应用需要更大的虚拟内存,怎么办?只能定义一个新的架构,使用64-bit的指令集(ARM64)。

很显然,ARMv8应运而生!

既然要做高性能的处理器,那么在指令集和架构设计上,就要丢弃原本ARM指令集的一些设计和包袱。但是又因为ARM的通用性,几乎现在所有的电子端设备都可以看到ARM的身影,于是ARM又保留了向下兼容的特性。

不仅如此,ARM还放弃了早期的处理器核心命名规范,改用全新的cortex系命名规则,并对指令集划分三个方向,分别面向高端、中端、低端三大市场。 中低端芯片在ARMv6、ARMv7指令集架构时代就已见势头,真正看ARM雄厚的芯片设计能力,在高性能端处理器上展现的,还得是ARMv8指令集架构。

ARMv8指令集,同样分了三个系列,ARMv8-A、ARMv8-R、ARMv8-M。由于这里篇幅有限,我们只讨论ARMv8-A架构。那么接下来,就带领大家看看ARMv8架构的精巧设计。

03.ARMv8-A架构的主要特性

看一个架构好不好,不仅要关注一下它的设计重点,还要看看它的发展由来。我们知道,在ARMv8之前,处理器可以工作在多种处理器模式(称作processor mode)下,包括User、FIQ、IRQ、Abort、Undefined、System等,之所以存在不同的模式,主要有2个方面的考虑:安全性和高效性。以ARMv7以前为例:

安全性的角度:不同的处理器模式,有不同的硬件访问权限,称作privilege level。主要有2个level,privilege和non-privilege。其中只有User模式属于non-privilege level,其它均是privilege level。安全起见,大多数时候,软件都运行在User mode。一旦需要其它操作,则需要切换到相应的privilege模式下。这样根据不同的处理器模式,可以利用对硬件的访问权限,做好数据隔离。可以说是最原始、最朴素的安全思想。

高效性的角度:这些处理器模式,除User模式外,其它模式基本上与各类异常一一对应。不同的模式,对应有自己的寄存器,例如R13(SP)、R14(LR)等等,可以使模式切换过程(也是异常处理过程)更为高效、便利。

在ARMv7-A架构时代,对privilege level有了新的定义,称作PL0和PL1。后来又增加了PL2,用于虚拟化扩展(Virtualization Extension)。另外,增加了两个新模式:Monitor和Supervisor,分别用于security扩展和virtualization扩展。

后来,PL0/1/2的概念在ARMv8架构上继续整合,诞生了全新的Exception Level,简称EL0-EL3。Exception level本身就已经包好了privilege的信息,即ELn的privilege随着n的增大而增大。类似地,可以将EL0归属于non-privilege level,EL1/2/3属于privilege level。

这些Exception level的具体意义可参考下图:

这里有一些关键点:

1)ARMv8-A支持64位模式和32位模式。但在AArch64中,已经没有User、SVC、ABT等处理器模式的概念,为了向下兼容,在AArch32里,就把这些处理器模式map到了4个Exception level。

2)Application位于特权等级最低的EL0,Guest OS(Linux kernel、window等)位于EL1,提供虚拟化支持的Hypervisor位于EL2(可以不实现),提供Security支持的Seurity Monitor位于EL3(可以不实现)。

3)只有在异常发生时(或者异常处理返回时),才能切换Exception level(这也是Exception level的命名原因,为了处理异常)。当异常发生时,有两种选择,停留在当前的EL,或者跳转到更高的EL,EL不能降级。同样,异常处理返回时,也有两种选择,停留在当前EL,或者调到更低的EL。

上面提到AArch64,就是在ARMv8首次引入的指令集形式。并且在此基础上,又对以往的指令集版本进行了总结。总共分为四种:A64(固定32位长度指令集)、A32(固定32位长度指令集)、T32(可变32位长度指令集,即Thumb-2)、T16(Thumb)。

现在,我们可以对ARMv8-A架构的主要特性做一下总结:

1)新增一套AArch64的指令集,简称A64。

2)由于需要向下兼容ARMv7,所以同时支持现存的32-bit指令集(A32和T32)。

3)定义AArch64和AArch32两套运行环境(称作Execution state),分别执行AArch64和AArch32指令集。软件可以在需要的时候,切换Execution state,同时物理硬件上也是两套寄存器共存。

4)AArch64最大的改动,使用新的概念(exception level),重新解释了processor mode、privilege level等概念。

5)在ARMv7 security extension的基础上,新增security model,支持安全相关的应用需求。

6)在ARMv7 virtualization extension的基础上,提供完整的virtualization框架,从硬件上支持虚拟化。

04.基于SkyEye的ARMv8-A架构的仿真实现

SkyEye目前支持的ARMv8架构处理器,有国产飞腾系列的FT1500、FT2000AHK、FT2000A/C4等型号。根据SkyEye的仿真框架,指令集与处理器是分开实现的,A64指令集单独抽象,以提供处理器级别仿真的基本能力。

对AArch64仿真,主要抽象了指令集对应的行为,比如exception level,security model和virtualization框架;在此基础上解析到具体的指令集,可以实现ISA级别仿真。

处理器仿真,在指令集仿真框架的基础上,进行差异化实现,主要在处理器的资源差异上进行仿真模块的分配。比如不同处理器支持的MMU有所差异。

参考资料及文献:

[1] 《ARMv8-A指令集手册》

浅谈ARMv8-A系列CPU的架构相关推荐

  1. 浅谈ARM Cortex-M系列架构——架构篇

    浅谈ARM Cortex-M系列架构文章 浅谈ARM Cortex-M系列架构--指令集 目录 前言 1.操作状态 2.操作模式 二.寄存器 1.通用目的寄存器 2.R13,栈指针(SP) 3.R14 ...

  2. 浅谈 MVC、MVP 和 MVVM 架构模式

    2019独角兽企业重金招聘Python工程师标准>>> 谈谈 MVX 中的 Model 谈谈 MVX 中的 View 谈谈 MVX 中的 Controller 浅谈 MVC.MVP ...

  3. 浅谈大型网站之负载均衡架构

    转载自 浅谈大型网站之负载均衡架构 概念 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等 ...

  4. 浅谈Dynamic 关键字系列之三(下):ExpandoObject,DynamicObject,DynamicMetaObject

    接上文:浅谈Dynamic关键字系列之三(上) 为什么TryXXX方法没有被调用?? 将DynamicProduct 中的name修饰符改为private: private string name; ...

  5. 《浅谈12306核心模型设计思路和架构设计》阅读有感

    <浅谈12306核心模型设计思路和架构设计>阅读有感 12306的业务复杂度远远比淘宝天猫这种电商网站要复杂.一般的电商网站,购买都是基于商品的概念,每个商品有一定量的库存,用户的购买行为 ...

  6. 很全!浅谈几种常用负载均衡架构

    阅读本文大概需要 9 分钟. 作者:Kingreatwill 链接:http://t.cn/Ea8JcrS 什么是负载均衡(Load balancing) 在网站创立初期,我们一般都使用单台机器对台提 ...

  7. 浅谈Anroid设备的CPU类型以及so文件的放置目录

    早期的Android系统几乎只支持ARMv5的CPU架构.现在发展为了七种:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS6 ...

  8. 浅谈 MySQL 集群高可用架构

    作者:霸都民工哥,原名储成友 关注于Linux系统运维及各类运维架构技术,目前正研究学习大数据与自动化运维,热爱开源,拥抱开源. 一,前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库 ...

  9. 浅谈Nginx服务器的内部核心架构设计

    前言 Nginx 是一个 免费的,开源的,高性能 的 HTTP 服务器和 反向代理,以及 IMAP / POP3 代理服务器. Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名 ...

最新文章

  1. 【译】如何使用索引视图和一个只有2行的表限制业务规则
  2. Java 基础数据类型
  3. 不是变量 win10_在win10下安装manim
  4. 咦?奇怪的知识又增加了?以数学建模的方式打开海啸传播模型(附部分matlab源码)
  5. linux mysql无符号整型_Mysql基础
  6. gorm crud简单代码示例
  7. 蛙泳如何找准背部发力的感觉
  8. Windows10系统下虚拟环境的安装与使用
  9. 百倍性能的PL/SQL优化案例(r11笔记第13天)
  10. Python 基础 —— time(时间,日期)
  11. LAMP之PHP服务的安装(libphp7.so方式)
  12. 关于使用电脑命令开启无线热点的那点事。。。
  13. [全网最新最全]2020年国内和国外安卓应用上线上架应用市场渠道集合(关键词:apk,发布,Google Play,Android,详细步骤介绍流程)
  14. 如何将macOS应用程序打包为dmg文件
  15. 解决 button 的背景图片被拉伸
  16. 20年管理学范围内知识点(潘永明)by:PoilZero
  17. 【创意生活】铅笔实景画,绝对创意
  18. 北京住房公积金提取(取消)指南
  19. 如何解决“MSCOMCTL.ocx を読み込めません” 即 MSCOMCTL.ocx加载失败?
  20. 低成本多串口ARM9工控主板解决方案

热门文章

  1. 0x80070035找不到网络路径_ln -s 创建软链接时的路径问题
  2. java 鼠标拖动_java 让表项支持鼠标拖动移位,并自动滚动滚动条
  3. 6-2图像分类网络模型框架解读(下)
  4. 麦块服务器显示连接已丢失,麦块服务器密码怎么设置
  5. 上海计算机和金融专业,姚明:我将去上海交大读书 选择计算机金融专业
  6. php面向对象的接口,PHP面向对象之接口编程
  7. 射击比赛(java)
  8. php手册学习怎样,PHP新手之如何学习PHP的讲解
  9. centos7中yum源安装mysql_centos7下使用yum安装mysql
  10. 西安建筑科技大学安德学院计算机专业,【图片】【安德学院】身在建大,志在四方【西安建筑科技大学吧】_百度贴吧...