关注
Segmentation Fault 是如何被检测到的? 首先说一下Segmentation Fault 是什么? A segmentation fault (often shortened to SIGSEGV) is a particular error condition that can occur during the operation of computer software. “当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。这个描述是准确的。为了加深理解,我们再更加详细的概括一下SIGSEGV。 SIGSEGV是在访问内存时发生的错误,它属于内存管理的范畴 SIGSEGV是一个用户态的概念,是操作系统在用户态程序错误访问内存时所做出的处理。 当用户态程序访问(访问表示读、写或执行)不允许访问的内存时,产生SIGSEGV。 当用户态程序以错误的方式访问允许访问的内存时,产生SIGSEGV。 SIGSEGV在很多时候是由于指针越界引起的,但并不是所有的指针越界都会引发SIGSEGV。一个越界的指针,如果不解引用它,是不会引起SIGSEGV的。而即使解引用了一个越界的指针,也不一定会引起SIGSEGV。这听上去让人发疯,而实际情况确实如此。SIGSEGV涉及到操作系统、C库、编译器、链接器各方面的内容, SIGSEGV是由谁产生,发送给谁? 由操作系统内核产生,发送给用户进程 操作系统检查Segmentation Fault流程 在 shell 中启动一个进程,进程访问一个虚拟地址,MMU 将这个虚拟地址转化成物理地址的过程中,发现转化不了,于是产生一个中断。中断的过程即由 IDTR 找到 IDT,执行中断处理函数,最后调到 do_page_fault 函数。do_page_fault 在当前进程的 vma 中找这个地址(task_struct 维护一颗 vm_area 的红黑树),如果访问的虚拟地址没有落到任何一个 vma 中,那么 do_page_fault 会给进程发送一个 SIGSEGV 信号。SIGSEGV 信号的默认 handler 是 Core,终止这个进程,产生一个 core dump。终止的时候,这个进程把它的 status 给父进程 shell(segfault 的 status 是 139),shell 收到了之后,知道子进程是因 segfault 退出,就在屏幕上打出来一行字 Segmentation fault (core dumped)。
查看原帖
点赞 评论
相关推荐
![](https://static.nowcoder.com/fe/file/oss/1715049343797JOCFB.png)
点赞 评论 收藏
分享
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
1331493次浏览 18701人参与
# 非技术岗薪资爆料 #
53705次浏览 730人参与
# 极具前瞻性,现代汽车编程题 #
9782次浏览 192人参与
# 和牛牛一起刷题打卡 #
45498次浏览 3590人参与
# 产品每日一题 #
1972次浏览 98人参与
# 来聊聊你目前的求职进展 #
230311次浏览 2915人参与
# 不去互联网可以去金融科技 #
47738次浏览 508人参与
# 晒一晒我的offer #
4036001次浏览 60421人参与
# 写简历别走弯路 #
360715次浏览 4542人参与
# 硬件兄弟们 甩出你的华为奖状 #
38098次浏览 224人参与
# 软件开发2024笔面经 #
1571947次浏览 36092人参与
# 如果可以选,你最想从事什么工作 #
220511次浏览 3405人参与
# 华子oc时间线 #
11458次浏览 60人参与
# 互联网公司评价 #
106207次浏览 1377人参与
# 参加过提前批的机械人,你们还参加秋招么 #
16858次浏览 383人参与
# 我想象的工作vs实际工作 #
117290次浏览 1811人参与
# 百度工作体验 #
32193次浏览 316人参与
# 机械制造笔面经 #
12582次浏览 343人参与
# 24届软开秋招面试经验大赏 #
1241256次浏览 18682人参与
# 如何写一份好简历 #
342647次浏览 4763人参与
# 滴!实习打卡 #
292998次浏览 4299人参与
# 我的成功项目解析 #
102118次浏览 2844人参与