ARM软中断流程详解

中断流程:①发生中断操作。②程序跳转至相应中断处理函数。③保存现场、处理功能、恢复现场。④程序跳转正常模式继续运行

注:本文将以软中断swi 2指令,在SVC与user两种模式的切换做详细解释。

先来看发生中断时候的特定函数

这里我们先开辟两个空间,存放发生中断后寄存器内容以及lr寄存器内的中断的下调命令地址。

.data
.stack_svc:@svc模式下的sp寄存器
.space 100@开辟100字节
.stack_svc_end:@函数结束

.stack_user:  @user模式下的sp寄存器
.space 100
.stack_user_end:

因为当前是svc模式,所以我们先将svc开辟的空间地址给到它的sp寄存器,同时写好异常向量表。然后告诉编译器我们的开始地址,这里以reset函数为起始函数

.gloal _start @告诉编译器从哪里开始读取
_start: @从这里开始往下走
.text  @接下来是代码段
b reset @当前模式下的起始入口 地址为0x00 也可以写为ldr pc,=reset
nop @b undfine_hander@未定义中断,这里用不到,但为了符合向量表就先写上
b swi_hander @发生软中断时的跳转入口 地址为0x08  异常向量表简单的写两个即可
nop
nop
nop    
nop
nop@预留异常向量表的地址


reset:@抒写初始函数功能
ldr sp,=stack_svc @将开辟好的栈区空间首地址给svc模式下的sp寄存器(此时为svc模式)
mrs r0,cprs @将cprs当前的状态放至r0,当前时svc模式(10011),所以我们需要间接去改变它
bic r0,#0x1f @先清空r0状态内容
mov r0,#0x10 @将r0改为user模式
msr cprs,r0 @将r0的值放置cprs中更改当前模式为user(10000)
ldr sp,=stack_user@将开辟好的栈区空间首地址给user模式下的sp寄存器(此时为user模式)
mov r0,#1 @开始在user模式下操作寄存器
mov r2,#2
swi 2@采用open操作,这里开始发生软中断反应
sub r3,r1,r0  @为了验证跳出时,寄存器内容是否依旧为跳转前的内容



swi_hander: 软中断的跳转函数
stmfd sp!,{r0-r12,lr}@入栈操作
mov r0,#0xff
mov r1,#0xad @操作当前模式下的寄存器
sub r3,lr,#4 @获取跳转指令的地址(swi 2)
ldr r4,[r3] @获取跳转指令的机器码至寄存器4
bic r4,#0xff000000 @保存机器指码的后两位
cmp r4,#2 @分析跳转指令是否为软中断2号指令
movne r5,0x55 
moveq r5,0x66  @若为软中断2号指令则将寄存器r5改为0x66,不是则0x55
swi_hander_end: @软中断跳转函数结束
ldm sp!,{r0-r12,pc} @出栈操作,恢复现场。同时跳转到发生中断的后一条指令准备执行

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Linux ARM GIC 中断流程" 是指在 ARM 架构的 Linux 操作系统中,使用 Generic Interrupt Controller(GIC)处理器来管理系统中各种中断流程。它负责将来自不同设备和外部事件的中断请求,分派给适当的处理程序来处理,并确保系统按顺序执行这些处理程序。中断处理是系统中一个重要的组成部分,它允许设备和软件互相通信,并提高了系统的稳定性和可靠性。 ### 回答2: Linux是一个非常流行的开源操作系统,可以在不同架构的计算机上运行。ARM架构是一种广泛使用的嵌入式系统架构,因此,许多嵌入式设备都使用Linux作为其操作系统。在ARM架构上,通常会使用GIC(通用中断控制器)来管理中断,这个过程可以分为中断触发、CPU响应和中断处理三个部分。 中断触发是指中断信号从设备到达GIC的过程。当一个设备需要发送一个中断时,它会向GIC发送一个中断请求信号,并指定中断号,这个中断号是唯一的,用于区分不同的中断。GIC会根据中断号去查找到这个中断对应的中断控制器,进而把这个请求传递给指定的CPU。 CPU响应是指CPU接收到中断请求信号后的响应过程。当GIC把中断请求传递给CPU时,CPU需要检查是否允许这个中断请求,也就是检查中断屏蔽寄存器(Interrupt Mask Register)。如果这个中断请求已被屏蔽,则CPU不会响应,否则,它会设置自己的中断挂起寄存器(Interrupt Pending Register),告诉GIC它已经准备好去处理这个中断中断处理是指CPU执行中断处理程序,处理具体的中断。当CPU设置了它的中断挂起寄存器后,GIC会向CPU发送一个中断信号。CPU会暂停当前的进程,并把当前的上下文信息(比如,寄存器值)保存到内存中。之后,CPU会跳转到中断处理程序(Interrupt Service Routine),开始执行具体的中断处理代码。中断处理程序完成后,CPU会从内存中恢复之前保存的上下文信息,并恢复之前进程的执行。 总的来说,ARM架构上的Linux操作系统通常使用GIC来管理中断,其中包括中断触发、CPU响应和中断处理三个方面。这个流程对于保证系统的稳定性和快速响应非常重要。 ### 回答3: 在ARM架构的Linux系统中,GIC(Generic Interrupt Controller)被用来管理中断。当发生中断时,GIC会将中断信号发送到CPU,然后CPU会停止当前的进程并处理中断。 GIC的中断流程如下: 1. 报告中断:设备或其他外部事件引发中断信号,设备向GIC发送中断信号,GIC会产生一个中断源标识符,然后将其发给CPU。 2. 响应中断:CPU根据中断源标识符查询GIC,查看中断请求的优先级和处理器状态,如果中断请求的优先级高于当前中断处理器,那么CPU会中止当前进程,执行中断处理程序。 3. 中断处理中断处理程序会读取设备状态,进行相应的操作,处理完成后会发出一个中断信号,通知GIC中断已被处理。 4. 中断结束:GIC收到来自设备的中断完成信号后,将中断源标识符置为未激活状态。 在这个流程中,GIC起到了一种路由的作用,将中断信号从设备传输到CPU,同时根据中断请求的优先级来优先处理高优先级的中断。这样就可以保证系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值