3

如果我读/写/跳转到一个未映射的地址,即。

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

这会导致分段错误。

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

4

3 回答 3

4

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

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

于 2009-06-24T11:34:06.233 回答
0

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

do_page_fault: linux/arch/x86/mm/fault.c  
于 2009-06-24T09:27:20.080 回答
0

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

于 2009-09-28T03:00:32.987 回答