为什么linux内核使用陷阱门来处理divide_error异常?

在内核2.6.11.5中,除零异常处理程序设置为:

set_trap_gate(0,&divide_error);

根据“了解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;
}

这是用gcc div0.c编译的.而./a.out的输出是:

Floating point exception (core dumped)

所以看起来这不是由0陷阱代码划分的.

最佳答案
仅当使用int指令调用软件中断时,才会查看IDT中的DPL位.除以零是由CPU触发的软件中断,因此在这种情况下DPL没有效果

转载注明原文:为什么linux内核使用陷阱门来处理divide_error异常? - 代码日志