linux:“真正的”在哪里? 分段错误处理程序?
如果我读/写/跳转到一个未映射的地址,即。
.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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
一切都来自架构陷阱表。 这通常称为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).
它是针对不同的架构实现的。
例如,在 x86 上,您可以在以下位置查看源代码:
It is implemented for different architecture.
For example, on x86, you can check the source at:
在非“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.