首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核如何检测内核空间分段错误?

内核如何检测内核空间分段错误?
EN

Stack Overflow用户
提问于 2013-10-22 20:44:21
回答 2查看 3.6K关注 1票数 1

在C语言中,如果您试图将不属于您的内存写入内存,则可能发生的一件事是分段错误。(从技术上讲,当您尝试写入内存时,这种行为是未定义的--这不是您的,但是操作系统处理这种情况的方法之一是抛出一个分段错误)。对于尝试非法访问内存的用户空间代码,内核是检测非法内存访问并抛出分段错误的内核。

现在,我正在编写一个Linux内核模块。我的代码运行在内核空间。我有两个相关的问题:

  1. 如果我超出了数组的范围,我的代码就会出现分段错误。我想知道是什么发现了这段故障?对于用户空间应用程序,内核检测分段故障。那么内核代码本身呢?什么负责检测内核代码中的越界内存访问?
  2. 我编写的内核模块是否作为一个单独的进程运行?如果是,为什么当我的模块分段错误时,整个内核分段错误?为什么不只是我的模块段错误,而其余的内核继续运行?

我正在阅读本教程中的3.1.5节:http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-22 20:50:50

  1. 由于非法的内存访问,会发生分段错误。内核跟踪已分配了哪些内存,如果您尝试在该分配之外进行访问,它会像用户空间进程一样分割错误。
  2. Linux内核中没有“进程”的概念,就像用户空间中的“进程”一样(关于这个问题的讨论,请参阅这个答案 )。内核可以生成线程来处理某些任务,但这不是一回事。实际上,您可以将内核看作一个大的“进程”,它是站在一起的或落在一起的。
票数 3
EN

Stack Overflow用户

发布于 2015-06-05 18:45:40

与高级语言不同的是,内存访问直接与C中的硬件进行对话。加载变成了这样的指令:mov %reg, [address]。一家商店变成这样:mov [addr], value。由于操作系统不直接参与此指令的执行,因此处理器会捕获非法访问。下面是x86如何响应对只读映射的写入(来自英特尔软件开发人员手册):

代码语言:javascript
复制
MOV—Move
...
Protected Mode Exceptions
...
#GP(0) If the destination operand is in a non-writable segment.
...

对于检测非法访问的硬件,OS维护页表。与userspace一样,内核模式也有其内存映射。任何在映射之外的访问都会生成异常,该异常调用操作系统中的处理程序。

有关详细信息,您可以查看那些手册中的第2卷第4章:分页

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19527972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档