我在一个简单的 C 程序中声明了两个变量(一个全局变量和其他局部变量),除了两个具有不同大小数据的数组。在进行return 0;
调用之前strcpy()
我使用例程导致缓冲区溢出。我在终端屏幕上看到分段错误错误。
我知道在收到此SIGSEGV
信号后,系统会获取进程内存的核心转储并终止该进程,但是系统是否对堆栈/堆内存和其他部分(如 BSS 段、文本段等)进行清理(清零)?
我想,在进程的正常终止中,系统会清理(清零)内存,但我不太确定。
我正在使用Ubunutu 10.12
和gcc
来运行该程序。
当一个 Linux 进程终止时(通常,通过调用_exit
系统调用,例如通过从main
返回,或通过像 SIGSEGV
这样的信号),它的地址空间不复存在。
实际上,内核不会将前一个进程的内存清零,它只是将相关页面添加到一组空闲页面中,并在以后重用这些页面。当重复使用页面时,它将清除它或用适当的内容填充它。所有这些都发生在内核内部,应用程序只能看到适当填充(或清除)的页面。
你应该阅读更多关于虚拟内存的信息,我邀请你阅读一些优秀的高级Unix编程和高级Linux编程书籍。
进程只看到虚拟内存, 它们的地址空间是通过 execve(2) 系统调用建立的, 并且可以更改, 例如使用 mmap(2) 系统调用。