在C语言中,如果您试图将不属于您的内存写入内存,则可能发生的一件事是分段错误。(从技术上讲,当您尝试写入内存时,这种行为是未定义的--这不是您的,但是操作系统处理这种情况的方法之一是抛出一个分段错误)。对于尝试非法访问内存的用户空间代码,内核是检测非法内存访问并抛出分段错误的内核。
现在,我正在编写一个Linux内核模块。我的代码运行在内核空间。我有两个相关的问题:
我正在阅读本教程中的3.1.5节:http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
发布于 2013-10-22 20:50:50
发布于 2015-06-05 18:45:40
与高级语言不同的是,内存访问直接与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.
...对于检测非法访问的硬件,OS维护页表。与userspace一样,内核模式也有其内存映射。任何在映射之外的访问都会生成异常,该异常调用操作系统中的处理程序。
有关详细信息,您可以查看那些手册中的第2卷第4章:分页。
https://stackoverflow.com/questions/19527972
复制相似问题