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,而在這個過程中,有聲子參與。這個過程屬於二級微擾過程,機率比一級微擾小得多。不躍遷可發不了光,這個是主要原因,躍遷後還有俄歇...