linux:“真正的”在哪里? 分段错误处理程序?

发布于 2024-07-25 12:28:19 字数 213 浏览 2 评论 0原文

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

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

这会导致分段错误。

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

If I read/write/jump to an ummapped address ie.

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

this causes a segmentation fault.

I wonder, what's the actual part of the system (kernel)
that intercepts reads/writes to unmapped addresses (how ?)
and throws the "user mode" signal ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

故事未完 2024-08-01 12:28:19

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

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

Everything flows from the architectures trap table. This is usually called entry.S (split on x86 between entry_32 and entry_64.S) and has assembler linkage that does a number of things (depending on config) before heading into the C code of the kernel proper.

So an invalid memory access should enter through either page_fault or general_protection and will probably end up doing force_sig_info before finally being queued back to user space in send_signal (kernel/signal.c).

小…楫夜泊 2024-08-01 12:28:19

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

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

It is implemented for different architecture.
For example, on x86, you can check the source at:

do_page_fault: linux/arch/x86/mm/fault.c  
记忆消瘦 2024-08-01 12:28:19

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

In PowerPC chips that are not "Book E" (e.g., recent chips for embedded systems), a segmentation fault starts with an exception 0x300 (for data) or 0x400 (for instructions.) The user/supervisor mode flag is set to supervisor, the MMU is turned off, and the CPU jumps to address 0x300 or 0x400, giving control to the operating system.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文