五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一文帶你深度解析Linux ARM的函數(shù)棧(看完秒懂)

2022-03-30 20:00 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

引言

  • 這篇文章簡(jiǎn)要說(shuō)說(shuō)函數(shù)是怎么傳入?yún)?shù)的,我們都知道,當(dāng)一個(gè)函數(shù)調(diào)用使用少量參數(shù)(ARM上是少于等于4個(gè))時(shí),參數(shù)是通過(guò)寄存器進(jìn)行傳值(ARM上是通過(guò)r0,r1,r2,r3),而當(dāng)參數(shù)多于4個(gè)時(shí),會(huì)將多出的參數(shù)壓入棧中進(jìn)行傳遞(其實(shí)在函數(shù)調(diào)用過(guò)程中也會(huì)把r0,r1,r2,r3傳遞的參數(shù)壓入棧),具體是什么實(shí)現(xiàn)的呢,我們看看。 函數(shù)棧

  • 首先我們需要了解一下linux下一個(gè)進(jìn)程的內(nèi)存地址空間是如何布局的,在linux中,0~3G的虛擬地址為進(jìn)程所有,3G~4G由內(nèi)核所使用,每一個(gè)進(jìn)程都有自己獨(dú)立的0~3G內(nèi)存地址空間。當(dāng)進(jìn)程進(jìn)行函數(shù)調(diào)用時(shí),我們都知道傳入被調(diào)用函數(shù)的參數(shù)是通過(guò)棧進(jìn)行操作的,這里我們只需要簡(jiǎn)單了解一下linux的內(nèi)存地址空間中的棧是自頂向下生長(zhǎng)的,就是棧底出于高地址處,棧頂出于低地址處。

  • 好的,簡(jiǎn)單了解了內(nèi)存地址空間的棧后,我們還需要簡(jiǎn)單了解一下EBP和ESP這兩個(gè)寄存器,EBP是用保存棧低地址的,而ESP用于保存棧頂?shù)刂?,而每一次函?shù)調(diào)用會(huì)涉及到一個(gè)棧幀。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)?


  • 舉個(gè)實(shí)例詳細(xì)說(shuō)明一下一個(gè)函數(shù)幀的特點(diǎn),比如:

  • 在以上例子中棧幀情況如下圖所示:


  • 從圖例中可以看出,當(dāng)A函數(shù)沒(méi)有調(diào)用B函數(shù)時(shí),A函數(shù)的棧幀只保存著局部變量,而EBP(棧底指針)指向的是A函數(shù)的函數(shù)棧幀頭,而當(dāng)A函數(shù)調(diào)用B函數(shù)時(shí),A函數(shù)會(huì)將B函數(shù)所需要的參數(shù)從右往左壓入棧(在例子中先壓入3,之后是2,最后是1),之后會(huì)將A調(diào)用完B之后所需要運(yùn)行的第一條指令壓入棧,此時(shí)建立一個(gè)B的棧幀,具體流程:

  1. 從右往左將B函數(shù)所需參數(shù)壓入棧

  2. 壓入執(zhí)行完B函數(shù)之后的第一條指令地址

  3. 建立B棧幀

  4. 壓入A棧幀的棧底

  5. 壓入B函數(shù)保護(hù)的寄存器

  6. 壓入B函數(shù)的局部變量




一文帶你深度解析Linux ARM的函數(shù)棧(看完秒懂)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
福鼎市| 镇坪县| 大洼县| 林芝县| 临沭县| 仪征市| 监利县| 台山市| 沙坪坝区| 陇南市| 鄂伦春自治旗| 镇江市| 邓州市| 固始县| 正阳县| 津南区| 左权县| 临漳县| 海晏县| 凉山| 阿图什市| 丰都县| 平度市| 云霄县| 蒙城县| 芜湖县| 育儿| 六枝特区| 云和县| 崇义县| 庄河市| 芷江| 贞丰县| 奉新县| 娄烦县| 新龙县| 上高县| 衡阳市| 临邑县| 门头沟区| 南城县|