【问题标题】:linux: where's the "real" segmentation fault handler?linux:“真正的”分段错误处理程序在哪里?
【发布时间】:2009-06-24 09:06:00
【问题描述】:
如果我读/写/跳转到未映射的地址,即。
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统(内核)的实际部分是什么
拦截对未映射地址的读/写(如何?)
并抛出“用户模式”信号?
【问题讨论】:
标签:
linux
linux-kernel
segmentation-fault
【解决方案1】:
一切都来自架构陷阱表。这通常称为 entry.S(在 x86 上拆分为 entry_32 和 entry_64.S),并具有汇编程序链接,在进入内核的 C 代码之前会执行许多操作(取决于配置)。
因此,无效的内存访问应该通过 page_fault 或 general_protection 进入,并且最终可能会在最终在 send_signal (kernel/signal.c) 中排队返回用户空间之前执行 force_sig_info。
【解决方案2】:
它适用于不同的架构。
例如,在 x86 上,您可以在以下位置查看源代码:
do_page_fault: linux/arch/x86/mm/fault.c
【解决方案3】:
在不是“Book E”的 PowerPC 芯片(例如,用于嵌入式系统的最新芯片)中,分段错误以异常 0x300(用于数据)或 0x400(用于指令)开始。用户/主管模式标志已设置对supervisor来说,MMU关闭,CPU跳转到地址0x300或0x400,将控制权交给操作系统。