如果我读取/写入/跳转到未映射的地址,例如:
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统(内核)中实际拦截未映射地址的读/写操作的部分是什么(如何拦截?),并抛出“用户模式”信号?
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统(内核)中实际拦截未映射地址的读/写操作的部分是什么(如何拦截?),并抛出“用户模式”信号?
所有的东西都源自于体系结构陷阱表。这通常被称为entry.S(在x86上分为entry_32和entry_64.S),具有汇编链接,可以在进入内核正文的C代码之前执行许多操作(取决于配置)。
因此,无效的内存访问应该通过page_fault或general_protection进入,并且最终可能会在send_signal(kernel/signal.c)中将force_sig_info强制发送回用户空间。
它被实现为不同的架构。例如,在x86上,您可以在以下位置检查源代码:
do_page_fault: linux/arch/x86/mm/fault.c