日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

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


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


Arm指令集介紹

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

演示代碼

假如現(xiàn)在你已經掌握了 arm 指令的用法,即便沒有掌握也沒關系,“書到用時回頭翻”。這里以一段簡單的 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

圖解棧的變化過程

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

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



2.全局變量m賦值



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




4.函數(shù)main的棧已經準備好了



5.i入棧



6.j入棧




7.準備函數(shù)fun的調用, 形參反向入棧 先形參b入棧



8.形參a入棧



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



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



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



12.pc指針跳轉fun代碼



13.c入棧



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



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



16.棧底恢復上一層



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



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



19.前面函數(shù)調用的形參已經無用,回滾sp



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



總結

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

往期推薦:

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

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

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


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

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