ARM平台Linux内核空指针异常处理流程

本文详细介绍了在ARM平台Linux 3.10.40内核中,当发生空指针异常时的处理流程。从异常向量入口`vector_dabt`开始,通过`__dabt_svc`、`dabt_helper`进入CPU特定的异常处理,调用`do_DataAbort`等函数,最终到达`__do_kernel_fault`进行错误处理。在这个过程中,`show_pte`和`die`函数用于打印错误信息并终止进程。文章还探讨了`die`函数的调用、报告错误以及`panic`的触发情况。
摘要由CSDN通过智能技术生成

ARM平台Linux内核空指针异常处理流程

平台:Linux 3.10.40 + ARM V7

一 从异常向量入口到__do_kernel_fault

访问空指针在ARM平台上属于data abort异常,对应异常向量中的vector_dabt。

文件:arch/arm/kernel/entry-armv.S

__vectors_start:

         W(b)          vector_rst

         W(b)          vector_und

         W(ldr)       pc, __vectors_start + 0x1000

         W(b)          vector_pabt

         W(b)          vector_dabt

         W(b)          vector_addrexcptn

         W(b)          vector_irq

         W(b)          vector_fiq

在vector_dabt中,因为是内核发生异常,且内核运行在supervisor中,所以跳转到__dabt_svc中执行。

/*

* Data abort dispatcher

* Enter in ABT mode, spsr = USR CPSR, lr = USR PC

*/

         vector_stub     dabt, ABT_MODE, 8

         .long         __dabt_usr                         @  0  (USR_26 / USR_32)

         .long         __dabt_invalid                            @  1  (FIQ_26 / FIQ_32)

         .long         __dabt_invalid                            @  2  (IRQ_26 / IRQ_32)

         .long         __dabt_svc                         @  3  (SVC_26 / SVC_32)

         .long         __dabt_invalid                            @  4

         .long         __dabt_invalid                            @  5

         .long         __dabt_invalid                            @  6

         .long         __dabt_invalid                            @  7

         .long         __dabt_invalid                            @  8

         .long         __dabt_invalid                            @  9

         .long         __dabt_invalid                            @  a

         .long         __dabt_invalid                            @  b

         .long         __dabt_invalid                            @  c

         .long         __dabt_invalid                            @  d

         .long         __dabt_invalid                            @  e

         .long         __dabt_invalid                            @  f

__dabt_svc实现如下:

         __dabt_svc:

         svc_entry

         mov r2, sp

         dabt_helper

THUMB(         ldr    r5, [sp, #S_PSR]        )        @ potentially updated CPSR

         svc_exit r5                                    @ return from exception

UNWIND(.fnend              )

ENDPROC(__dabt_svc)

dabt_helper宏展开如下,在未定义MULTI_DABORT的情况下调用CPU_DABORT_HANDLER

         .macro     dabt_helper

         @

         @ Call

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值