我正在研究零分割的内核源代码(2.6.35) .
我在用户空间程序中插入了零分割并且所有线程都停止了 .
所以我想知道Arm Cortex A-9内核的“零分割”在哪里?
我无法找到任何陷阱....
谢谢
这取决于架构 . 给定 x86 system 上的以下用户空间代码:
main() { int x = 42 / 0; }
编译器将 idivl 命令插入到目标代码中 . 当该除数为0时执行该命令时,CPU会产生除零陷阱(类似于中断) . 这会调用内核中的 divide_error 陷阱处理程序,如果是x86,它位于 arch/x86/kernel/entry_32.S 中:
idivl
divide_error
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 目标负责处理错误的所有必要操作,最后从陷阱返回 .
error_code
在 ARM 上,情况有所不同:除了少数例外,ARM CPUs do not have a hardware division instruction(例如Arm Cortex A-9没有) . 部门需要作为图书馆职能来实施 . 对于内核,这是在 arch/arm/lib/lib1funcs.S 中实现的,您还可以通过零处理找到除法 . 对于用户空间应用程序,我认为这是作为libgcc库中的库函数实现的 .
arch/arm/lib/lib1funcs.S
1 回答
这取决于架构 . 给定 x86 system 上的以下用户空间代码:
编译器将
idivl
命令插入到目标代码中 . 当该除数为0时执行该命令时,CPU会产生除零陷阱(类似于中断) . 这会调用内核中的divide_error
陷阱处理程序,如果是x86,它位于arch/x86/kernel/entry_32.S
中:然后
error_code
目标负责处理错误的所有必要操作,最后从陷阱返回 .在 ARM 上,情况有所不同:除了少数例外,ARM CPUs do not have a hardware division instruction(例如Arm Cortex A-9没有) . 部门需要作为图书馆职能来实施 . 对于内核,这是在
arch/arm/lib/lib1funcs.S
中实现的,您还可以通过零处理找到除法 . 对于用户空间应用程序,我认为这是作为libgcc库中的库函数实现的 .