如果我读/写/跳转到一个未映射的地址,即。
.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
在不是“Book E”的 PowerPC 芯片(例如,用于嵌入式系统的最新芯片)中,分段错误以异常 0x300(对于数据)或 0x400(对于指令)开始。用户/主管模式标志设置为主管, MMU 关闭,CPU 跳转到地址 0x300 或 0x400,将控制权交给操作系统。