Cri*_*ter 0 c linux segmentation-fault linux-kernel
在 C 中,如果您尝试写入不属于您的内存,则可能发生的一种情况是段错误。(从技术上讲,当您尝试写入不属于您的内存时,行为是未定义的,但操作系统可以处理这种情况的方法之一是抛出段错误)。对于尝试非法内存访问的用户空间代码,内核是检测非法内存访问并抛出段错误的代码。
现在,我正在编写一个 Linux 内核模块。我的代码在内核空间中运行。我有两个相关的问题:
如果我超出数组范围,我的代码就会出现段错误。我想知道什么是检测这个段错误?对于用户空间应用程序,内核会检测段错误。内核代码本身呢?什么负责检测内核代码中的越界内存访问?
我编写的内核模块和 insmod 是否作为单独的进程运行?如果是,当我的模块出现段错误时,为什么整个内核都会出现段错误?为什么不只是我的模块段错误,而内核的其余部分继续运行?
我正在阅读本教程中的第 3.1.5 节:http : //www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
与高级语言不同,内存访问直接与 C 中的硬件对话。加载变成了这条指令:mov %reg, [address]. 一个商店变成了这个:mov [addr], value。由于操作系统不直接参与该指令的执行,因此处理器会捕获非法访问。以下是 x86 如何响应写入只读映射(来自英特尔软件开发人员手册):
MOV—Move
...
Protected Mode Exceptions
...
#GP(0) If the destination operand is in a non-writable segment.
...
Run Code Online (Sandbox Code Playgroud)
对于硬件检测非法访问,操作系统维护页表。与用户空间一样,内核模式也有其内存映射。任何超出映射范围的访问都会生成异常,该异常会调用操作系统内的处理程序。
有关详细信息,您可以查看这些手册中的第 2 章第 4 章:分页。