转载注明出处:http://www.wowotech.net/forum/viewtopic.php?id=54

对ARM Linux中断非常简洁、精确的描述。

发生了中断,最重要的是保存现场,在中断处理完之后,能够恢复现场就OK了,硬件现场(hardware context)的保存是由硬件和软件共同完成的。

对于ARM,当发生中断的那一刻,硬件会进行如下的动作:

1、将发生中断那一刻的CPSR保存在SPSR寄存器中

2、将返回地址保存在lr寄存器中(注意:这个lr寄存器是IRQ mode的lr寄存器,可以表示为lr_irq)

真正将hardware context保存到内核栈上是软件的行为。当然,目标是一开始就设定好了,将发生中断那一刻的hardware context保存到current task的内核栈上。不同的CPU有不同的设计,提供不同的软件和硬件的接口,对于X86,硬件帮忙做的事情更多,而ARM更希望你自己能够自力更生(更简单的HW logic意味着更少的晶体管,更少的功耗,而这也是ARM在移动平台上能够横扫Intel的根本原因)。怎么办?hardware context包括了cpu中的各种寄存器,想要将hardware context压入内核栈首先要获取current thread的内核栈指针,任何对cpu寄存器的使用将破坏硬件上下文,因此,linux kernel采用的方法是借用12个字节的中断栈。方法如下:

1、在中断栈上保存了发生中断那一点的r0值、PC值以及CPSR值。你可能会觉得:PC和CPSR需要保存吗?不是硬件已经帮忙保存lr_irq(虽然不是PC值,但是和PC值有固定的偏移关系)和spsr_irq中了吗?之所以保存spsr_irq和lr_irq的值,那是因为随后在切换到svc mode的时候需要修改spsr_irq和lr_irq的值。之所以保存r0,是因为后续会修改r0的值,把它做为一个scratch register。

2、切换到svc mode,具体完成下面两个步骤:

(A)将处理器模式切换到svc mode

(B)根据发生中断那一点的处理器模式,将pc设定为__irq_usr或者__irq_svc

在上面的过程中,lr_irq,spsr_irq和r0被破坏了,但是没有关系,相关信息已经保存在了中断栈上了(sp_irq)

3、一旦切换到SVC mode,ARM处理器看到的寄存器已经发生变化,这里的sp已经变成了sp_svc了。问题来了:sp_svc是什么值?在进程切换的时候就已经设定好了,sp_svc被设定为current thread的内核栈。这时候,除了被破坏的三个寄存器保存在中断栈上,其他的寄存器毫发无伤,软件只要将这些hardware context压入current thread的内核栈上即可。

linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换相关推荐

  1. linux信号机制 - 用户堆栈和内核堆栈的变化【转】

    转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...

  2. Linux时间、定时器、时间中断超时处理

    内核时间管理 Linux内核计时.延时函数与内核定时器 内核通过定时器(timer)中断来跟踪时间流 硬件定时器以周期性的间隔产生时间中断,这个间隔(即频率)由内核根据HZ来确定,HZ是一个与体系结构 ...

  3. kernel 3.10内核源码分析--内核栈及堆栈切换

    1.概念 Linux中有3种栈: 1)用户栈.当进程处于用户态时使用,位于进程地址空间(用户态部分(如:0-0xc0000000))底部,用户态分配局部变量和函数调用时时,使用该栈,跟平时我们见到和理 ...

  4. [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序...

    如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...

  5. Linux运行911,韦东山-Linux下编写GT911触摸驱动 - 百问网嵌入式问答社区

    源码在最下面 问题一:资源获取Gt911数据手册 在韦老师给的资料里,路径为\06_Datasheet\Extend_modules\7寸LCD模块\电容触控芯片GT911 Datasheet_121 ...

  6. 调用门、堆栈切换与调用过程返回

    论天下大势,合久必分分久必合.上回书我们说了<CPL,RPL和DPL:这三个级别你搞懂了吗?>,这回书我们讲调用门以及堆栈切换. 门描述符 为了提供对具有不同特权级别的代码段的受控访问,处 ...

  7. arm linux 进程调度,详解ARM Linux 2.4.x进程调度

    Linux2.4.x是一个基于非抢占式的多任务的分时操作系统,虽然在用户进程的调度上采用抢占式策略,但是而在内核还是采用了轮转的方法,如果有个内核态的线程恶性占有CPU不释放,那系统无法从中解脱出来, ...

  8. ARM GIC简介与Linux中断处理分析

    先简单说明一下GIC(具体详尽的介绍请查阅ARM GIC相关文档) GIC即general interrupt controller. 它是一个架构,版本历经了GICv1(已弃用),GICv2,GIC ...

  9. 在 Linux 下安装 GNU ARM 工具链

    可以使用多种工具编写不同版本的 ARM 内核,但最流行的一组工具是 GNU ARM 工具链.更多地了解如何使用 ARM 内核进行嵌入式开发,以及如何安装并使用 GNU 工具. 如果您对在最普遍的微处理 ...

最新文章

  1. ArrayList和LinkedList的add(E)性能秘密
  2. 四万字让你精通SQL数据库操作
  3. 【软件工程】交付后维护
  4. Python_内置模块1
  5. Unreal Engine 4 基于网格的水面模拟实现
  6. UItabelView头部视图;
  7. excel图表交互联动_Excel 制作滑动控制联动(Excel数据图表)具体实现方法
  8. sata AHCI驱动下载(AMD Intel Nvidia)
  9. videojs创建control-bar组件,实现点击播放下一视频
  10. 清明去哪玩儿? 可视化工具帮你锁定旅游TOP10!
  11. Hadoop、Storm和Spark主流分布式系统特点和应用场景
  12. APP测试点分析与总结
  13. java计算机毕业设计的健身房管理系统MyBatis+系统+LW文档+源码+调试部署
  14. dva处理_关于dva框架的二三事
  15. 9 客户端认证方式 之 PKCE
  16. Android视频监控!!!随时随地监控你的家庭
  17. 【模拟】相似度 (similar.pas/c/cpp)
  18. VSCode中使用 eslint+prettier完成代码格式化以及自动化整理
  19. 通过外网访问局域网中的IPCamera
  20. Electron flash插件

热门文章

  1. Windows10安装TensorFlow GPU版本
  2. 使用GoLand创建并运行项目
  3. 深入理解 Java 垃圾回收机制
  4. C++ deque 底层原理及 queue、stack 容器的使用详解
  5. 自旋锁、互斥锁和信号量
  6. 组合和聚合的区别,通俗易懂。
  7. 【dijkstra模板】旅游规划 (25 分)
  8. 剑指offer58-||.左旋转字符串
  9. [leetcode] 160.相交链表
  10. mysql语法中的LIMIT的用法