程序員自我修養(yǎng)6-庫與運(yùn)行庫

01 棧

一個(gè)棧的實(shí)例:

圖片.png

圖中棧底的地址是0xbfffffff,而exp寄存器標(biāo)明了棧頂,地址為0xbffffff4。在棧上壓入數(shù)據(jù)會(huì)導(dǎo)致esp減小,彈出數(shù)據(jù)使得esp增大。

一個(gè)活動(dòng)記錄圖:

圖片.png

圖中ebp固定在圖中所示的位置,不隨這個(gè)函數(shù)的執(zhí)行而變化,相反地,esp始終指向棧頂,因此隨著函數(shù)的執(zhí)行,esp會(huì)不斷變化。固定不變的ebp可以用來定位函數(shù)活動(dòng)記錄中的各個(gè)數(shù)據(jù)。在ebp之前首先是這個(gè)函數(shù)的返回地址,它的地址是ebp-4,再往前是壓入棧中的參數(shù)。

棧的標(biāo)準(zhǔn)開頭和結(jié)尾:
開頭:

push ebp
mov ebp,esp

結(jié)尾:

mov esp,ebp
pop ebp
ret

02堆

linux堆進(jìn)程管理的兩個(gè)系統(tǒng)調(diào)用:一個(gè)是brk()系統(tǒng)調(diào)用,另外一個(gè)是mmap()。
brk()的作用是設(shè)置進(jìn)程數(shù)據(jù)段的結(jié)束地址,mmap()向操作系統(tǒng)申請(qǐng)一段虛擬地址空間

03運(yùn)行庫

glibc入口函數(shù):_lib_start_main
msvc入口函數(shù):posvi分配內(nèi)存不使用malloc而使用alloca,是因?yàn)樵诔绦虻囊婚_始堆還沒有被初始化,而alloca是唯一可以不使用堆的動(dòng)態(tài)分配機(jī)制。alloca可以在棧上分配任意大小 的空間(只要棧的大小允許),并且在函數(shù)返回的時(shí)候會(huì)自動(dòng)釋放,就好像

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容