Ash*_*dav 1 kernel divide-by-zero linux-device-driver linux-kernel
我正在研究零分割的内核源代码(2.6.35).
我在用户空间程序中插入了零分割并且所有线程都停止了.
所以我想知道Arm Cortex A-9内核的"零分割"在哪里?
我无法找到任何陷阱....
谢谢
这取决于架构.给定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库中的库函数实现的.
归档时间: |
|
查看次数: |
1984 次 |
最近记录: |