ARM Linux中断发生时内核堆栈切换
转载注明出处: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中断发生时内核堆栈切换的更多相关文章
- ARM linux解析之压缩内核zImage的启动过程
ARM linux解析之压缩内核zImage的启动过程 semilog@163.com 首先,我们要知道在zImage的生成过程中,是把arch/arm/boot/compressed/head.s ...
- ARM linux中断总结
Linux异常处理体系结构 Linux异常体系之vector_stub宏解析 Linux异常体系之stubs_offset Linux中断体系结构 ARM系统调用
- linux信号机制 - 用户堆栈和内核堆栈的变化【转】
转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...
- Linux内核堆栈使用方法 进程0和进程1【转】
转自:http://blog.csdn.net/yihaolovem/article/details/37119971 目录(?)[-] 8 Linux 系统中堆栈的使用方法 81 初始化阶段 82 ...
- linux中断源码分析 - 中断发生(三)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 回顾 上篇文章linux中断源码分析 - 初始化(二)已经描述了中断描述符表和中断描述符数组的初始化,由于在初始 ...
- 理解Linux中断 (1)【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7425685 版权声明:本文为博主原创文章,未经博主允许不得转载. 一直认为,理解中断是理解内核 ...
- Linux中断管理
CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...
- Linux中断概述
中断和异常 1.1中断的由来及实质 Linux内核要管理计算机上的硬件设备,首先要和他们通信.而处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后 ...
- Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
转自:http://blog.csdn.net/droidphone/article/details/7467436 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...
随机推荐
- C++ leetcode Longest Substring Without Repeating Characters
要开学了,不开森.键盘声音有点大,担心会吵到舍友.今年要当个可爱的技术宅呀~ 题目:Given a string, find the length of the longest substring w ...
- 音频 API 一览
iOS 和 OS X 平台都有一系列操作音频的 API,其中涵盖了从低到高的全部层级.随着时间的推移.平台的增长以及改变,不同 API 的数量可以说有着非常巨大的变化.本文对当前可以使用的 API 以 ...
- 循环中点击单个事件(巧用this,指向当前对象)
<em id='show' value="<?php echo $member['phone']; ?>" class="sui">&l ...
- select2中的ajax请求
下面介绍select2.js的方法,已经整理好文件,可以直接下载使用: 实现效果如下: 引用文件:select2.min.css jquery.js select2.full.min.js <h ...
- nginx补丁格式说明(CVE-2016-4450为例)
nginx安全公告地址:http://nginx.org/en/security_advisories.html CVE-2016-4450:一个特定构造的数据包,可引发nginx引用空指针,导致ng ...
- QPainter绘制渐进色文本
参考资料:https://blog.csdn.net/what951006/article/details/52876513 效果图: 代码: void WgtText::paintEvent(QPa ...
- Struts 2 初步入门(二)
Struts 2 动态方法调用 1.在HelloWorldAction中添加两个新的方法如下: import com.opensymphony.xwork2.ActionSupport; public ...
- 给msde加装企业管理器
-=给msde加装企业管理器=- 首先,反对所谓的绿色版,运行那是 相~~~当 不稳定,自动关闭,要你有什么用?还广告飞扬!为了调试,花了我整整一天的时间.给大家节省的时间,也为了让大家少走点弯路. ...
- Json使用示例
使用Json,可以下载如下所示的6个Jar包 整个工程目录结构如下: 简单的用法: package json; import net.sf.json.JSONArray; import net.sf. ...
- C++关于运算符的注意事项
1.函数调用也是一种特殊的运算符,对运算对象的个数不作限制. 2.几元运算符,是基于作用的对象的数量. 3.不同类型的运算对象进行运算,可能会出现类型转换,一般情况下小整数类型会被转换成较大的整数类型 ...