當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導(dǎo)讀]為什么會寫篇棧變化的文章?做系統(tǒng)分析的話你肯定遇到過一些crash,oops等棘手問題,一般大家都會用gdb,objdump或者addr2line等工具分析pc位置來定位出錯的地方。但是這些分析工具背后的本質(zhì)原理就不見得理解深刻了,而且有的時候面對一系列backtrace或者st...

為什么會寫篇棧變化的文章?做系統(tǒng)分析的話你肯定遇到過一些crash, oops等棘手問題,一般大家都會用 gdb, objdump 或者 addr2line等工具分析 pc 位置來定位出錯的地方。但是這些分析工具背后的本質(zhì)原理就不見得理解深刻了,而且有的時候面對一系列 backtrace 或者 stack 日志處于懵逼的狀態(tài)。


今天和大家一起看下面對 crash 日志的時候,如何利用 stack 來分析其變化的來龍去脈。


Arm指令集介紹

崇尚簡單粗暴的介紹方式,我們直接來看各個寄存器的大體用法,詳細(xì)用法可百度,不,谷歌。
1. ?? r0-r3 用作傳入函數(shù)參數(shù),傳出函數(shù)返回值。在子程序調(diào)用之間,可以將 r0-r3 用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復(fù) r0-r3。---如果調(diào)用函數(shù)需要再次使用 r0-r3 的內(nèi)容,則它必須保留這些內(nèi)容。2. ?? r4-r11 被用來存放函數(shù)的局部變量。如果被調(diào)用函數(shù)使用了這些寄存器,它在返回之前必須恢復(fù)這些寄存器的值。r11 是棧幀指針?fp。3.????r12 是內(nèi)部調(diào)用暫時寄存器?ip。它在過程鏈接膠合代碼(例如,交互操作膠合代碼)中用于此角色。在過程調(diào)用之間,可以將它用于任何用途。被調(diào)用函數(shù)在返回之前不必恢復(fù) r12。4.????寄存器 r13 是棧指針?sp。它不能用于任何其它用途。sp 中存放的值在退出被調(diào)用函數(shù)時必須與進(jìn)入時的值相同。5.????寄存器 r14 是鏈接寄存器?lr如果您保存了返回地址,則可以在調(diào)用之間將 r14 用于其它用途,程序返回時要恢復(fù)6.????寄存器 r15 是程序計數(shù)器?pc。它不能用于任何其它用途。

演示代碼

假如現(xiàn)在你已經(jīng)掌握了 arm 指令的用法,即便沒有掌握也沒關(guān)系,“書到用時回頭翻”。這里以一段簡單的 c 語言為例:
#include
int m = 8;int fun(int a,int b){ int c = 0; c = a b; return c;}int main(){ int i = 4; int j = 5; m = fun(i, j); return 0;}編譯一下,然后反匯編:

$ arm-linux-gnueabi-gcc main.c -o main?$ arm-linux-gnueabi-objdump -D -D main
00010400 : 10400: e52db004 push {fp} ; (str fp, [sp, #-4]!) 10404: e28db000 add fp, sp, #0 10408: e24dd014 sub sp, sp, #20 1040c: e50b0010 str r0, [fp, #-16] 10410: e50b1014 str r1, [fp, #-20] ; 0xffffffec 10414: e3a03000 mov r3, #0 10418: e50b3008 str r3, [fp, #-8] 1041c: e51b2010 ldr r2, [fp, #-16] 10420: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec 10424: e0823003 add r3, r2, r3 10428: e50b3008 str r3, [fp, #-8] 1042c: e51b3008 ldr r3, [fp, #-8] 10430: e1a00003 mov r0, r3 10434: e24bd000 sub sp, fp, #0 10438: e49db004 pop {fp} ; (ldr fp, [sp], #4) 1043c: e12fff1e bx lr
00010440
: 10440: e92d4800 push {fp, lr} 10444: e28db004 add fp, sp, #4 10448: e24dd008 sub sp, sp, #8 1044c: e3a03004 mov r3, #4 10450: e50b300c str r3, [fp, #-12] 10454: e3a03005 mov r3, #5 10458: e50b3008 str r3, [fp, #-8] 1045c: e51b1008 ldr r1, [fp, #-8] 10460: e51b000c ldr r0, [fp, #-12] 10464: ebffffe5 bl 10400 10468: e1a02000 mov r2, r0 1046c: e59f3010 ldr r3, [pc, #16] ; 10484
10470: e5832000 str r2, [r3] 10474: e3a03000 mov r3, #0 10478: e1a00003 mov r0, r3 1047c: e24bd004 sub sp, fp, #4 10480: e8bd8800 pop {fp, pc} 10484: 00021024 andeq r1, r2, r4, lsr #32

圖解棧的變化過程

如何能讓讀者接受吸收的更快,我一直覺得按照學(xué)習(xí)效率來講的話順序應(yīng)該是視頻,圖文,文字。反正我是比較喜歡視頻類的教學(xué)。這里給大家畫下棧變化的過程是什么樣子的。這里的圖是結(jié)合上面的代碼來畫的,希望有助于讀者的理解。

1.程序在內(nèi)存分布區(qū)域



2.全局變量m賦值



3.保存進(jìn)入main之前的棧底, fp-sp之間是當(dāng)前函數(shù)棧




4.函數(shù)main的棧已經(jīng)準(zhǔn)備好了



5.i入棧



6.j入棧




7.準(zhǔn)備函數(shù)fun的調(diào)用, 形參反向入棧 先形參b入棧



8.形參a入棧



9.留空一個地址作為fun返回值, 待后面返回時填入



10.fun返回地址入棧, 通常是main函數(shù)當(dāng)前pc指針的下一個



11.main函數(shù)的棧底地址入棧



12.pc指針跳轉(zhuǎn)fun代碼



13.c入棧



14.可以看到函數(shù)fun的數(shù)據(jù) 形參a,b 在上一層函數(shù)的棧中. 一部分在自己的棧上. 此步取值到加法器中進(jìn)行加法運(yùn)算,再賦值給c



15.c賦給返回值,填入上面的留空位置



16.棧底恢復(fù)上一層



17.lr賦值給pc, 實現(xiàn)了跳轉(zhuǎn)



18.返回值賦值給全局變量m



19.前面函數(shù)調(diào)用的形參已經(jīng)無用,回滾sp



20.函數(shù)返回,清理main的??臻g



總結(jié)

這么多圖有沒有看花?相信到這里你已經(jīng)了解了棧背后的來龍去脈,下一篇我們一起根據(jù)實際的 stack 錯誤案例剖析錯誤的可能性。

往期推薦:

物聯(lián)網(wǎng)通信協(xié)議大匯總!

極客感十足的電子胸牌 ART-Badge V2.0

在公眾號聊天界面回復(fù)1024,可獲取嵌入式資源;回復(fù)?m?,可查看文章匯總。


點擊閱讀原文,查看更多分享

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