【问题标题】: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,将控制权交给操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多