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)。
点赞 评论

相关推荐

点赞 评论 收藏
分享
牛客网
牛客企业服务