Linux异常处理体系结构

发布者:温暖梦想最新更新时间:2024-11-05 来源: cnblogs关键字:Linux  异常处理  体系结构 手机看文章 扫描二维码
随时随地手机看文章

在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的对应关系如下:  [V=0]0x00000000~0x0000001C /[V=1]0xffff0000~0xffff001C  。Linux内核使用0xffff0000。


异常向量的代码很简单,只是一些跳转指令。发生异常时,cpu自动执行这些指令,跳转到更复杂得代码。


地址__vectors_start~__vectors_end间的代码就是异常向量,在arch/arm/kernel/entry-armv.S中定义,这些异常向量会被复制到0xffff0000处。


    .globl    __vectors_start

__vectors_start:

    swi    SYS_ERROR0                   //复位时,cpu将执行这条指令

    b    vector_und + stubs_offset    //未定义异常时,cpu执行这条指令

    ldr    pc, .LCvswi + stubs_offset   //swi异常

    b    vector_pabt + stubs_offset   //指令预取终止

    b    vector_dabt + stubs_offset   //数据访问终止

    b    vector_addrexcptn + stubs_offset //没有用到

    b    vector_irq + stubs_offset    //irq异常

    b    vector_fiq + stubs_offset    //fiq异常


    .globl    __vectors_end

__vectors_end:


 “更复杂得代码”在地址__stubs_start~__stubs_end之间,在arch/arm/kernel/entry-armv.S中定义,这些异常向量会被复制到0xffff0200处。


 __stubs_start

关于stubs_offset的值及解析,参考Linux异常体系之stubs_offset


关于__stubs_start~__stubs_end之间的代码解析,参考vector_stub宏解析 。vector_irq、 vector_dabt、vector_pabt、vector_und、vector_fiq都在它们中间。


各种异常的C处理函数分为5类,分布在不同的函数中。


1.中断处理C总入口函数asm_do_IRQ,在linux/arch/arm/kernel/irq.c中。它调用其它文件注册的中断处理函数。


init_IRQ函数被用来初始化中断的处理框架,设置各种中断的默认处理函数。当中断发生时,中断总入口函数asm_do_IRQ就可以调用这些函数坐进一步的处理。


b    vector_irq + stubs_offset

    -->vector_stub    irq, IRQ_MODE, 4

        -->__irq_usr/__irq_svc

            -->void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

2.未定义指令处理C总入口函数do_undefinstr,在linux/arch/arm/kernel/traps.c中。


b    vector_und + stubs_offset

    -->vector_stub    und, UND_MODE

        -->__und_usr/__und_svc

            -->b    do_undefinstr

3.与内存访问相关的异常处理C总入口函数do_DataAbort,do_PrefechAbort,在linux/arch/arm/kernel/fault.c中。


4.swi异常处理函数,在在linux/arch/arm/kernel/calls.S中。swi异常的处理函数指针被组织成一个表格;swi指令机器码的为[23:0]用来作为索引,通过不同的“swi index”指令可以调用不同的swi异常处理函数,也称为系统调用,比如sys_open、sys_read、sys_write等。


5.没有使用的异常,linux中没有使用FIQ异常。


关键字:Linux  异常处理  体系结构 引用地址:Linux异常处理体系结构

上一篇:ARM MMU
下一篇:Linux中断体系结构

推荐阅读最新更新时间:2026-03-21 10:49

