0

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

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

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

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

4

1 回答 1

3

当 Linux进程终止时(通常,通过调用_exit syscall,例如通过从 返回main,或通过类似的信号SIGSEGV),其地址空间将不复存在。

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

你应该阅读更多关于虚拟内存的内容,我邀请你阅读一些优秀的高级 unix 编程高级 linux 编程书籍。

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

于 2012-10-16T05:35:19.873 回答