進程的虛擬地址空間從進程的text
,data
和bss
段開始。在這個堆分配被放置之後,堆向着更大的內存地址增長。但是,在使用堆的一部分之前,必須分配內存塊(valloc
等),否則發生(或應該發生)。爲什麼不預先分配內存就可以使用堆棧?
堆棧從虛擬地址空間中的初始大地址向較小值增長。據我所知,這個工作沒有虛擬內存分配。在堆不可用的情況下如何在沒有事先分配內存的情況下使用堆棧? (它的線性虛擬地址空間是相同的)。
據我所知alloca
就是sub esp, <size>
。但是堆棧正在使用的虛擬地址空間區域必須在此之前以某種方式分配,對吧?
好的,這解釋了它。很好的回答! – ritter 2012-07-23 15:07:28
Linux不使用警衛頁面。錯誤處理程序只是通過算術檢查錯誤地址位於可以從當前堆棧指針到達的區域,即:地址+65536 + 32 * sizeof(無符號長整型)< regs-> sp',它允許輸入$ 65535,$ 31 '去工作。參見'arch/x86/mm/fault.c:do_page_fault()'。 – ninjalj 2012-07-23 17:40:36