程序的堆疊區和 esp的堆疊是否是乙個概念?

時間 2021-05-05 18:19:46

1樓:「已登出」

程序的堆疊區和%esp的堆疊是否是乙個概念?

程序的堆疊區是否是通過改變%esp暫存器的指標實現拓展,或者說兩者的堆疊是否是乙個抽象概念上的堆疊

這個問題很明確地限定了%esp,堆疊,程序(而且標籤是Linux,就算不是Linux,一般Linux,BSD,Windows概念的程序在這個問題上的定義是共通的)這樣的上下文。這個上下文是相對嚴格地定義這個問題的。

同時,對於堆疊這個概念。英文的Stack被翻譯為棧,或者堆疊;英文的Heap被翻譯為堆,或者遠堆。傳統的教科書一直是這樣寫的。

所以題主問堆疊,顯然問的是Stack。更不要說他明確說了「%esp的堆疊概念」,難道你還用%esp來訪問堆?

現在回到題主的問題。我覺得答案是:程序的堆疊區和%esp上下文中描述的堆疊,是相似但指向不同的概念。

程序的堆疊,或者堆疊區,是軟體概念。是指程序執行的過程中,如果發生了函式呼叫,函式的上下文被以先進後出的方式儲存內容的記憶體區。

%esp談到的堆疊,是硬體概念。是x86系列的處理器,為更容易實現先進後出的資料結構而引入的概念。基於這個概念,你可以通過push/pop/call等指令,在不指定暫存器的情況下,就把特定的資料以先進後出的方法寫入%esp指定的記憶體區域。

兩者在很多上下文中是重合的,當軟體使用這個硬體機制實現相關功能的時候,軟體提到把某某資料寫入堆疊,這個寫入的堆疊就是指%esp指向的記憶體塊。但兩者又是分離的,比如軟體提到「為程序預分配乙個堆疊區」,這時,這僅僅是對於程序的乙個管理概念,和%esp就沒有關係了。

2樓:北極

糾正幾個說法:

1. 堆疊是分開的概念,堆是堆,棧是棧。

2. 棧是針對執行緒的,不是針對程序的。

3. 並沒有堆疊區一說,甚至同乙個程序的不同執行緒的棧也未必集中在同一塊區域。

不過題主問到的棧是不是乙個抽象的概念,這個回答是肯定的,是的,棧就是乙個抽象的概念,CPU不關注棧在什麼地方,CPU不關注棧是否連續。棧空間固定大小,純粹是作業系統的原因:方便管理,節約記憶體。

各種加殼軟體一般也是在棧指標上做文章,使得偵錯程式無法很容易的定位到函式的入口。

從軟體的角度來看:編譯器和偵錯程式規定的棧幀(stack frame)只是為了除錯方便定義的,如果技術能力足夠,用不用sp指標都無所謂。

實際情況中,棧還是有必要的,因為作業系統中,中斷、系統呼叫這些都需要棧來支撐,這是硬體規定的,否則作業系統不容易恢復現場。

自己申請一大塊記憶體,然後把棧幀指過去(包括sp和bp),這樣也是能工作的,但因為自己申請的記憶體未必有作業系統提供的保護,棧越界、溢位時未必容易定位。

最後再強調,堆疊是分開的兩個概念,當然,兩個都是抽象概念。

3樓:徐聖

linux 下

cat /proc/程序ID/maps

//此處省略N行

7ffe863a9000-7ffe863ca000 rw-p 00000000 00:00 0stack]

7ffe863cd000-7ffe863cf000 r-xp 00000000 00:00 0vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0vsyscall]

這就是程序的棧.

翻了半天intel的文件,找到這句

二者關係在程序載入過程建立關係

在linux作業系統中建立程序時會設定程序的tss(task state segment)資訊,其中有句

p->tss.

esp0

=PAGE_SIZE+(

long)p

;// 堆疊指標(給任務結構p 分配了1 頁

// 新記憶體,此時esp0 正好指向該頁頂端)。

在程序投入執行時,系統會載入程序的tss。然後tss中的棧指標會到esp暫存器中

拋磚引玉,有興趣的話自己去研讀核心原始碼吧。

4樓:panda

光改esp還不夠,要先申請棧空間,程序棧用的是記憶體,不申請空間就改esp可能會導致page fault異常。

另外,還需注意棧區需要的是連續位址,不是隨便再申請頁框就可以的。

5樓:土地測量員

棧是用來實現函式呼叫的,它會鏈式地將呼叫關係儲存下來。esp暫存器就是和這個過程相關的,esp存哪個位址,就把這個位址當成棧頂。大概工作流程如下:

call新的函式,把下一條指令push進棧,跳轉到相應的指令接著執行,儲存上乙個棧幀的資訊,並修改esp給新的棧幀分配空間。

當程序剛開始執行的時候,需要有個當成執行棧的區域,讓初試的執行流(可以理解成mian函式)能夠正常執行。所以程序就專門劃分出了棧段,esp初始值是棧段的起始位置。但是esp並不是非得指向棧段的某個位置,esp可被修改,完全可以malloc一塊空間當成呼叫棧,然後esp指過去。

當然光改執行棧沒什麼用,一般都是將整個上下文(暫存器,呼叫棧,ip等)都儲存然後切換,來實現執行緒或者協程的執行流切換。

6樓:醉臥沙場

SP是棧指標,你是在問棧不是問堆吧……在函式呼叫(和返回)時是需要用到SP和BP暫存器來管理函式棧空間的。

醉臥沙場:簡單函式的呼叫原理

醉臥沙場:簡單函式的返回原理

7樓:CMOS

嚴格說堆疊這個詞本身就是錯誤的,程式的資料區域包括堆(heap)和棧(stack)兩種,這是兩種不同的結構。雖然國內的的各種資料上堆疊這個這個詞一般是指棧,建議還是少用這個詞。

如果是指棧的話,x86程式執行時的棧確實是用esp來指向的(還用到了ebp),這個可以認為是程式中概念在硬體上的實際實現。

萬智牌的堆疊和遊戲王的連鎖有什麼區別?

530rmjd 首先這兩個遊戲的連鎖沒什麼更合理一說,真要說起來ygo目前的連鎖處理情況是有巨量歷史遺留下的產物 當然原因主要是效果文字的鍋,規則已經比較清楚了,8期之後的卡在發動時機上非常清晰不會讓人產生疑問 上面的回答應該是寫得非常好了 除了ygo的咒文速度,部分無種類效果看起來像 發動 一樣實...

如果把人腦按照它原子排列的順序堆疊好 資料化放進一台計算機 那麼這台機器具備了人腦的思考能力嗎?

致熵 這個問題到目前沒有答案。首先,人腦的功能到底是怎麼產生的,現在還不知道!特別是一些高階功能,比如說意識。過去有的科學家甚至認為,意識的產生可能依賴大腦中的量子微管結構。如果果真人腦的高階功能需要依賴人腦的結構,而不是純資訊,那麼電腦無論怎麼模擬,都無法完全實現。哪怕你把每乙個分子位置都儲存在電...

pn結中電子從n區到p區是否會與p區中的空穴復合,如何復合為什麼沒有發光呢

秋刀魚的滋味 媽蛋,剛考完半導體光電子就看見這個了,不爽。現學現賣 你題設雖然沒說,但是指的應該是矽基的積體電路,而電子在Si,Ge中的躍遷,主要是非豎直躍遷,對應不同波矢K,而在這個過程中,有聲子參與。這個過程屬於二級微擾過程,機率比一級微擾小得多。不躍遷可發不了光,這個是主要原因,躍遷後還有俄歇...