我們都知道x86系統程序中堆疊都向下增長的,那為什麼是向下增長呢?
「這個問題與虛擬位址空間的分配規則有關,每乙個可執行c程式,從低位址到高位址依次是:text,data,bss,堆,棧,環境引數變數;其中堆和棧之間有很大的位址空間空閒著,在需要分配空間的時候,堆向**,棧往下漲。」
這樣設計可以使得堆和棧能夠充分利用空閒的位址空間。如果棧向**的話,我們就必須得指定棧和堆的乙個嚴格分界線,但這個分界線怎麼確定呢?平均分?但是有的程式使用的堆空間比較多,而有的程式使用的棧空間比較多。所以就可能出現這種情況:乙個程式因為棧溢位而崩潰的時候,其實它還有大量閒置的堆空間呢,但是我們卻無法使用這些閒置的堆空間。所以呢,最好的辦法就是讓堆和棧乙個向**,乙個向下漲,這樣它們就可以最大程度地共用這塊剩餘的位址空間,達到利用率的最大化!!
呵呵,其實當你明白這個原理的時候,你也會不由地驚嘆當時設計計算機的那些科學家驚人的聰明和智慧型!!
51的棧是向高位址增長,intel的8031、8032、8048、8051系列使用向高位址增長的堆疊;但同樣是intel,在x86系列中全部使用向低位址增長的堆疊。其他公司的cpu中除arm的結構提供向高位址增長的堆疊選項外,多數都是使用向低位址增長的堆疊。
在沒有mmu的時代,為了最大的利用記憶體空間,堆和棧被設計為從兩端相向生長。那麼哪乙個向上,哪乙個向下呢?
人們對資料訪問是習慣於向上的,比如你在堆中new乙個陣列,是習慣於把低元素放到低位址,把高位放到高位址,所以堆向上生長比較符合習慣。而棧則對方向不敏感,一般對棧的操作只有push和pop,無所謂向上向下,所以就把堆放在了低端,把棧放在了高階。mmu出來後就無所謂了,只不過也沒必要改了
程序中堆疊向下增長的原因
我們都知道x86系統程序中堆疊都向下增長的,那為什麼是向下增長呢?這個問題與虛擬位址空間的分配規則有關,每乙個可執行c程式,從低位址到高位址依次是 text,data,bss,堆,棧,環境引數變數 其中堆和棧之間有很大的位址空間空閒著,在需要分配空間的時候,堆向 棧往下漲。這樣設計可以使得堆和棧能夠...
arm堆疊的增長方式
堆疊是一種資料結構,按先進後出 first in last out,filo 的方式工作,使用乙個稱作堆疊指標的專用暫存器指示當前的操作位置,堆疊指標總是指向棧頂。當堆疊指標指向最後壓入堆疊的資料時,稱為滿堆疊 full stack 而當堆疊指標指向下乙個將要放入資料的空位置時,稱為空堆疊 empt...
程序的堆疊空間
每乙個程序都有自己的乙個程序堆疊空間。在linux介面執行乙個執行碼時,shell程序會fork乙個子程序,再呼叫exec系統呼叫在子程序中執行該執行碼。exec系統呼叫執行新程式時會把命令列引數和環境變數表傳遞給main函式,它們在整個程序堆疊空間中的位置如下圖12 7所示。圖12 7 程序堆疊空...