
ARM 体系结构与编程
文章平均质量分 74
从 0 开始使用 qemu 搭建 ARM 裸机开发环境,内容包括 qemu 环境搭建,GCC交叉工具链安装,程序编译,链接过程,GDB 调试,VScode 调试,启动文件,汇编,链接脚本,ARMv7-A 体系架构,中断,GIC,异常,MMU,cache等等。全部使用 qemu 进行开发,无需开发板。
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
tyustli
不抛弃,不放弃
展开
-
【RISC-V】寄存器及 PCS(过程调用标准)
为了确保函数的正确执行,需要保存这些寄存器的值,以便在函数执行完毕后能够恢复调用者原来的寄存器值。通过将这些寄存器的值保存到堆栈中,函数可以在执行期间使用堆栈空间来保存自己的局部变量和临时值,而不会覆盖调用者的寄存器值。具体来说,它将寄存器的值保存在栈指针(sp)指向的内存位置上,每个寄存器的值占据4个字节的空间。这段代码的作用是将之前保存在栈上的寄存器值恢复到相应的寄存器中,通常用于函数返回之前的清理工作。函数调用时需要保存这些寄存器的原因是为了保护调用者的寄存器值,以便函数执行时不会干扰调用者的代码。原创 2023-07-11 13:02:07 · 2001 阅读 · 0 评论 -
【MMU】——MMU 权限控制
在 ARMv7 架构中 domain 被废弃,通常情况下将所有的 domain ID 设置为 0,并且 DACR(Domain Access Control Register) 所有的域设置为 client。不可执行区域,例如设备地址空间通常标记为不可执行区域,如果有指令预取访问了该空间,就会触发指令预取异常。TEX C B bit 控制信息。原创 2024-06-08 02:15:00 · 223 阅读 · 0 评论 -
【MMU】——ARM 二级页表
二级页表项即 entry 的格式如下。二级页表项有三种类型。原创 2024-06-08 00:00:00 · 519 阅读 · 0 评论 -
【MMU】——ARM 一级页表
bit[31:20] 共 12 位,index = 2^12 = 4096 个所以一级页表共有 4096 个,即 0-4095,每个 index 放 4 bytes 数据,每个一级页表项控制 1MB section 空间,共 4GB 空间。一级页表占用空间 4096 * 4bytes = 16KB。从上图可以看出 L1 页表项有四种可能类型。一级页表项即 entry 的格式如下。原创 2024-06-07 02:00:00 · 360 阅读 · 0 评论 -
【MMU】——页表映射示例
页表映射示例原创 2024-06-08 00:00:00 · 273 阅读 · 0 评论 -
【MMU】——MMU 页命中/缺页
MMU 页命中与缺页原创 2024-06-07 00:00:00 · 250 阅读 · 0 评论 -
【MMU】——MMU 相关的 CP15 寄存器
此时的 c1 就是 SCTLR 寄存器,也就是系统控制寄存器,这个是 c1 的基本作用。SCTLR 寄存器主要是完成控制功能的,比如使能或者禁止 MMU ,c1 作为 SCTLR 寄存器的时候其含义如下图。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。原创 2024-06-07 01:30:00 · 289 阅读 · 0 评论 -
【MMU】——MMU 常用术语
MMU 常用术语。原创 2024-06-06 02:15:00 · 135 阅读 · 0 评论 -
【MMU】——简介
Memory Manage Unit 存储器管理单元是一种硬件模块,用于在 CPU 和内存之间实现虚拟内存管理。其主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。MMU是现代计算机操作系统中重要的组成部分,可以提高系统的稳定性和安全性。原创 2024-06-06 02:00:00 · 248 阅读 · 0 评论 -
【GIC400】—— SPI(EPIT1 Timer)
SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有 Core 共享的中断,这个是最常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断)。比如按键中断、串口中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core。ID32~ID1019:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断,本节主要介绍 EPIT1 Timer 中断。GPIO,UART 等中断的均属于。IRQn_Type 中中断号为。原创 2024-06-05 02:15:00 · 141 阅读 · 0 评论 -
【GIC400】——SGI 软件中断
SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器 GICD_SGIR 写入数据来触发。ID0~ID15:这 16 个 ID 分配给 SGI。这里只介绍用到的部分。原创 2024-06-05 02:00:00 · 735 阅读 · 0 评论 -
【GIC400】—— PPI (Generic Timer)
Generic Timer 是 ARMv7-A 内核中的通用定时器,包括: A Non-secure physical timer, A Secure physical timer, A virtual timer。不同的扩展有不同的 timer.不同的扩展对应的 Timer 寄存器如下本文主要介绍 secure physical timer。原创 2024-06-02 16:17:19 · 363 阅读 · 0 评论 -
【GIC400】——驱动代码实现
IRQ 中断处理原创 2024-06-04 20:05:12 · 150 阅读 · 0 评论 -
【GIC400】——中断使能
中断使能原创 2024-06-04 19:50:51 · 212 阅读 · 0 评论 -
【GIC400】——GIC 相关的 CP15 寄存器
当 MRC/MCR 指令中的 CRn=c12,opc1=0,CRm=c0,opc2=0 的时候就表示此时 c12 为 VBAR 寄存器,也就是向量表基地址寄存器。设置中断向量表偏移的时候就需要将新的中断向量表基地址写入 VBAR 中,比如在前面的例程中,代码链接的起始地址为0x80000000,而中断向量表肯定要放到最前面,也就是0x80000000这个地址处。当 MRC/MCR 指令中的 CRn=c1,opc1=0,CRm=c0,opc2=0 的时候就表示。本文主要介绍和中断相关的 CP15 寄存器。原创 2024-06-04 18:17:27 · 138 阅读 · 0 评论 -
【GIC400】——GIC 简介
Cortex-M 的中断控制器叫做 NVIC,Cortex-A 的中断控制器叫做 GIC。GIC 是 ARM 公司给 Cortex-A/R 内核提供的一个中断控制器,类似 Cortex-M 内核中的NVIC。目前 GIC 有 4 个版本:V1-V4,V1 是最老的版本,已经被废弃了。V2~V4 目前正在大量的使用。原创 2024-06-04 18:17:14 · 419 阅读 · 0 评论 -
【GIC400】——PLIC,NVIC 和 GIC 中断对比
是中断向量表,当指定的中断发生以后就会调用对应的中断复位函数,比如复位中断发生以后就会执行第 1 行代码,也就是调用函数 Reset_Handler,函数 Reset_Handler 就是复位中断的中断复位函数,其它的中断同理。就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推,最后一个中断服务函数的入口地址,这样 STM32F407 的中断向量表就建好了。跟 NVIC 一样,GIC 也有中断向量表,中断向量表也是在代码的最前面。原创 2024-06-03 21:53:33 · 741 阅读 · 0 评论 -
【ARMv7-A】——CP15 协处理器
这种机制有些类似于 ARM 中的寄存器,当处于不同的处理器模式时某些 ARM 寄存器可能有不同的物理寄存器,比如 SPSR 寄存器,每一种处理器模式下都对应一个独立的物理寄存器(用户模式和系统模式对应同样的物理寄存器,这是一个例外)MRC:将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断(例如在 USER 模式下操作协处理器)。下面的指令将协处理器 CP15 的寄存器 C0 寄存器的数据传送到 ARM 寄存器 R0 中。原创 2024-06-02 16:45:47 · 573 阅读 · 0 评论 -
【ARMv7-A】——ATPCS(ARM-Thumb 过程调用标准)
ARMv7-A 的 ATPCS(ARM-Thumb Procedure Call Standard),也称为 AAPCS(ARM Architecture Procedure Call Standard),规定了 ARM 架构中函数调用的标准和约定。它定义了函数调用时寄存器的使用、参数传递、返回值、栈帧布局等规范。以下是对 ARMv7-A 的 ATPCS 的详细介绍。原创 2024-05-28 18:12:31 · 575 阅读 · 0 评论 -
【ARMv7-A】——WFE(wait for event)
WFI (Wait for interrupt) 和 WFE (Wait for event) 是两个让 ARM 核进入 low-power standby 模式的指令,由 ARM architecture 定义,由 ARM core 实现。ARM 架构中的 WFE 指令(Wait For Event,等待事件)是一种低功耗指令,用于使处理器进入低功耗状态,直到某个事件发生。WFE 指令的使用场景和 WFI(Wait For Interrupt)类似,但它能处理更广泛的事件,而不仅仅是中断。原创 2024-05-28 12:49:32 · 466 阅读 · 0 评论 -
【ARMv7-A】——WFI(wait for interrupt)
执行 WFI 指令后,处理器停止执行下一条指令并进入等待状态,只有在接收到中断请求或特定事件时,处理器才会退出等待状态并继续执行。其他相关的指令,除了 WFI,ARM 架构还提供了其他与低功耗相关的指令,如 WFE(Wait For Event),它类似于 WFI,但可以等待更广泛的事件而不仅仅是中断。WFI 是一种低功耗指令,用于在处理器处于空闲状态时降低功耗。通过正确使用 WFI 指令,可以显著降低嵌入式系统的功耗,延长设备的续航时间,同时保持系统在需要时能够迅速响应。ARM 架构中的指的是。原创 2024-05-27 21:30:30 · 666 阅读 · 0 评论 -
【ARMv7-A】——汇编与C相互调用
add.s文件中定义如下函数.text.arm.align 2对应的反汇编代码如下可以看到汇编中定义的函数被放在text段中\n");原创 2024-05-26 10:34:52 · 139 阅读 · 0 评论 -
【ARMv7-A】——内联汇编
使用内联汇编主要目的是为了提高效率,同时还是为了实现 C 语言无法实现的部分。asm volatile("汇编语句": 输出部分: 输入部分: 会被修改的部分);__asm__ __volatile__("汇编语句": 输出部分: 输入部分: 会被修改的部分);原创 2024-05-26 10:31:36 · 286 阅读 · 0 评论 -
【ARMv7-A】——子程呼叫与无条件跳转指令B、BL、BX和BLX
1、B:无条件转移B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。注意,存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是绝对地址,它的值由汇编器来计算。例:B Label ;程序无条件跳转到标号Label处执行2、BL:转移并连接,用于呼叫一个子程序,返回地址被存储在LR中BL指令是带连接的跳转,在跳转之前,会在寄存...原创 2019-03-16 18:28:11 · 5626 阅读 · 1 评论 -
【ARMv7-A】——常用反汇编命令
gcc 反汇编arm-none-eabi-objdump.exe -d .\rtthread.elf > rtthread.asmarm-none-eabi-objdump.exe:反汇编用到的编译器-d :disassemble 表示反汇编rtthread.elf:表示需要反汇编的文件rtthread.asm:生成的汇编文件的名称(注意前面的 > 符号)armcc 反汇编D:\SoftWare_Application\Keil_MDK_5.32\ARM\ARMCC\bin原创 2021-07-22 07:49:28 · 5182 阅读 · 0 评论 -
【ARMv7-A】——汇编指令集
ARM 指令集ARM 指令集分为 6 类:跳转指令数据处理指令程序状态寄存器(PSR)转移指令Load/Store 指令协处理器指令异常中断产生指令指令的一般格式ARM 指令的一般编码格式<opcode> {<cond>}{S} <Rd>,<Rn>,<shifter_operand>opcode:是指令助记符,如 ADD 表示算数加法操作指令cond:表示指令执行的条件S:决定指令的操作是否影响 CPSR 的值Rd原创 2021-11-30 21:30:30 · 2011 阅读 · 0 评论 -
【ARMv7-A】——数据访问中止异常中断处理程序的返回
当数据访问中止异常中断发生时,处理器将 PC-4 的值保存到异常模式下的寄存器 LR_mode 中,这是 LR_mode 中的值 即为PC-4 ,即指向当前指令后的第二条指令。因此数据访问中止异常中断程序应该返回到该数据访问中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。4、数据访问中止异常中断处理完成之后,程序需要返回到有问题的数据指令处,即 instruction+0 处执行,所以将此时的 LR_mode 寄存器的值 -8 赋给 PC。原创 2023-07-03 12:29:49 · 678 阅读 · 0 评论 -
【ARMv7-A】——指令预取中止异常中断处理程序的返回
当指令预取中止异常中断发生时,处理器将 PC-4 的值保存到异常模式下的寄存器 LR_mode 中,这是 LR_mode 中的值 即为PC-4 ,即指向当前指令后的第一条指令。当异常中断处理程序中使用了数据栈时,可以通过下面的指令在异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。,它指向当前指令的后 2 条指令(对于 ARM 系统来说它指向当前指令地址加 8 个字节的位置,对于 Thumb 指令来说,它指向当前指令加 4 个字节的位置)。原创 2023-07-03 12:29:01 · 1134 阅读 · 1 评论 -
【ARMv7-A】——IRQ 和 FIQ 异常中断处理程序的返回
当 IRQ 和 FIQ 异常中断发生时,处理器将 PC-4 的值保存到异常模式下的寄存器 LR_mode 中,这时 LR_mode 中的值即为PC-4 ,即指向当前指令后的第二条指令。当 IRQ 和 FIQ 异常中断产生时,程序计数器 PC 的值已经更新,它指向当前指令后面第 3 条指令(对于 ARM 系统来说它指向当前指令地址加 12 个字节的位置,对于 Thumb 指令来说,它指向当前指令加 6 个字节的位置)。在上述指令中,reg_list 是异常中断处理程序中使用的寄存器列表。原创 2023-07-03 12:18:44 · 2129 阅读 · 0 评论 -
【ARMv7-A】——SWI 和未定义指令异常中断处理程序的返回
SWI 和未定义指令异常中断是由当前执行的指令自身产生的,当 SWI 和未定义指令异常中断产生时,程序计数器的 PC 的值还未更新,它指向当前指令后面第 2 条指令(对于 ARM 指令来说,它指向当前指令地址加 8 个字节的位置;这时 LR_mode 中的值即为PC-4 ,即指向当前指令的第一条指令。当异常中断处理程序中使用了数据栈时,可以通过下面的指令在异常中断处理程序时保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序的执行现场。C 语言中将软中断号打印出来。原创 2023-06-29 19:44:03 · 1507 阅读 · 0 评论 -
【ARMv7-A】——进入和退出异常中断的过程
链接寄存器(LR)用于在异常处理后存储适当的PC 地址,当程序返回时,LR 应该做出相应的调整。ARM 指令为三级流水线:取地,译码和执行。当出现异常时,ARM 内核自动执行以下操作。进入中断的时候 LR = PC -4。原创 2023-06-29 19:31:15 · 1581 阅读 · 0 评论 -
【ARMv7-A】——异常中断处理概述
在 ARM 体系中通常有以下 3 种方式控制程序的执行流程:原创 2023-06-29 19:25:35 · 431 阅读 · 0 评论 -
【ARMv7-A】——异常与中断
最常见的异步异常是外部中断,外部中断的发生是由外围设备驱动的,一方面外部中断的发生带有偶然性,另一方面中断请求到达处理器之时,处理器的程序指令流执行到具体的哪一条指令带有偶然性。指响应异常后的处理器状态无法精确反映为某一条指令的边界,即可能是某一条指令执行了一半然后被打断的结果,或者是其他模糊的状态。可能存在多个中断源同时向处理器发起请求的情形,因此需要对这些中断源进行仲裁,从而选择哪个中断源被优先处理,这种情况称为中断仲裁,可以给不同的中断分配优先级以便于仲裁,因此中断存在中断优先级的概念。原创 2023-06-29 19:14:17 · 1780 阅读 · 0 评论 -
【ARMv7-A】——C 语言运行前的设置
C 语言运行环境准备其实就是设置不同处理器模式下的 SP 指针,使其指向内存中的某块区域当然,实际使用中需要考虑 DDR 的初始化,MMU,cache 等,这里只是介绍了如何切到 C 语言的方法,具体的芯片外设需要考虑实际情况。原创 2023-05-14 18:31:24 · 291 阅读 · 1 评论 -
【ARMv7-A】——当前程序状态寄存器 CPSR
除了 usr 和 sys 模式外,每一种处理器模式下都有一个专用的物理寄存器,称为 SPSR(备份程序状态寄存器)。它包含了条件标志位、中断禁止位,当前处理器模式标志以及其他的一些控制和状态位。需要注意的是,Java状态位在现代ARM架构中已经不再被广泛使用,因为ARM处理器已经有更高效的方式来支持Java虚拟机。因此,在一些较新的ARM处理器中,J位可能没有具体的功能或被保留为未来的扩展使用。当处理器处于Java执行状态时,它会根据Java虚拟机的需求进行相应的优化和处理。通常其他指令不影响V位。原创 2023-07-18 07:41:26 · 2546 阅读 · 0 评论 -
【ARMv7-A】——处理器模式
ARMv7-a 处理器共有 9 种工作模式。原创 2023-05-13 11:36:44 · 1740 阅读 · 0 评论 -
【ARMv7-A】——栈帧
在 ARM 中,通常为满减栈(Full Descending FD), 也就是说,堆栈指针指向堆栈内存中最后一个填充的位置,并且随着每个新数据项被压入堆栈而递减。原创 2023-05-12 21:34:45 · 1289 阅读 · 0 评论 -
【GDB】——使用 GDB 自动画红黑树
前面几节中介绍了 gdb 的 python 扩展,参考并且 python 有 graphviz 模块,那么可以用 gdb 调用 python,在 python 中使用 graphviz 绘图。原创 2023-09-30 10:03:51 · 286 阅读 · 0 评论 -
【GDB】——用 python 扩展 gdb
gdb.parse_and_eval 接受一个字符串作为表达式,并以 gdb.Value 的形式返回表达式求值的结果。那么 gdb.parse_and_eval(‘i + 1’) 的结果是一个 gdb.Value 的实例,其 value 属性的值为 4。如果想把输出结果转存到字符串中,设置 to_string 为 True:gdb.execute(cmd, to_string=True)。当我们通过 python 接口跟这些值打交道时,gdb 会把它们包装成一个 gdb.Value 对象。原创 2023-09-29 21:10:17 · 1685 阅读 · 0 评论 -
【GDB】 ——.gdbinit 文件
这个文件,并把它的内容作为gdb命令进行解释,所以如果我把脚本命名为。gdb 在启动的时候通常想加入一下自己的命令,例如。gdb 在启动的时候,会在你的当前工作目录下查找。,这样在启动的时候就会处理一些你常用的命令。1、在/home/tyustli 下添加一个。(即你要Debug的目录)下,同样添加一个。实际使用时,会存在一个问题,比如你需要在。写代码, 因此,你想在当前目录下添加。, 默认GDB初始化时会调用这个文件。新建一个 shell 脚本。, 然后调用 GDB。原创 2023-09-27 21:15:56 · 1655 阅读 · 0 评论