Arm Cortex A-9内核中的"零分割"在哪里

Ash*_*dav 1 kernel divide-by-zero linux-device-driver linux-kernel

我正在研究零分割的内核源代码(2.6.35).

我在用户空间程序中插入了零分割并且所有线程都停止了.

所以我想知道Arm Cortex A-9内核的"零分割"在哪里?

我无法找到任何陷阱....

谢谢

And*_*ter 8

这取决于架构.给定x86系统上的以下用户空间代码:

main() {                                                                                                                                                                             
   int x = 42 / 0;                                                                                                                                                                   
}                                                                                                                                                                                    
Run Code Online (Sandbox Code Playgroud)

编译器将idivl命令插入到目标代码中.当该除数为0时执行该命令时,CPU会产生除零陷阱(类似于中断).这会调用divide_error内核中的陷阱处理程序,如果是x86,它位于arch/x86/kernel/entry_32.S:

ENTRY(divide_error)
        RING0_INT_FRAME
        pushl_cfi $0                    # no error code
        pushl_cfi $do_divide_error
        jmp error_code
        CFI_ENDPROC
END(divide_error)
Run Code Online (Sandbox Code Playgroud)

然后,error_code目标负责处理错误的所有必要操作,最后从陷阱返回.


ARM上,情况有所不同:除少数例外情况外,ARM CPU没有硬件除法指令(例如Arm Cortex A-9没有).部门需要作为图书馆职能来实施.对于内核,这是在arch/arm/lib/lib1funcs.S您通过零处理找到除法的地方实现的.对于用户空间应用程序,我认为这是作为libgcc库中的库函数实现的.