如果我读/写/跳转到ummapped地址,即
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
这会导致分段错误。
我想知道,系统的实际部分是什么(内核) 拦截读取/写入未映射的地址(如何?) 并抛出“用户模式”信号?
答案 0 :(得分:4)
所有内容都来自架构陷阱表。这通常称为entry.S(在entry_32和entry_64.S之间的x86上拆分)并且具有汇编程序链接,在进入内核的C代码之前执行许多操作(取决于配置)。
因此,无效的内存访问应该通过page_fault或general_protection进入,并且最终可能会在最终排队回send_signal(kernel / signal.c)中的用户空间之前执行force_sig_info。
答案 1 :(得分:0)
它针对不同的架构实现。 例如,在x86上,您可以在以下位置检查源:
do_page_fault: linux/arch/x86/mm/fault.c
答案 2 :(得分:0)
在不是“Book E”的PowerPC芯片中(例如,嵌入式系统的最新芯片),分段故障以异常0x300(对于数据)或0x400(对于指令)开始。用户/管理员模式标志被设置对于主管,MMU关闭,CPU跳转到地址0x300或0x400,控制操作系统。