2012-10-16 55 views
0

我已經在一個簡單的C程序中聲明瞭兩個變量(一個全局變量和其他局部變量),除了兩個具有不同大小數據的數組之外。在撥打return 0;之前,我使用strcpy()例程導致緩衝區溢出。我在終端屏幕上看到分段故障錯誤。我知道在收到這個SIGSEGV信號之後,系統會收集進程內存的核心轉儲並終止該進程,但是系統會清理堆棧/堆內存和其他部分(如BSS段)的清理(清零)文本段等?我猜,在一個進程正常結束的時候,系統會清理內存(零),但我不太確定。SIGSEGV默認處理程序在進程終止之前是否清理堆棧/堆內存?

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

+0

我一直在尋找互聯網幾個星期,但我找不到任何可靠的來源(如Linux文件)的任何鏈接,其中說,Linux是這樣做的。你能提供一些鏈接嗎? – Junaid

回答

4

當存在一個Linux process終止(或者通常,通過調用_exitsyscall,例如通過從main返回,或直通像SIGSEGV的信號),其address space停止。

實際上,內核不會將前一個進程的內存歸零,它只是將相關頁面添加到某些空閒頁面集合中,稍後將重新使用這些頁面。當重新使用一個頁面時,它將清除它或用適當的內容填充它。所有這些都發生在內核中,應用程序只能看到適當填充(或清除)的頁面。

您應該閱讀更多關於virtual memory,我邀請您閱讀一些好的advanced unix programmingadvanced linux programming書籍。

進程只能看到虛擬內存,它們的地址空間是通過系統調用execve(2)設置的,並且可能會被更改,例如,與mmap(2)系統調用。

+0

很好的答案。 「所有這些都發生在內核中」。我知道我應該研究一下linux源代碼,看看它是如何以及它究竟發生了什麼,但是你能否給一些有用的指針指向內核代碼?謝謝 – Junaid

+0

閱讀有關Unix編程的第一本好書。只有當你很好地理解系統調用和進程是什麼(並且今天你不理解這些),可以考慮在內核的內部進行跳板。 –

+0

是的。在進入內核模式之前,我應該先閱讀這些書籍。謝謝。 – Junaid

相關問題