Linux内核异常处理体系结构详解(一)
【首先来区分一下两个概念:中断(Interrupt)和异常(Exception)。中断属于异常的一种,就拿2440开发板来说,他有60多种中断源,例如来自DMA控制器、UART、IIC和外部中断等。2440有一个专门的中断控制器来处理这些中断,中断控制器在接收到这些中断信号之后就需要ARM920T进入IRQ或FIQ模式进行处理,这两种模式也是中断异常的仅有模式。而异常的概念要广的多,它包括复位、未定义指令、软中断、IRQ等等。还有一点知识就是,中断这种异常在响应之前到来之前是需要程序员进行什么优先级、是否要屏蔽信号之类的初始化的,而其他比如未定义指令是不用的,只要发生了就跳到异常向量入口取址执行。因此下面初始化内容中的第(2)点是
[单片机]
Linux驱动之异常处理体系结构简析
异常的概念在单片机中也接触过,它的意思是让CPU可以暂停当前的事情,跳到异常处理程序去执行。以前写单片机裸机程序属于前后台程序,前台指的就是mian函数里的while(1)大循环,后台指的就是产生异常后的处理程序。ARM9有以下几种异常模式: ARM架构的异常向量的地址可以是0x00000000,也可以是0xffff0000,Linux使用地址0xffff0000。在初始化时先将中断向量表放到0xffff0000处,在init/main.c的start_kernel函数里的trap_init();函数中处理具体代码为: 718 void __init early_trap_init(void) 719 { ...
[单片机]
ARM平台上Linux异常处理代码简要分析
Linux version 3.10.40 ARM处理器支持多种异常模式,如reset,irq,fiq等,发生异常后处理器根据配置跳到指定的地址运行,可以配置成从0地址开始,也可以配置成从0xFFFF0000地址开始。我们从两个角度分析Linux上的实现,第一是负责异常处理的代码是如何安装到该地址的,第二是这些代码的处理流程是什么样的。 一 放置异常处理代码流程 依次涉及: init/main.c中的start_kernel函数 arch/arm/kernel/setup.c中的setup_arch函数 arch/arm/mm/mmu.c中的paging_init和devicemaps_init函数 a
[单片机]
三、ARM 寄存器及异常处理
3.1 ARM 内部寄存器 ARM920T 总共有 37 个寄存器,其中 31 通用 32 位寄存器和 6 个状态寄存器,但不能在同一时刻对所有的寄存器可见。处理器状态和运行模式决定了哪些寄存器对程序员可见 3.1.1 ARM 状态时内部寄存器 在 ARM 状态,16 个通用寄存器和一个状态寄存器在任意时刻都可见。在特权(非用户)模式下,将切换到指定模式的分组(banked)寄存器。 ARM 状态时寄存器被设为包含 16 个直接可以访问的寄存器:R0 到 R15。除了 R15,其他全部寄存器都为通用寄存器,如可能用于保存数据或地址值。除此之外,还有第 17 个寄存器用于存储状态信息。    FIQ 模式包含 7 个分组寄存
[单片机]
三、ARM 寄存器及<font color='red'>异常</font><font color='red'>处理</font>
四、ARM 异常处理
4.1 模式与异常 当正常程序流程被暂时停止发生异常,例如响应一个来自外设的中断。在处理异常前,必须保护当前的处理器状态,以便在完成处理程序后能恢复到原来的程序 。 异常的类型: Reset undefined instruction swi prefetch/bort data/abort Reserved IRQ FIQ 处理器的模式: 每一个异常对应一种模式, 但不是一一对应关系   如下,中断向量表 4.2 ARM 异常处理过程   下面的步骤都是硬件自动完成的,软件不需要完成。 解释:    4.3 异常进入/返回总结 注意: PC 在不同情况含义不一样,比如:PC(excute)=PC(fe
[单片机]
四、ARM <font color='red'>异常</font><font color='red'>处理</font>
CP8030H电流探头操作注意事项及异常处理方法
CP8030B/H 体积轻巧,可在当前拥挤的电路板中使用自如;小型钳夹可以在紧张的空间中探测电流,同时仍能夹住直径达5mm的导线;可以测量30A的连续电流和50A的峰值电流,CP8030B提供50MHz 的带宽,CP8030H提供100MHz带宽;探头具有 30A (10X)和 5A (1X)两个量程可选择,5A (1X)量程特别适用于小电流测量,分辨率高达1mA。 一、CP8030H电流探头操作方法: 该机器的输出终端设置在内部,使用示波器时,请选择高输入电阻的(1MΩ)。若输入电阻为50Ω,则不能正确测量。 确保被测电流不要超过最大电流。超过额定值,磁芯会饱和。磁芯饱和会导致在饱和的过程中发生波形部分被削掉,过大的冲击电流
[测试测量]
CP8030H电流探头操作注意事项及<font color='red'>异常</font><font color='red'>处理</font>方法
ARM的37个寄存器和异常处理机制详解
1.ARM的37个寄存器 ARM的37个寄存器中,30个寄存器是“通用”,1个固定用作PC(程序控制寄存器),一个固定用作CPSR(程序状态寄存器),5个固定用作5种异常模式下的SPSR(程序状态保存寄存器),特别注意user模式和sys模式共用寄存器集。上面的37个寄存器不是同时可见的,只有在特定模式下才能访问某些寄存器。例如sp和lr寄存器各有6个,但是只有在相应模式下才能访问相应的寄存器,在user模式下访问的是user的sp和lr,FIQ模式下访问的是FIQ的sp和lr,这叫做影子寄存器。模式切换时寄存器会自动切换,其中用r13作sp,用r14作lr并不是一定的,用其他的寄存器作sp和lr也是可以的,只是大家约定俗成的
[单片机]
ARM的37个寄存器和<font color='red'>异常</font><font color='red'>处理</font>机制详解
变电站隔离开关异常分析及处理方法研究
引言 隔离开关即闸刀的主要作用是在设备检修时,用来隔离有电和无电部分,造成明显的断开点,使检修的设备与电力系统隔离,以保证工作人员和设备的安全。在变电运维中,隔离开关是转变运行方式的主要工具,直接影响着系统供电的可靠性和安全性。正常运行过程中,隔离开关很少发生异常状况,但在倒闸操作过程中经常出现设备异常、操作异常情况。因此,运维人员必须掌握基本的隔离开关常见异常处理方法,提高倒闸操作效率。 1隔离开关电动操作原理分析及操作失灵处理方法 隔离开关电动操作控制回路如图1所示,220kV间隔一次接线图如图2所示。1G回路接通需满足:隔离开关在分闸位置(分相开关为三相均在分位)2G刀闸处分位,1GD、3GD1接地刀闸在分位:或2G刀闸
[嵌入式]
变电站隔离开关<font color='red'>异常</font>分析及<font color='red'>处理</font>方法研究
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved