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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### ARM芯片空指针访问错误原因 在嵌入式系统开发过程中,尤其是基于ARM架构的设备中,空指针访问是一个常见的软件缺陷。当程序尝试通过NULL指针读取或写入数据时会发生此类异常。 #### 原因分析 - **未初始化指针**:如果声明了一个指向特定类型的指针变量但是忘记给它分配实际对象,则该指针可能保持为零值即为空状态[^1]。 - **释放后的指针再利用**:动态分配内存之后,在free()调用之后继续使用这些已经被释放掉的空间也会造成同样的后果[^2]。 - **返回局部对象地址**:函数内部创建临时实体并将其地址作为结果传递出去可能导致接收方获得悬垂引用(dangling reference),这同样表现为非法存取操作[^3]。 ```c void badPractice(int *ptr) { int local; ptr = &local; // 返回后 'local' 不再存在 } ``` ### 解决方案 为了防止上述情况的发生以及处理已经发生的空指针访问问题: - **严格检查输入参数的有效性**:对于任何接受外部传入的数据结构都应先验证其合法性再做进一步的操作[^4]。 - **启用硬件保护机制**:现代处理器通常具备MMU/MMMU单元能够监控虚拟到物理映射过程中的越界行为,并触发相应的中断信号告知操作系统采取措施[^5]。 - **调试工具辅助定位问题源码位置**:借助GDB等调试器可以在运行期间捕获崩溃现场信息从而快速锁定有问题的地方[^6]。 ```bash (gdb) run Starting program: /path/to/executable Program received signal SIGSEGV, Segmentation fault. 0x... in function_name () at file.c:line_number ``` - **静态代码分析预防潜在风险**:像Cppcheck这样的工具有助于提前识别那些可能会引起逻辑漏洞的风险点以便及时修正[^7]。 ```cpp // 使用 Cppcheck 进行静态分析 $ cppcheck --enable=all source_code_directory/ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值