我正在研究零除法的内核源代码(2.6.35)。
我在用户空间程序中插入了零除法,所有线程都停止了。
所以我想知道 Arm Cortex A-9 内核中的“零除法”在哪里?
我无法为此找到任何陷阱....
谢谢
我正在研究零除法的内核源代码(2.6.35)。
我在用户空间程序中插入了零除法,所有线程都停止了。
所以我想知道 Arm Cortex A-9 内核中的“零除法”在哪里?
我无法为此找到任何陷阱....
谢谢
这取决于架构。给定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 库中的库函数实现的。