人妻系列无码专区av在线,国内精品久久久久久婷婷,久草视频在线播放,精品国产线拍大陆久久尤物

當(dāng)前位置:首頁 > 開發(fā)語言 > 正文

arm匯編如何通過函數(shù)指針調(diào)用c函數(shù)并傳遞參數(shù)?

arm匯編如何通過函數(shù)指針調(diào)用c函數(shù)并傳遞參數(shù)?

淺析backtrace(?;厮?的實(shí)現(xiàn) 1、淺析backtrace(?;厮荩┑膶?shí)現(xiàn) 在aarch64(arm64平臺(tái))測(cè)試環(huán)境下,使用gdb調(diào)試在test3上設(shè)置斷點(diǎn)并...

淺析backtrace(棧回溯)的實(shí)現(xiàn)

1、淺析backtrace(?;厮荩┑膶?shí)現(xiàn) 在aarch64(arm64平臺(tái))測(cè)試環(huán)境下,使用gdb調(diào)試在test3上設(shè)置斷點(diǎn)并運(yùn)行程序。此時(shí),程序流程為:main() - test1(3, 8) - test2(3) - test3(3)。

2、此時(shí),backtrace(堆棧追蹤)就顯得尤為重要,它允許在離線狀態(tài)下分析的關(guān)鍵信息,并通過函數(shù)?;厮菡业匠鲥e(cuò)對(duì)應(yīng)的函數(shù),結(jié)合程序設(shè)計(jì),大部分bug可以定位。本文將主要探討cortex-m架構(gòu)的棧布局以及棧回溯的底層原理和解決方。cortex-m架構(gòu)的棧布局與壓棧入棧機(jī)制密切相關(guān)。

3、backtrace功能主要基于函數(shù)調(diào)用棧的概念,實(shí)現(xiàn)原理在于利用棧中的信息追蹤程序路徑和調(diào)用關(guān)系。在Linux中,glibc提供backtrace()函數(shù),gdb則是一個(gè)強(qiáng)大的調(diào)試器,能實(shí)時(shí)追蹤程序,獲取調(diào)用棧信息。libunwind庫在不同平臺(tái)和架構(gòu)上運(yùn)行,提供簡單API接口,同樣支持backtrace功能。

4、FP的主要功能在于棧回溯,幫助追蹤子程序調(diào)用關(guān)系,即backtrace。當(dāng)調(diào)用函數(shù)時(shí),F(xiàn)P會(huì)記錄下調(diào)用層次,并在棧中保存。以ARM CC5為例,?;厮萆婕癋P、LR和參數(shù)的保存,通過查找FP指向的棧頂,可追溯調(diào)用鏈。

5、實(shí)現(xiàn)backtrace功能,模擬gdb的反向跟蹤,通過棧幀中的幀指針回溯調(diào)用鏈。在kernel/printf.c中實(shí)現(xiàn)backtrace函數(shù),調(diào)試sys_sleep并觀察輸出。最后,實(shí)驗(yàn)著重于alarm功能的實(shí)現(xiàn),涉及調(diào)用的信號(hào)處理和中斷管理,包括時(shí)鐘中斷計(jì)數(shù)和進(jìn)程狀態(tài)恢復(fù)。

6、backtrace實(shí)驗(yàn)要求在printf.c中實(shí)現(xiàn)回溯功能,通過跟蹤每個(gè)棧幀的frame pointer(調(diào)用者frame pointer的)來打印每個(gè)棧幀保存的返回。至于具體實(shí)現(xiàn),實(shí)驗(yàn)未提供詳細(xì)步驟和結(jié)果。Alarm(hard)部分涉及陷阱處理,包括trap的復(fù)習(xí)和實(shí)現(xiàn)。階段1通過test0調(diào)用handler,階段2關(guān)注于恢復(fù)中斷代碼的。

為什么要初始化堆棧?

所以,接下來的內(nèi)容,就是經(jīng)過一定的探究,試圖來解釋一下,為何要初始化堆棧,即:\x0d\x0a為何C語言的函數(shù)調(diào)用要用到堆棧,而匯編卻不需要初始化堆棧。\x0d\x0a\x0d\x0a要明白這個(gè)問題,首先要了解堆棧的作用。

總的來說,堆棧的作用就是:保存現(xiàn)場(chǎng)/上下文,傳遞參數(shù)。保存現(xiàn)場(chǎng)/上下文 現(xiàn)場(chǎng),意思就相當(dāng)于發(fā)現(xiàn)場(chǎng),總有一些現(xiàn)場(chǎng)的情況,要記錄下來的,否則被別人破壞掉之后,你就無法恢復(fù)現(xiàn)場(chǎng)了。

堆棧的初始化:在程序開始之前,需要初始化堆棧。通常情況下,堆棧指針被設(shè)置為堆棧的起始。 壓入數(shù)據(jù):當(dāng)程序到一個(gè)子程序、函數(shù)或中斷處理程序時(shí),需要將返回和局部變量等數(shù)據(jù)壓入堆棧中。這可以通過將數(shù)據(jù)寫入堆棧指針?biāo)赶虻膬?nèi)存來實(shí)現(xiàn)。