鲲鹏处理器采用ARM架构,欧拉系统可以运行在鲲鹏架构的服务器上,想要了解欧拉操作系统对硬件的支持,首先需要了解一些ARM架构的基础知识。操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因此我们对ARM体系结构的介绍也围绕ARMv8-A的汇编指令和寄存器来展开。

处理器架构是处理器厂商为同一个系列的处理器规定的一个规范。ARM架构是一种精简指令集(RISC)架构,具有以下RISC架构特点:

  • 较大的通用寄存器堆。

  • load/store体系结构,其中数据处理操作仅对寄存器内容进行操作,而不是直接对内存内容。

  • 简单寻址模式,所有load/store地址由寄存器内容和指令确定。该体系结构定义了处理单元与内存(包括缓存)的交互,并包括内存地址翻译系统。它还描述了多个处理单元如何相互作用。面积小、性能强和非常低的功耗是ARM体系结构的关键特性。本小节主要以ARMv8-A架构为例来介绍ARM体系结构的基本特性。ARMv8-A体系结构的一个重要特性是向后兼容,可以支持诸多标准和应用场景下的最优设计。ARMv8-A架构支持64bit的执行模式(AArch64)和32bit的执行模式(AArch32),这一模式兼容之前的ARM架构。两种执行状态都支持SIMD和浮点指令。

一、AMRv8架构概要

ARM体系结构自推出以来已经有了显著的发展,并且ARM还在继续开发它。到目前为止,已经有八个主要版本,由版本号1到8表示。其中前三个版本现在已经过时了。

通用名称AArch64和AArch32描述了64位和32位执行状态。AArch64是64位执行状态,意味着地址保存在64位寄存器中,并且基本指令集可以使用64位寄存器进行处理。AArch64支持A64指令集。AArch32是32位执行状态,这意味着地址保存在32位寄存器中,并且基本指令集使用32位寄存器进行处理。AArch32支持T32和A32指令集。

ARM支持三种架构配置:

  • A系列,面向应用场景的架构(Application Profile)。该系列支持基于内存管理单元(MMU)的虚拟内存系统体系结构(VMSA)。它支持A64、A32和T32指令集。

  • R系列,面向实时场景的架构配置。该系列支持基于内存保护单元(MPU)的受保护内存系统体系结构(PMSA)。它支持A32和T32指令集。

  • M系列,面向微处理器的架构。该系列实现了一个为低延迟中断处理而设计的程序员模型(programmers’ model),该模型具有寄存器硬件堆栈和对中断处理程序的高级语言支持。它支持T32指令集的变种。

    (注:内存保护单元(MPU)是ARM中配备的有效保护系统资源的一种硬件,提供了内存区域保护功能。)

二、ARMv8-A指令集

在ARMv8-A中,可能的指令集取决于执行状态:

  1. AArch64:AArch64 state只支持A64指令集。这是一个固定长度的指令集,使用32位指令编码。

  2. Arch32:AArch32 state支持以下指令集:

  • A32:这是一个固定长度的指令集,使用32位指令编码。它是与ARMv7 ARM指令集兼容。

  • T32:这是一个可变长度指令集,它同时使用16位和32位指令编码。它与ARMv7 Thumb®指令集兼容。

ARM指令的基本格式如下[2]:

<Opcode>{<Cond>}<S><Rd>,<Rn> {,<Opcode2>}

其中各个部分的含义为:

  • Opcode:操作码,也就是助记符,说明指令需要执行的操作类型;

  • Cond:指令执行条件码;

  • S:条件码设置项,决定本次指令执行是否影响PSTATE寄存器相应状态位值;

  • Rd/Xt:目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30;

  • Rn/Xn:第一个操作数的寄存器,和Rd一样,不同指令有不同要求;

  • Opcode2:第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit);

ARMv8-A指令集的条件码如下图所示:

