如果我读/写/跳转到ummapped地址,即。linux:“真正的”分段错误处理程序在哪里?
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统(内核) 的实际部分是什么拦截读取/写入未映射的地址(如何?) 并抛出“用户模式”信号?
如果我读/写/跳转到ummapped地址,即。linux:“真正的”分段错误处理程序在哪里?
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统(内核) 的实际部分是什么拦截读取/写入未映射的地址(如何?) 并抛出“用户模式”信号?
一切从架构陷阱表流动。这通常被称为entry.S(在entry_32和entry_64.S之间的x86上分割),并且具有汇编程序链接功能,在进入内核本身的C代码之前执行许多操作(取决于配置)。
因此无效的内存访问应该通过page_fault或general_protection进入,并且最终可能在最终排队回send_signal(kernel/signal.c)中的用户空间之前最终执行force_sig_info。
它针对不同的体系结构实施。 例如,在x86,可以在检查源:
do_page_fault: linux/arch/x86/mm/fault.c
页面错误和分段错误是完全不同的东西。 – SoapBox 2010-04-09 11:08:10
在不是“Book E”的PowerPC芯片(例如最近用于嵌入式系统的芯片)中,分段错误以异常0x300(用于数据)或0x400(用于指令)开始。用户/管理员模式标志为设置为管理员,MMU关闭,CPU跳转到地址0x300或0x400,从而控制操作系统。
那么有硬件支持的怎么样,也许http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection对于这里,我想你应该寻找中断处理程序? – wds 2009-06-24 09:26:03