在内核2.6.11.5中,除零异常处理程序设置为:
set_trap_gate(0,÷_error);
Run Code Online (Sandbox Code Playgroud)
根据"了解Linux内核",用户模式进程无法访问英特尔陷阱门.但是用户模式进程很可能也会生成一个divide_error.那么为什么Linux以这种方式实现呢?
[编辑]我认为问题仍然是开放的,因为set_trap_gate()将IDT条目的DPL值设置为0,这意味着只有CPL = 0(读取内核)代码才能执行它,因此我不清楚如何从该处理程序调用此处理程序用户模式:
#include<stdio.h>
int main(void)
{
int a = 0;
int b = 1;
b = b/a;
return b;
}
Run Code Online (Sandbox Code Playgroud)
这是编译的gcc div0.c.输出./a.out是:
浮点异常(核心转储)
因此看起来这不是由0陷阱代码划分处理的.
我有一个故意执行除以零的程序(并将结果存储在一个易变的变量中),以便在某些情况下停止.但是,我希望能够禁用此暂停,而无需更改执行除零的宏.
有什么方法可以忽略它吗?
我试过用了
#include <signal.h>
...
int main(void) {
signal(SIGFPE, SIG_IGN);
...
}
Run Code Online (Sandbox Code Playgroud)
但它仍然会消息"浮点异常(核心转储)".
我实际上并没有使用该值,因此我并不关心分配给变量的内容; 0,随机,未定义......
编辑:我知道这不是最便携的,但它适用于在许多不同操作系统上运行的嵌入式设备.默认的暂停动作是除以零; 其他平台需要不同的技巧来强制看门狗引发重启(例如禁用中断的无限循环).对于PC(linux)测试环境,我想在不依赖断言之类的情况下禁用除零时停止.