2009-06-24 39 views
3

如果我读/写/跳转到ummapped地址,即。linux:“真正的”分段错误处理程序在哪里?

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

这会导致分段错误。

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

+1

那么有硬件支持的怎么样,也许http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection对于这里,我想你应该寻找中断处理程序? – wds 2009-06-24 09:26:03

回答

4

一切从架构陷阱表流动。这通常被称为entry.S(在entry_32和entry_64.S之间的x86上分割),并且具有汇编程序链接功能,在进入内核本身的C代码之前执行许多操作(取决于配置)。

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

0

它针对不同的体系结构实施。 例如,在x86,可以在检查源:

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

页面错误和分段错误是完全不同的东西。 – SoapBox 2010-04-09 11:08:10

0

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