转载注明出处: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. Qt_Pro详解

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从“#”开始,到这一行结束. 2.模板变量告诉qmake为这个应用程 ...

  2. Python获取时间戳

    import datetime as dt dt.datetime.now().microsecond

  3. nyoj 1091 还是01背包(超大数dp)

    nyoj 1091 还是01背包 描述 有n个重量和价值分别为 wi 和 vi 的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值 1 <= n <=40 1 ...

  4. php 图片添加水印和二维码

    $host = $_SERVER['HTTP_HOST']; $save_code_file = './qrcodes/qrcode.png'; QrCode::format()->backgr ...

  5. how to get ubuntu current default runlevel

    [Purpose]        Learning how to get ubuntu current default  runlevel   [Eevironment]       Ubuntu 1 ...

  6. unity3D开发的程序发布到Android平台上进行运行测试的详细步骤

    第一步    下载安装JDK 和SDK 1.需要配置java环境.点击链接进入ava的配置的方法:http://www.cnblogs.com/Study088/p/7496158.html 2.下载 ...

  7. Unity中Text中首行缩进两个字符和换行的代码

    1.首行缩进两个字符 txt.text=“\u3000\u3000” + str: 2.首行缩进两个字符 将输入法换成全角的,在Text属性面板中添加空格即可. 3.换行    “\n” 补充 Uni ...

  8. window.open()打开页面

    一.window.open()支持环境:JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法:window.open(pageURL,name,pa ...

  9. 【原创】QT简单计算器

    代码 //main.cpp #include "calculator_111.h" #include <QtWidgets/QApplication> int main ...

  10. openpyxl读取Excel数据

    #! Python3 #-*- coding:utf8 -*- import openpyxl #载入表格内容 wb=openpyxl.load_workbook('e:\\work\\newFile ...