为什么会有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

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

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,如果需要可以站内私信给我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值