我在一个简单的C程序中声明了两个变量(一个全局和另一个本地),除了两个具有不同大小数据的数组。在进行strcpy()
调用之前,我使用return 0;
例程导致缓冲区溢出。我在终端屏幕上看到分段错误错误。
我知道在收到此SIGSEGV
信号后,系统会获取进程内存的核心转储并终止该进程,但是系统会清理(清零)堆栈/堆内存和其他部分,例如BSS细分,文本细分等?
我想,在正常终止进程时,系统会清理(清零)内存,但我不太确定。
我正在使用Ubunutu 10.12
和gcc
来运行该程序。
答案 0 :(得分:3)
当Linux process终止时(正常情况下,通过调用_exit
syscall,例如从main
返回,或通过SIGSEGV
之类的信号),address space不再存在。
实际上,内核不会将前一个进程的内存归零,它只是将相关页面添加到某些空闲页面集合中,稍后将重用这些页面。重复使用页面时,它会清除它或用适当的内容填充它。所有这些都发生在内核中,应用程序只看到适当填充(或清除)的页面。
您应该阅读有关virtual memory的更多信息,并邀请您阅读一些好的advanced unix programming和advanced linux programming本书。
进程只能查看虚拟内存,它们的地址空间是通过execve(2)系统调用设置的,并且可以更改,例如与mmap(2)系统调用。