1

我正在研究零除法的内核源代码(2.6.35)。

我在用户空间程序中插入了零除法,所有线程都停止了。

所以我想知道 Arm Cortex A-9 内核中的“零除法”在哪里?

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

谢谢

4

1 回答 1

10

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

main() {                                                                                                                                                                             
   int x = 42 / 0;                                                                                                                                                                   
}                                                                                                                                                                                    

编译器将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)

然后error_code目标会处理所有必要的操作来处理错误并最终从陷阱中返回。


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

于 2012-09-21T08:38:24.167 回答