下面以A64指令集为例简要介绍ARMv8-A的指令体系。A64指令集中的指令主要分为控制指令、访存指令和计算指令。控制指令主要包括有条件分支指令、无条件分支指令、异常产生和返回指令、系统寄存器指令、系统指令、提示指令、同步指令和清除独占访问标志指令。访存指令主要有Load指令和Store指令,这两种指令有许多变种。计算指令包含算数指令、逻辑指令、MOVE指令、移位指令、位扩展指令和SIMD指令等等。以下列出了一些常用的控制指令的名称与用途。

1. 控制指令:

  • 条件分支指令:

  • 无条件分支指令:

  • 使用寄存器的无条件分支指令:

  • 异常产生指令:

  • 异常返回指令:

  • 系统寄存器指令:

  • 同步指令和独占状态清除指令:

例如:

2. 访存指令:

ARMv8访存指令支持以下寻址模式:

  • 基址加上无符号立即数的寻址和基址加上有符号立即数的寻址;

  • 基址加上寄存器偏移值;

  • 基址加上扩展的寄存器偏移;

  • pre-index模式;

  • post-index模式;

  • PC相对寻址模式。

具体情形见下表:

其中对于A64指令集来说,64bit的基址来自通用寄存器X0-X30或来自栈指针SP,立即数或寄存器偏移值则是可选的,对寻址方式的解释如下:

  • 寄存器偏移寻址是指来自64bit基址寄存器的地址加上一个偏移值;

  • Pre-indexed模式是指寻址地址是64bit基址加上一个偏移值,这个计算和将会写入基址寄存器;

  • Post-indexed模式是指寻址地址是64bit的基址,但之后基址和偏移值的和将会写入基址寄存器;由此可见pre-indexed和post-indexed的区别在于使用的地址是先加上偏移值再使用还是先使用再加上偏移值;

  • PC相对寻址是指寻址地址是这条指令64bit的PC值加上一个19bit的有符号字偏移,这个地址在当前指令的PC值的 ±1MB范围内并且是4byte对齐的。使用PC相对寻址所load的数据大小至少为32bit并且只能用来预取指令,且PC值不能被其他寻址方式使用。

  • 一个立即数偏移可以为有符号的,也可以为无符号的,可以为scaled也可以为unscaled。当一个立即数偏移是scaled的时候,它被编码为传输数据大小的整数倍。虽然汇编程序总是使用byte对齐的偏移,但汇编器或反汇编器会做必要的转换工作,因此可用的byte偏移值取决于load/store指令类型和数据传输的大小。

下面列出了一些load/store指令:

例如Load寄存器指令:

上表中指令的寻址方式有:

  • 基址加上12bit无符号scaled立即数偏移寻址;

  • 基址加上9bit有符号unscaled立即数偏移寻址;

  • 基址加上64bit寄存器偏移,可选为scaled;

  • 基址加上32bit可拓展寄存器偏移,可选为scaled;

  • 有unscaled9bit有符号立即数偏移的pre-indexed模式;

  • 有unscaled9bit有符号立即数偏移的post-indexed模式;

  • Load至少32bit数据的PC相对寻址模式。

如果被load或store的指令的寻址模式会修改基址寄存器的内容,且被load/store寄存器恰好的是基址所在的寄存器,那么硬件的行为可能不确定。

3.计算指令:

在操作系统汇编语言中使用的计算指令主要是一些简单的算数计算指令,用于对寄存器的move操作和对地址的计算操作,一般计算指令既可以使用立即数作为操作数,也可以使用寄存器中的数作为操作数。下面简单列举了一些算数指令:

使用立即数的简单算数指令:

例如:

使用寄存器的逻辑操作指令:

例如:

其中:

寄存器移位指令:

例如:

三、结语

本小节基于ARMv8-A架构简要介绍了ARM相关的指令集。汇编指令和寄存器是操作系统汇编代码中的常客,我们需要对常用的汇编指令和寄存器有一定的了解。

引用

[1]ARM® Architecture Reference ManualARMv8, for ARMv8-A architecture profile**

[2]https://blog.csdn.net/tanli20090506/article/details/71487570

