www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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


今天和大家一起看下面對(duì) crash 日志的時(shí)候,如何利用 stack 來(lái)分析其變化的來(lái)龍去脈。


Arm指令集介紹

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

演示代碼

假如現(xiàn)在你已經(jīng)掌握了 arm 指令的用法,即便沒(méi)有掌握也沒(méi)關(guān)系,“書到用時(shí)回頭翻”。這里以一段簡(jiǎn)單的 c 語(yǔ)言為例:
#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

圖解棧的變化過(guò)程

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

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.留空一個(gè)地址作為fun返回值, 待后面返回時(shí)填入



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



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, 實(shí)現(xiàn)了跳轉(zhuǎn)



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



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



20.函數(shù)返回,清理main的棧空間



總結(jié)

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

往期推薦:

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

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

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


點(diǎn)擊閱讀原文,查看更多分享

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

近日,美國(guó)參議院公布了一項(xiàng)引人注目的國(guó)防政策方案,其中包含的“2025年國(guó)家人工智能保障準(zhǔn)入和創(chuàng)新法案”(簡(jiǎn)稱GAIN AI法案)再次在全球科技領(lǐng)域掀起波瀾。

關(guān)鍵字: AI GPU

重慶2025年9月6日 /美通社/ -- iChongqing新聞報(bào)道:2025世界智能產(chǎn)業(yè)博覽會(huì)于9月5日在重慶開幕,550余家企業(yè)參展,展示了從自動(dòng)駕駛和人工智能(AI)座艙到擴(kuò)展現(xiàn)實(shí)(XR)影視和機(jī)器人咖啡廳的30...

關(guān)鍵字: 人工智能 新能源汽車 AI 機(jī)器人

慕尼黑2025年9月6日 /美通社/ -- 近日,廣汽正式推出全新增程技術(shù)——"星源增程"(英文名為ADiMOTION),全面提升增程器效率、動(dòng)力響應(yīng)及NVH表現(xiàn),同時(shí)配合AI能量控制平臺(tái),實(shí)現(xiàn)每一度...

關(guān)鍵字: 廣汽 AI 增程器 電機(jī)

北京2025年9月5日 /美通社/ -- 近日,2025年中瑞商業(yè)大獎(jiǎng)?lì)C獎(jiǎng)典禮在北京舉行,SGS通標(biāo)標(biāo)準(zhǔn)技術(shù)服務(wù)有限公司(以下稱SGS通標(biāo))作為瑞士SGS在中國(guó)的分支機(jī)構(gòu)榮獲了傳承獎(jiǎng)的殊榮。SGS通標(biāo)北京總經(jīng)理...

關(guān)鍵字: 可持續(xù)發(fā)展 ST AI ABILITY

北京2025年9月5日 /美通社/ -- 9月2日,濟(jì)南城市投資集團(tuán)有限公司(簡(jiǎn)稱"濟(jì)南城投")與軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(簡(jiǎn)稱"軟通動(dòng)力")正式簽署戰(zhàn)略合作...

關(guān)鍵字: AI 數(shù)字經(jīng)濟(jì) 智能化 人工智能技術(shù)

中國(guó)鄭州2025年9月5日 /美通社/ --?全球領(lǐng)先的電動(dòng)客車制造商宇通客車("宇通",上交所代碼:600066)全新升級(jí)的車聯(lián)網(wǎng)系統(tǒng)Link+采用先進(jìn)技術(shù)實(shí)現(xiàn)車隊(duì)車輛與管理平臺(tái)的智能互聯(lián)。作為Vehicle+升級(jí)版,...

關(guān)鍵字: LINK 車聯(lián)網(wǎng) AI PS

大眾汽車集團(tuán)加速推進(jìn)生產(chǎn)數(shù)字化轉(zhuǎn)型 數(shù)字化生產(chǎn)平臺(tái)(Digital Production Platform)成為大眾汽車的"工廠云",在全球生產(chǎn)基地實(shí)現(xiàn)人工智能(AI)與前沿 IT...

關(guān)鍵字: 亞馬遜 大眾汽車 AI 數(shù)字化

北京2025年9月5日 /美通社/ -- 9月4日,在北京市人民政府新聞辦公室舉行的"一把手發(fā)布?京華巡禮"系列主題新聞發(fā)布會(huì)上,北京經(jīng)開區(qū)對(duì)外發(fā)布,北京經(jīng)濟(jì)技術(shù)開發(fā)區(qū)(簡(jiǎn)稱"北京經(jīng)開區(qū)&q...

關(guān)鍵字: 人工智能 模型 開源 AI

RighValor現(xiàn)已基于Synaptics? Astra? SL1600系列SOC運(yùn)行,提供隱私至上的實(shí)時(shí)邊緣智能。 加利福尼亞州帕洛阿爾托2025年9月5日 /美通社/ --?邊緣分布式代理AI先驅(qū)企業(yè)Righ今日...

關(guān)鍵字: 智能家居 SYNAPTICS AI ST

柏林2025年9月4日 /美通社/ -- 全球消費(fèi)電子與家電領(lǐng)先品牌海信,將以AI Your Life為主題在IFA 2025呈現(xiàn)全線人工智能創(chuàng)新成果。從沉浸式娛樂(lè)、影院級(jí)畫質(zhì)到智能家居生活與氣候智能健康,海信將展示AI...

關(guān)鍵字: 海信 AI RGB MINILED
關(guān)閉