ARM
文章平均质量分 94
笔者总结在ARM架构中的学习和工作经验
SOC罗三炮
嵌入式软件开发,ARM CPU架构研究,某厂芯片SOC系统验证工程师
展开
-
ARMv8-A架构下的外部debug模型之外部调试事件(external debug events)概述
嵌入式交叉触发器(Embedded Cross Trigger,ECT)是Armv8- A系统中的外部调试器用于生成调试事件的一种机制。ECT还支持将调试事件从一个代理路由到系统中的另一个代理。外部调试器可以使用ECT来生成debug request或restart request。这些事件会触发处理器之间的路由事件。例如,这些事件可以将一个debug request 事件从一个处理器路由到其他处理器。这样的话,当系统中的一个处理器停止时,系统中的其他所有处理器都可以停止。原创 2024-04-13 21:07:04 · 1111 阅读 · 0 评论 -
ARMv8-A架构下的外部调试模型(external debug)简介
ARMv8-A架构支持两种debug模型:self-host debug 和 external debug。- Self-host debug (自主机调试),调试器运行在被调试的CPU内部,调试器代码可以是 应用程序、内核、操作系统以及hypervisor。比如我们常见的GDB调试,就是使用self-host debug模型。**Debug exception**就是自主机调试的基础,调试器通过代码来控制debug 逻辑单元,从而产生debug 事件,而这些debug事件又会进一步产生debug 异常原创 2024-03-29 22:04:44 · 1435 阅读 · 0 评论 -
ARM架构中导致独占式内存访问Exclusive access 指令(LDXR/STXR)失败的原因分析
在Load-Exclusive/Store-Exclusive指令的使用过程中,存在着一些使用限制。如果未按照规范,错误地使用Load-Exclusive/Store-Exclusive指令,可能会造成Load-Exclusive/Store-Exclusive失效。对于Load-Exclusive指令,我们可以检查数据是否load成功;对于Store-Exclusive指令,会返回一个状态位信息,为0表示exclusive 访问成功,为 1 表示失败。原创 2024-03-16 19:36:24 · 1522 阅读 · 0 评论 -
ARM架构下如何使用break-before-make规则安全地动态更改MMU 页表条目( translation table entries)
我们在使用ARM MMU一般会遵循如下流程:1. 配置TTBR、TCR 和MAIR等MMU配置寄存器。2. 配置页表 pagetable,VA 和PA的映射关系,地址空间属性等等。3. 使能MMU和cache。即先配置好pagetable再使能MMU和cache,在MMU和cache使能之后,如果想要在程序运行时,动态改变page table或者称为translation table,需要遵循一定的规则(break-before-make)才能保证其安全性和可靠性。原创 2024-03-16 19:33:21 · 421 阅读 · 0 评论 -
ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)
同步异常发生时,会将产生同步异常的那条指令的地址写入ELR,所以如果想知道是哪条指令导致异常的产生,软件在处理异常时可以读取ELR中的值进行分析。ESR寄存器里保存着一些异常的诊断信息,比如异常产生的原因。在进入异常后,我们可以读取对应异常等级的ESR(ESR_EL1,ESR_EL2或者ESR_EL3),通过解析各个字段的数值所表示的含义,来分析出当前异常产生的原因。FAR寄存器将为一些同步异常保存导致异常发生的地址原创 2024-02-26 00:23:03 · 3353 阅读 · 0 评论 -
ARM处理器的secure 和 Non-secure模式切换方法:SMC指令和SCR.NS
大部分Cortex-A系列处理器都支持两种安全状态(实现了TrustZone):- 安全状态,Secure state:在安全状态下,一个处理器单元(Processing Element)可以访问secure和non-secure下的物理地址空间,以及secure的bank 寄存器。- 非安全状态,Non-secure:非安全状态也被称为Normal world,在这种状态下,PE只能访问Non-secure的物理地址空间,并且访问系统寄存器也是non-secure的访问。比如在Android 系统,原创 2023-03-27 19:25:58 · 11658 阅读 · 0 评论 -
ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables
异常向量表(vector tables)是一组存放于普通内存(normal memory)空间的,用于处理不同类型异常的指令(exception handler)。当异常发生时,处理器需要跳转到对应的异常处理器(exception handler)来处理异常。异常处理器充当调度代码,识别异常的原因,然后调用相关的处理程序代码(异常处理子程序)来处理异常。原创 2024-02-21 23:20:10 · 5520 阅读 · 2 评论 -
ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)
在上篇文章中,作者对异常处理整体流程以及相关概念做了梳理。接下来,本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。原创 2024-02-18 16:02:12 · 4744 阅读 · 0 评论 -
ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions
当异常发生时,处理器会先保存处理器当前的状态(CPSR,也称为PSTATE)以及异常返回地址。然后进入一个特殊的状态来处理改异常。当前处理器的状态信息来自于PSTATE寄存器,也就是CPSR,处理器会将异常发生前的PSTATE的值写入到SPSR(Saved Program Status Register)中。而异常返回的地址,将会写入到异常链接寄存器ELR(Exception Link Register)。原创 2024-02-13 23:36:50 · 4927 阅读 · 0 评论 -
ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types
异常(Exception)通俗点来讲,就是系统在正常运行的时候出现的非正常事件,这个非正常事件会导致系统状态更改或者其他错误,为了确保系统功能能正常运行,需要一些带有特权的软件代码(exception handler)来采取一些补救措施或者更新系统状态,这个过程被称为异常处理,系统会停止当前程序,并进入handler,在handler处理完成之后,系统会从handler返回,再继续正常运行。所以可以说,异常就是可以导致当前正常程序被挂起的任何事件。原创 2024-01-20 20:42:34 · 5244 阅读 · 0 评论 -
ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态
AArch64使用 EL 来命名异常等级,EL3权限最高,EL0权限最低。如下图所示,为一种通用的异常等级模型:- 用户应用程序执行在EL0。- 操作系统,比如Linux执行在EL1.- Hypervisor, 比如虚拟机程序,执行在EL2- 固件或者安全网关相关代码,执行在EL3.比如,在EL1的Linux可以使用软件接口标准在EL3上调用固件函数。这个模型意味着大部分的PE处理通常发生在EL0/1处。原创 2024-01-07 21:52:24 · 5976 阅读 · 1 评论 -
【转载】Cortex-A53 Pipeline Ordering and Memory Ordering
A53既然是顺序执行的流水线,那么还需要 memory barrier 做什么用?顺序流水线指的是处理器按照它们在内存中出现的顺序发出指令(issue)。下一条指令不会早于上一条指令发出。 dual-issue pipeline意味着处理器可以同时发出2条指令。乱序流水线指的是处理器可以不按照指令在内存中的顺序发出(issue)指令。简单而言,一条指令的执行需要经过取指(fetch)、解码(decode)、发出(issue)。每条指令按照内存中的顺序解码(decode),并按序存储在指令解码缓冲区中(转载 2023-11-19 18:10:26 · 4486 阅读 · 0 评论 -
如何利用好cache写出高性能的代码(Make your programs run faster by better using cache )
笔者在学习cache时总结了一些在软件层面充分利用cache,来写出高性能代码方法。如何利用好cache写出高性能的C代码一,当线性访问数据(需要遍历数据结构)时,使用数组(arrays)而不是链表(Linked lists)二,经常使用的变量应该放在一起声明定义,(Variables you access often together should be close to one-another in memory)三,内存对齐:优化访问结构体或者类数组四,高效地访问矩阵(二维数组)Access原创 2023-10-12 23:31:33 · 3302 阅读 · 1 评论 -
ARMv8如何读取cache line中MESI 状态以及Tag信息(tag RAM & dirty RAM)并以Cortex-A55示例
本文以Cortex-A55处理器为例,通过访问 处理器中的内部存储单元(tag RAM和dirty RAM),来读取cache line 中的MESI信息。Cortex-A55提供了一种通过读取一些系统寄存器,来访问Cache 和 TLB使用的一些内部存储单元(internal memory)的机制。这个功能可以探查出当缓存中的数据与主存中的数据不一致时存在的问题。此外,AArch64模式和AArch32模式的读取方式不同:当处理器处于AArch64模式时,先通过一些只写(write-only)寄存器原创 2023-10-02 15:47:28 · 5118 阅读 · 0 评论 -
缓存一致性(cache coherency)解决方案:MESI 协议状态转换详解
M,Modified, Unique Dirty((UD), 只存在于当前cache中(unique),并且该cache line上的数据与下一级存储单元中的数据不同(dirty)。换言之,cache line中最新的数据位于当前cache,其他cache中没有备份 ,cache line中的内容与主存中的不一致。E,Exclusive, Unique Clean(UC),数据只存在于当前cache line中,并且为clean的。cache中cache line中的数据于主存中的一致,并且其他core中原创 2023-09-29 22:17:37 · 4118 阅读 · 0 评论 -
ARMv8 cache的包含策略inclusive 和 exclusive之间的区别以及Cortex-A55示例详解
Inclusive cache: L2包含了所有的L1里的所有有效数据。Exclusive cache: L1 和L2 的数据互斥,同样的一份数据不能同时存在于L1和L2。原创 2023-09-24 15:11:04 · 5939 阅读 · 3 评论 -
图解直接映射(Direct mapped)、全相联(Fully-associative)和组相联(Set-associative)cache缓存基本原理
直接映射优缺点- 优点: 硬件实现简单,成本低.- 缺点: 灵活性差。每个主存块只有一个固定的行可以存放,因此即便cache中有大量空闲cache line可用,某个cache line上的data仍可能被替换出去。如果cache容量比较小,则非常容易发生冲突,频繁替换(cache trashing),效率大大降低。- 适用范围:直接映射方式一般用于大容量的cache中。全相联映射优缺点- 优点: 全相联映射方式比较灵活,主存的地址可以映射到Cache的任一cache line原创 2023-09-21 05:00:00 · 15341 阅读 · 9 评论 -
ARM如何利用PMU的Cycle Counter(时钟周期)来计算出CPU的时钟频率
本章将学习如何利用ARM PMU的Cycle Counter,来计算出CPU的时钟周期,从而计算出CPU的时钟频率。在介绍计算方法前,有必要先介绍下什么是时钟周期、机器周期以及指令周期。原创 2023-09-13 23:10:32 · 5888 阅读 · 0 评论 -
ARM 中缓存维护策略:Allocate policy(读分配/写分配),Write policy(写通/写回)以及replacement policy基础知识
针对不同的使用场景,有不同的cache 策略来影响cache的操作。缓存策略使我们能够描述何时应该将一个cache line写入给data cache,以及当执行store指令并发生cache hit时应该发生什么。原创 2023-09-09 12:47:55 · 4568 阅读 · 0 评论 -
组相联cache如何快速实现cache line eviction并使用PMU events验证
cache controler 是一个管理cache 内存的硬件结构,实际上它的绝大部分行为对程序来说都是不可见的。它会自动地将代码指令或者数据从主存中搬运到cache中,响应CPU读写内存的请求,并将它们转化成对cache以及外部内存的操作:cache controler收到CPU对某个地址进行读写的请求时,它会先检查这个地址是否存在cache中,这个动作称为cache look-up(缓存查找)。原创 2023-09-03 20:07:11 · 4011 阅读 · 1 评论 -
ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)
在ARMv8中,存在4级异常等级(Exception Level),程序需要跑在这四级异常等级中的一个。在AArch64下,异常等级近似于ARMv7中的特权等级(Privilege Level),异常等级定义了每个等级的特权等级,所以可以认为ELn 对应这 PLn。n (0到3)越大,说明特权等级越高。原创 2023-07-09 22:00:14 · 7873 阅读 · 2 评论 -
Trace32 SRST和TRST、system.attach 和 system.up的区别
下图为Trace32工具为ARM debug设计的 JTAG pin 脚图:其中,TRST和SRST信号是可选的。原创 2023-05-19 20:12:57 · 5336 阅读 · 0 评论 -
ARMv8-A非对齐数据访问支持(Alignment support)
例如,字数据可位于0x1000或0x1004,而不能位于0x1001、0x1002或0x1003,对于半字数据,地址可以为 0x1000 或 0x1002,而不能为 0x1001。由于存储器系统为32位的(至少从编程模型的角度来看是这样的),大小为32位(4 byte(字节)字节,或 1 word(字))或16位(2字节,或半字)可以是对齐也可以是不对齐的。PC对齐检查将生成一个与指令获取相关的PC对齐错误异常,在AArch64状态时,试图从架构上执行一条指令,该指令是用未对齐的PC获取的。原创 2023-03-29 22:34:20 · 12007 阅读 · 0 评论 -
ARMv8如何读取cache line中MOESI 状态以及Tag信息(tag RAM & dirty RAM)
本文以Cortex-A53处理器为例,通过访问 处理器中的内部存储单元(tag RAM和dirty RAM),来读取cache line 中的MOESI信息。Cortex-A53提供了一种通过读取一些系统寄存器,来访问Cache 和 TLB使用的一些内部存储单元的机制。这个功能可以探查出当缓存中的数据与主存中的数据不一致时存在的问题。原创 2023-03-19 16:46:52 · 12620 阅读 · 0 评论 -
ARMv8-缓存一致性(cache coherency)解决方案:MOESI protocol
ARMv8架构使用 MOESI 协议来维护在多个core之间的数据一致性,MOESI 协议描述了 L1 Data Cache中的一个共享的cache line的状态可以是:MOESIData Cache Unit (DCU)会将cache line的 MOESI状态信息保存在tag RAM和 dirty RAM中。原创 2023-03-12 17:30:56 · 8752 阅读 · 3 评论 -
ARMv8 同步和信号量(读写一致性问题):Load-Exclusive/Store-Exclusive指令详解
接下来本文将继续围绕这个话题,详细介绍Exclusive相关指令:Load-Exclusive/Store-Exclusive的具体使用。原创 2023-02-26 21:28:08 · 4325 阅读 · 2 评论 -
ARMv8 同步和信号量(Synchronization and semaphores)简介
ARMv8使用以下指令,来提供非阻塞的共享内存的同步方法。上述两表中,除了clear exclusive指令CLREX,其他Load-Exclusive/Store-Exclusive指令都是成对使用的。Load-Exclusive指令将会把一小块内存地址标记为独占式访问。这段被标记的内存空间的大小是由具体的实现定义的,详情见下文。原创 2023-02-16 20:32:59 · 3717 阅读 · 1 评论 -
ARMv8内存属性与类型(Memory types and attributes)简介
ARMv8中将内存分为两种类型:Normal memory和Device memory,Normal memory适用于系统中的大部分内存,而Device memory则适用于外设所使用的内存。原创 2023-02-11 23:43:51 · 8086 阅读 · 1 评论 -
ARM架构之Cortex-A55简介
1,A53的升级产品ARM Cortex-A55: 从端到云实现高效能 - 中文社区博客 - 中文社区 - Arm CommunityARM Cortex-A75 和,是首批基于新近发布的的系列处理器。本文我们讨论的就是 Cortex-A55:一款对为未来数字世界举足轻重的处理器,原因如下。1,A53的升级产品ARM Cortex-A75 和 Cortex-A55 是首批问世的 DynamIQ 处理器。。翻译 2023-02-05 20:49:50 · 30611 阅读 · 1 评论 -
ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine
中断有四种状态:inactive,pending,active 和active and pending。而产生中断的方式有两种,一种是通过写pending寄存器,让中断进入pending状态,可以忽略是否真的有物理中断信号,让Distributor将该中断转发到对应CPU interface。原创 2022-12-12 22:50:59 · 5509 阅读 · 0 评论 -
ARM通用中断控制器GIC之中断控制
GICD_ISPENDRn寄存器提供一个Set-pending bit,对该bit写入1能够将对应外设中断的状态设置为pending,读取对应bit则可以知道该中断是否处于pending状态。处理器可以通过写入GICD_SGIR寄存器来产生一个SGI中断,一个SGI中断可以设置多个目标处理器,并且SGIR寄存器里有目标寄存器列表。从GICD_ISPENDR0开始,寄存器里每个bit代表一个不同中断ID的中断控制位,比如GICD_ISPENDR0[0]表示控制中断ID为0的中断。原创 2022-12-05 22:57:44 · 5337 阅读 · 4 评论 -
ARM通用中断控制器GIC之中断处理简介
GIC架构通过中断ID来识别不同类型的中断,为了能够正确地处理中断,软件层必须知道GIC所支持的中断ID。原创 2022-10-24 23:12:08 · 5938 阅读 · 1 评论 -
什么是Semihosting(半主机)- ARM处理器与主机之间IO通信机制
Semihosting是一种在Arm处理器上运行的应用程序与调试器的主机进行通信的技术。通过这个机制,跑在ARM处理器上的应用程序可以使用主机的IO设备,比如键盘输入,屏幕输出以及文件的IO等等。如果目标平台(目标开发板)没有这些IO设备,或者为了使用print()函数输出一些debug信息,那将非常有用。在AArch32模式下,应用程序通过使用 SVC(SWI)指令并携带一个特定的 SVC number,来触发一个异常,从而实现一个semihosting 请求。原创 2022-10-16 12:41:13 · 5105 阅读 · 0 评论 -
ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍
GIC由Distributor和CPU interface两部分组成,如果支持虚拟化扩展,还有virtual CPU interface。本文主要介绍Distributor和CPU interface的基本功能。原创 2022-10-13 22:31:47 · 4702 阅读 · 0 评论 -
ARM架构Generic Interrupt Controller(GIC)详解之术语介绍
GIC的作用中断分组 interrupt grouping安全性扩展 Security Extensions中断处理模型 Models for handling interrupts虚假中断 Spurious interrupts中断复用 Banking。原创 2022-09-27 23:35:21 · 5042 阅读 · 0 评论 -
ARM通用中断控制器GIC(generic Interrupt Controller)简介
ARM提供了一个可用于ARMv8-A系统的通用中断控制器GIC,这个中断控制器的编程接口在GIC架构中定义。通用中断控制器(GIC)支持多核系统中cores之间由软件生成(SGI)、私有(PPI)和共享外设(SPI)中断的路由。GIC架构还提供了可用于管理中断源和行为的寄存器,以及(在多核系统中)将中断路由到各个core的寄存器。它使软件能够屏蔽、启用和禁用来自单个源的中断,对单个中断源(在硬件上)进行优先级排序,并生成软件中断。原创 2022-09-17 16:11:50 · 9379 阅读 · 0 评论 -
ARM hint instruction-WFI(Wait For Interrupt)指令详解
WFI(Wait For Interrupt)指令是ARM中的一个Hint 指令,内核执行hint指令的时候不需要依赖额外的处理操作。WFI指令可以让CPU进入standby 模式,即低功耗模式,此时内核会暂停其他活动,一直等待中断事件的发生,检测到中断发生后,WFI指令执行完成,CPU退出standby模式。本文将从ARM hint指令、WFI的用途以及WFI的唤醒事件等三个角度解释WFI指令。原创 2022-09-10 23:13:31 · 14758 阅读 · 3 评论 -
计算机组成原理-流水线技术学习笔记1
一,处理器性能公式程序运行的时间=程序中的指令数×一条指令需要的周期数×每个周期所需的时间每条指令所需的周期数(Cyclesperinstructions,CPI),取决于ISA和处理器架构µarchitecture每个周期所需的时间,取决于处理器架构以及基础工艺basetechnology二,RSIC中的五级流水线。.........原创 2022-07-18 23:28:47 · 6798 阅读 · 2 评论 -
ARM AArch32 立即数范围以及合法立即数
笔者在写汇编代码时曾遇到过立即数不合法的问题,12bits可以表示的无符号数范围为:`0~4095`,有符号数的范围为:`-2048 ~ +2047`,如果不在这12 bits的立即数上增加点创作性,而直接硬解码用来表示立即数是远远不够的。所以在ARM中将这12 bits分为 8-bit 常数(0~255)和 4-bit旋转位移值(0~15),8 bits 常数可以按照循环位移值的2倍(0~30)向右进行循环位移,位移的步进值是以2为单位,可以是:`0、2 、4 、6 、… 、30`。...原创 2022-06-20 21:31:55 · 9898 阅读 · 0 评论 -
Trace32使用教程-访问类型(Access Class)
访问类型(Access Class)被 Trace32的PowerView用于指定访问内存、外设的寄存器、可寻址的core资源、协处理寄存器以及Trace32的虚拟内存等。在Trace32中,寻址包括两部分:访问类型+地址,比如:其中 为访问类型,为访问的地址,二者之间用冒号 连接。访问类型可以是:通常使用字母 来表示程序内存类型(可省略),比如以下命令:可以省略,上述两个命令都是在程序地址为 的地方,打开源代码窗口。除了 类型之外,还有 , 和 等程序内存类型,这些类型是处理器架构用来指定不同指令集的编原创 2022-06-14 22:38:02 · 7382 阅读 · 0 评论