转载注明出处: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的内核栈上即可。

ARM Linux中断发生时内核堆栈切换的更多相关文章

  1. ARM linux解析之压缩内核zImage的启动过程

    ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s  ...

  2. ARM linux中断总结

    Linux异常处理体系结构 Linux异常体系之vector_stub宏解析 Linux异常体系之stubs_offset Linux中断体系结构 ARM系统调用

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

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

  4. Linux内核堆栈使用方法 进程0和进程1【转】

    转自:http://blog.csdn.net/yihaolovem/article/details/37119971 目录(?)[-] 8 Linux 系统中堆栈的使用方法 81  初始化阶段 82 ...

  5. linux中断源码分析 - 中断发生(三)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始 ...

  6. 理解Linux中断 (1)【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/7425685 版权声明:本文为博主原创文章,未经博主允许不得转载. 一直认为,理解中断是理解内核 ...

  7. Linux中断管理

    CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...

  8. Linux中断概述

    中断和异常 1.1中断的由来及实质 Linux内核要管理计算机上的硬件设备,首先要和他们通信.而处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后 ...

  9. Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】

    转自:http://blog.csdn.net/droidphone/article/details/7467436 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...

随机推荐

  1. Sorting Algorithms

    Merge sort by using recursive strategy, i.e. divide and conquer. def merge(left,right): result = [] ...

  2. python中RabbitMQ的使用(路由键模糊匹配)

    路由键模糊匹配 使用正则表达式进行匹配.其中“#”表示所有.全部的意思:“*”只匹配到一个词. 匹配规则: 路由键:routings = [ 'happy.work',  'happy.life' , ...

  3. org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in 'c

     org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in ' ...

  4. C++ leetcode Longest Palindromic Substring

    明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...

  5. vue数组操作不更新视图问题

    vue 观察数组的变异方法 更新视图 push() pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.pu ...

  6. notepad++自动对齐使用空格代替Tab并将空格显示为小点

    一.说明 对大多数语言而言自动对齐使用空格还是tab对编译运行并没有什么影响,但对python问题就很大:因为就算是缩进看起来是一样的但某些行用空格某些行用tab运行会报错. 另外除了空格替换tab外 ...

  7. openssh安装/更新教程(CentOS)

    由于rpm包版本总落后于tar包,对于想安装新版本或由于漏洞需要更新到新版本那只能选择源代方式编译安装. 更新执行和安装一样的步骤就行了. 1.下载 官方网址:http://www.openssh.c ...

  8. TCP/UDP工作流程图

     说到socket必须要贴的图: TCP工作流程:  UDP工作流程:

  9. RabbitMQ 设置消息的优先级

    在RabbitMQ中,可以设置消息的优先级,也就相当于在队列中置顶某条消息,让某个消息优先得到处理的功能. 既然是设置消息的优先级,那么就是针对生产者,也就是消息发布端. 设置消息的优先级一共有2个步 ...

  10. RTTI,C++类型转换操作符

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...