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
接下来是我个人在阅读文章过程中产生的疑惑和学习体会、心得,主要是针对以下这张图:
1. 是否如图片中所示,一定是从page_fault开始?
不是,比如对.txt段内存执行写操作,如果程序一上来就把txt段已经加载到了内存,此时执行写操作,会因为访问类型错误而收到SIGSEGV
也就是SIGSEGV绝大部分是由page_fualt开始的,但不是全部
2. SIGSEGV是由谁产生,发送给谁?
由操作系统内核产生,发送给用户进程
3. 图中的4-“地址位于一块内存区域”是指什么?
我认为是说在这个程序的vma范围中(各个vma的start~end之间)
4. 图中的5-“地址属于用户态栈”是指什么?
指地址是否属于进程的栈区,即下图所示的“Stack”
5. 图中的7是指什么?
实在想不到,如果大家知道还请指教
另外,我自己还写了一个ppt,其中涵盖了mmu以及vma的内容,会有助于理解SIGSEGV,如果需要可以站内私信给我