如果我读/写/跳转到一个映射地址,即。
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致段错误。
我想知道,系统(内核)的实际部分是什么 拦截对未映射地址的读/写(如何?) 并抛出“用户模式”信号?
最佳答案
一切都来自架构陷阱表。这通常称为 entry.S(在 x86 上在 entry_32 和 entry_64.S 之间拆分)并且具有汇编程序链接,在进入内核的 C 代码之前执行许多操作(取决于配置)。
因此,无效的内存访问应该通过 page_fault 或 general_protection 进入,并且可能最终执行 force_sig_info,然后最终在 send_signal (kernel/signal.c) 中排队返回用户空间。
关于linux: "real"段错误处理程序在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1037240/