c - 段错误如何在内部(内核/硬件)工作?

标签 c memory-management linux-kernel hardware

从广义上讲,我想知道内核(或 CPU)如何知道一个进程试图访问它没有权限的内存位置,以及称为 MMU 的神秘硬件如何帮助实现这一点。

特别是:在我看来,MMU 与操作系统内核的内存管理模型(分页、内存区域、进程地址空间...)无关(我认为 Linux 和 Windows 页面不完全是例如,相同。如果我错了,请纠正我)。但是,我的 CPU 如何确定当前代码是否可以访问位置 x?它如何向内核发出信号?

最佳答案

这个话题可能太大了,无法在这里完全令人满意地回答;您最好搜索一些讨论虚拟内存实现背后的硬件的论文/文章/书籍(可能从特定的体系结构开始,因为 x86、x86_64、sparc 等之间存在显着差异...)。

不过,简短的回答是硬件通过页表来处理这个问题。要求 MMU 处理的每个内存访问都通过页表结构进行验证。如果描述包含所请求地址的页面的页表条目未标记为允许所请求的访问类型(读/写/执行/...),则硬件会生成一个陷阱,Linux 最终将其称为“段错误” .其他操作系统以不同的方式命名它们(例如,一般保护故障,...)。然后 OS 内核必须找出故障的原因以及是否可以对此做任何事情(许多陷阱由内核处理以从磁盘换入新页面,映射新的空页面等,但有些,如空指针取消引用,内核能做的最好的事情就是把它扔给应用程序说“你做了坏事”)。

关于c - 段错误如何在内部(内核/硬件)工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13936534/

相关文章:

iphone - 我是否需要发布复制的 NSObjects - Objective-c

在 module_init 函数中调用schedule,它永远不会返回

linux - 当系统内存大于 8GB 时,为什么 linux 禁用磁盘写缓冲区?

c++ - delete 如何区分内置数据类型和用户定义的数据类型?

linux - 谷歌搜索 Linux 日志消息的替代方案?

C套接字,不完整的文件传输

CMake 找不到库

c++ - 在不同计算机上同步播放和录制

c++ - #define var 在另一个#define in C

c# - 委托(delegate)分配是否在 C# 中创建新副本?