【华为云技术分享】ARM体系结构基础(1)相关推荐

  1. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  2. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  3. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  4. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  5. 【华为云技术分享】ARM体系结构基础(2)

    上一节中我们学习了ARM汇编指令集的有关知识,这一节我们主要学习ARM架构寄存器的有关知识.在处理器中,寄存器用于保存需要被快速访问的数据,在操作系统中需要特别注意的寄存器主要有栈指针寄存器(SP). ...

  6. 【华为云技术分享】为什么越来越多企业正在往ARM平台迁移?

    架构变迁 说到CPU架构,我们可能必然会提到CISC(复杂指令集,比如桌面端采用的X86系列)和RISC(精简指令集,比如移动端广泛采用的ARM系列).理论上,RISC 相比于 CISC(Intel ...

  7. 【华为云技术分享】从 Cloud 1.0 到 2.0,云计算的“多元架构命题”

    今天,我们处于 Cloud 2.0 时代.1.0 时代,企业接触云计算,开始上云:2.0 时代,企业云化加深,核心业务上云.然而,在 2.0 时代,我们看到云计算正在进入多元架构时代. 什么是多元架构 ...

  8. 【华为云技术分享】解析:物联网数据分析服务如何做?

    [摘要] 物联网设备正在产生大量的数据,如何为开发者提供简单有效的数据分析服务,简化开发过程,提升开发效率,让IoT数据快速变现是一个摆在我们面前的问题. 没有疑问,我们已经身处物联网时代了,每天都有 ...

  9. 【华为云技术分享】AI 开发路漫漫,什么才是真正的极客精神?

    摘要:AI开发看上去很美,实践起来却不是一件容易的事.一个聪明的开发者知道借助工具提升开发效率,一个智能的平台则会站在开发者的立场,为用户提供贴心服务. "理想很丰满,现实很骨感." ...

最新文章

  1. 在Ubuntu 14.04 64bit上使用pycURL模块示例
  2. 如何用数学函数去理解机器学习?
  3. 三甲医院需要部署哪些网络安全设备
  4. SAP Loyalty management模块演示场景的测试数据
  5. jtable mysql数据库_使用MySQL数据库语法错误填充jTable
  6. Java Syncrhonisers
  7. C语言模拟实现标准库函数之strcat()
  8. python3层装饰器_python三层装饰器python字符串,数值计算
  9. phper需要掌握的技能(简)
  10. tomcat设置子域名session共享以及修改JSESSIONID
  11. 自动刷票工具的实现机理简介
  12. jQuery动画效果——淡入淡出
  13. 服务器系统没法设置分辨率,windows系统分辨率改不了的原因分析及多种解决方法...
  14. dry的原理_6、干货!老司机带你利用高中化学知识理解蚀刻(dry etch)选择比(selectivity)原理......
  15. 志强系列的服务器能吃鸡吗,性能芯变化!三款至强E5 V3服务器体验
  16. android外接手机模拟器,HBuilderX 连接网易mumu手机模拟器进行App开发
  17. [创业-39]:中小公司的组织架构与公司管理
  18. 关于“硬件工程师工资不高”的几个真相!
  19. 最容易上手,也最有用的炒股绝招-3年翻N倍!!
  20. 手机屏幕投到Windows系统

热门文章

  1. python center函数_数据类型和数据结构(三):字符串(4) 字符串内置函数(1)
  2. Git笔记(30) 重写历史
  3. Python笔记(1) Python简介
  4. 杜比dss200服务器重装,杜比数字影片库 DSL200 (Dolby Show Library DSL200)
  5. linux sort命令 性能,Linux sort 命令简单使用
  6. mysql char(36)_MySQL中char(36)被认为是GUID导致的BUG及解决方案
  7. python qt5 designer 免费安装_PyCharm离线安装PyQt5_tools(QtDesigner)
  8. 一般微型计算机有几十条,计算机单选题.doc
  9. Linux. C语言中else,2. if/else语句
  10. Django单表,连表查询