为什么会有segmentation fault?操作系统是如何探测以及利用这个机制来保护系统的?

segmentation fault应该算是日常引起程序core dump的罪魁祸首了

每次排查完,发现是内存越界访问(读/写/执行),修改之后没core了,就到此为止了么?

有没有想过,操作系统好厉害!它是如何及时地探测出这个异常,并且终止程序抛出信号的呢?

这个问题困扰了我一段时间,最近有时间,查了很多资料,大体算是弄清楚了

有一篇非常棒的文章(传送门:http://www.cnblogs.com/no7dw/archive/2013/02/20/2918372.html),里面已经细致地讲了关于segmentation的大部分知识,包括:

1. 什么是segmentation fault

2. segmentation fault是如何产生的

3. 常见的segmentation fault代码示例

4. 如何避免segmentation fault

接下来是我个人在阅读文章过程中产生的疑惑和学习体会、心得,主要是针对以下这张图:

为什么会有segmentation fault?操作系统是如何探测以及利用这个机制来保护系统的?_第1张图片

1. 是否如图片中所示,一定是从page_fault开始?

不是,比如对.txt段内存执行写操作,如果程序一上来就把txt段已经加载到了内存,此时执行写操作,会因为访问类型错误而收到SIGSEGV

也就是SIGSEGV绝大部分是由page_fualt开始的,但不是全部

2. SIGSEGV是由谁产生,发送给谁?

由操作系统内核产生,发送给用户进程

3. 图中的4-“地址位于一块内存区域”是指什么?

我认为是说在这个程序的vma范围中(各个vma的start~end之间)

为什么会有segmentation fault?操作系统是如何探测以及利用这个机制来保护系统的?_第2张图片

4. 图中的5-“地址属于用户态栈”是指什么?

指地址是否属于进程的栈区,即下图所示的“Stack”

为什么会有segmentation fault?操作系统是如何探测以及利用这个机制来保护系统的?_第3张图片

5. 图中的7是指什么?

实在想不到,如果大家知道还请指教

另外,我自己还写了一个ppt,其中涵盖了mmu以及vma的内容,会有助于理解SIGSEGV,如果需要可以站内私信给我

你可能感兴趣的:(C开发,segmentation,fault,linux,core)