【问题标题】:Does SIGSEGV default handler do clean-up of stack/heap memory before process termination?SIGSEGV 默认处理程序是否在进程终止之前清理堆栈/堆内存?
【发布时间】:2012-10-16 05:28:14
【问题描述】:

我在一个简单的 C 程序中声明了两个变量(一个是全局变量,另一个是局部变量),除了两个具有不同大小数据的数组。在进行return 0; 调用之前,我使用strcpy() 例程导致缓冲区溢出。我在终端屏幕上看到了分段错误错误。

我知道在收到此SIGSEGV 信号后,系统会获取进程内存的核心转储并终止该进程,但系统是否会清理(清零)堆栈/堆内存和其他部分(如 BSS 段) , 文本段等?

我猜,在进程正常终止时,系统会清理(清零)内存,但我不太确定。

我正在使用Ubunutu 10.12gcc 运行程序。

【问题讨论】:

  • 我已经在互联网上浏览了几个星期,但我找不到任何可靠来源(如 linux 文档)的链接,这表明 linux 确实如此。能给个链接吗?

标签: linux signals segmentation-fault


【解决方案1】:

当 Linux process 终止时(通常,通过调用 _exit syscall,例如通过从 main 返回,或通过类似 SIGSEGV 的信号),它的 address space 将不复存在。

实际上,内核不会将前一个进程的内存归零,它只是将相关页面添加到一些空闲页面集合中,稍后将重用这些页面。重用页面时,它将清除它或用适当的内容填充它。所有这些都发生在内核内部,应用程序只能看到适当填充(或清除)的页面。

您应该阅读更多关于virtual memory 的信息,我邀请您阅读一些好的advanced unix programmingadvanced linux programming 书籍。

进程只能看到虚拟内存,它们的地址空间是通过execve(2) 系统调用设置的,并且可以更改,例如使用mmap(2) 系统调用。

【讨论】:

  • 很好的答案。 “所有这些都发生在内核内部”。我知道我应该查看 linux 源代码,可能是,看看它到底是如何以及做什么的,但是你能给内核代码一些有用的指针吗?谢谢
  • 首先阅读有关 Unix 编程的好书。只有当你很好地理解了系统调用和进程是什么(而今天你不理解这些)时,才考虑深入内核的内部。
  • 是的。在进入内核模式之前,我当然应该先阅读这些书。谢谢。
  • 另请阅读 intro(2)syscalls(2) 手册页,因为系统调用是应用程序与内核交互的唯一方式。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2013-03-03
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多