Linux:真正的分段错误处理程序在哪里?

3
如果我读取/写入/跳转到未映射的地址,例如:
.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

这会导致分段错误。

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


1
好的,关于如何,也许可以参考http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection中的硬件支持。至于在哪里,我猜你应该寻找中断处理程序? - wds
3个回答

4

所有的东西都源自于体系结构陷阱表。这通常被称为entry.S(在x86上分为entry_32和entry_64.S),具有汇编链接,可以在进入内核正文的C代码之前执行许多操作(取决于配置)。

因此,无效的内存访问应该通过page_fault或general_protection进入,并且最终可能会在send_signal(kernel/signal.c)中将force_sig_info强制发送回用户空间。


0
在非“Book E”(例如,最近的嵌入式系统芯片)的PowerPC芯片中,分段故障从异常0x300(数据)或0x400(指令)开始。用户/监管模式标志设置为监管者,MMU关闭,CPU跳转到地址0x300或0x400,将控制权交给操作系统。

0

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

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

1
页面错误和分段错误是完全不同的东西。 - SoapBox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接