linux:哪里是“真正的”分段错误处理程序?

时间:2009-06-24 09:06:01

标签: linux linux-kernel segmentation-fault

如果我读/写/跳转到ummapped地址,即

.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

这会导致分段错误。

我想知道,系统的实际部分是什么(内核) 拦截读取/写入未映射的地址(如何?) 并抛出“用户模式”信号?

3 个答案:

答案 0 :(得分:4)

所有内容都来自架构陷阱表。这通常称为entry.S(在entry_32和entry_64.S之间的x86上拆分)并且具有汇编程序链接,在进入内核的C代码之前执行许多操作(取决于配置)。

因此,无效的内存访问应该通过page_fault或general_protection进入,并且最终可能会在最终排队回send_signal(kernel / signal.c)中的用户空间之前执行force_sig_info。

答案 1 :(得分:0)

它针对不同的架构实现。 例如,在x86上,您可以在以下位置检查源:

do_page_fault: linux/arch/x86/mm/fault.c  

答案 2 :(得分:0)

在不是“Book E”的PowerPC芯片中(例如,嵌入式系统的最新芯片),分段故障以异常0x300(对于数据)或0x400(对于指令)开始。用户/管理员模式标志被设置对于主管,MMU关闭,CPU跳转到地址0x300或0x400,控制操作系统。