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的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...
随机推荐
- servlet初认知(持续更新中)
一:前言: 一个Servlet程序其实就是一个实现了Java特殊接口的类,它由支持Servlet(具有Servlet引擎)的WEB服务器调用和启动运行.一个Servlet程序负责处理它对应的一个或者多 ...
- 前端基础之html常用标签
前言: 1.在B-S模式下,server服务端和客户端之间 使用http协议(规定 客户端应该怎么请求服务端,服务端应该怎么响应)通信: 2.传输过程 浏览器 向服务端发起 post/get请求 服务 ...
- Python购物车
product_list = [ ['Iphone',5888], ['Mac Air',8000], ['XiaoMi',19.9], ['coffee',30], ['Tesla',820000] ...
- CentOS和AIX查看系统序列号
一.CentOS查看系统序列号 dmidecode -t dmidecode--将DMI数据库中的信息解码,以可读的文本方式显示:该命令需要root权限. -t 1--DMI数据库包含包括BIOS.系 ...
- GNU和GPL的区别/关系
GUN:GNU's Not UNIX的缩写,是一项运动.是1983年Richard Stallman针对UNIX走向毕源和和收费后发起的运动,旨在打造出一套完全开源免费的操作系统. 为了更好地实施GN ...
- spring事务管理(详解和实例)
原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...
- sql中,如何获取一个数的整数部分和余数部分
我们测试一下,我要得到的结果是多少周(整数),多少天(余数) 1.获取指定日期到当前日期之间的天数 首先用DATEDIFF() 函数获取指定日期到当前日期的天数 --获取指定日期到当前日期的天数 se ...
- js--阻止冒泡,捕获,默认行为
防止冒泡和捕获 w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true· var el = window.document.getElementB ...
- BPTT for multiple layers
单层rnn的bptt: 每一个时间点的误差进行反向传播,然后将delta求和,更新本层weight. 多层时: 1.时间1:T 分层计算activation. 2.时间T:1 利用本时间点的误差,分层 ...
- Ubuntu安装openssh-server并通过xshell连接
#安装ssh sudo apt-get install openssh-server openssh-client sudo apt-get update sudo apt-get upgrade 查 ...