點(diǎn)擊上方藍(lán)字談思實(shí)驗(yàn)室
獲取更多汽車網(wǎng)絡(luò)安全資訊
1. 在ARM Cortex-M3架構(gòu)中,堆棧通常由兩個(gè)寄存器來管理:主堆棧指針(MSP)和進(jìn)程堆棧指針(PSP)。
1.1. MSP是處理器的默認(rèn)堆棧指針,用于保存中斷處理程序的現(xiàn)場。當(dāng)芯片復(fù)位或發(fā)生中斷時(shí),處理器會(huì)自動(dòng)將MSP的值保存到堆棧中,并使用一個(gè)新的堆棧來保存中斷處理程序的現(xiàn)場。MSP的值可以通過專門的寄存器進(jìn)行讀寫,以便在需要時(shí)進(jìn)行堆棧切換。
1.2. PSP是用于保存應(yīng)用程序現(xiàn)場的堆棧指針。在應(yīng)用程序執(zhí)行期間,PSP用于保存當(dāng)前執(zhí)行線程的現(xiàn)場。當(dāng)發(fā)生中斷時(shí),處理器會(huì)自動(dòng)將PSP的值保存到堆棧中,并使用MSP來保存中斷處理程序的現(xiàn)場。PSP的值也可以通過專門的寄存器進(jìn)行讀寫,以便在需要時(shí)進(jìn)行堆棧切換。

1.3. 其實(shí)說白了就是如果你跑的是裸機(jī)程序,他用的就是一個(gè)堆棧的機(jī)制,就是只跑MSP的堆棧。但是如果你要跑操作系統(tǒng),他就要用到雙堆棧機(jī)制,比如程序正在順序執(zhí)行,突然產(chǎn)生一個(gè)中斷,處理器把TASK的信息現(xiàn)場保存在PSP棧中,然后進(jìn)入中斷服務(wù)程序,中斷服務(wù)程序中使用MSP棧,退出中斷時(shí)從PSP棧中還原現(xiàn)場,返回用戶程序。還有就是TASK的切換也是在PSP里切的,比如在一個(gè)時(shí)間片里TASK1沒有執(zhí)行完,他就會(huì)把TASK的現(xiàn)場保存在PSP棧中,之后執(zhí)行TASK2,當(dāng)TASK2執(zhí)行完后,在還原PSP棧中TASK1的現(xiàn)場繼續(xù)執(zhí)行。
1.4 堆棧是一種用于保存函數(shù)調(diào)用現(xiàn)場和局部變量的數(shù)據(jù)結(jié)構(gòu),它的操作是先進(jìn)后出(Last-In-First-Out,LIFO)。棧幀(stack frame)是在函數(shù)調(diào)用期間在堆棧上分配的一塊內(nèi)存區(qū)域,用于存儲(chǔ)函數(shù)的局部變量、參數(shù)和返回地址等信息。在函數(shù)調(diào)用過程中,每個(gè)函數(shù)都會(huì)分配一個(gè)新的棧幀,用于保存它的執(zhí)行上下文。當(dāng)函數(shù)返回時(shí),棧幀被彈出堆棧,釋放內(nèi)存空間,并將控制權(quán)返回給調(diào)用者。所以說白了棧就是嵌入式RAM的一塊連續(xù)內(nèi)存空間,當(dāng)程序執(zhí)行時(shí),會(huì)將相關(guān)數(shù)據(jù)壓入棧中,棧指針會(huì)向下移動(dòng),分配新的內(nèi)存空間。當(dāng)函數(shù)執(zhí)行出棧操作時(shí),棧指針會(huì)向上移動(dòng),釋放內(nèi)存空間。
2. 上面說的是Cortex-M3內(nèi)核的指針堆棧寄存器,但是TC397與Cortex-M3不同,他是有5個(gè)核,每個(gè)核都有自己的堆棧空間,它分為內(nèi)核堆棧(core stack)和用戶堆棧(user stack)和中斷堆棧(interrupt stack)。如下圖,下圖沒有說內(nèi)核堆棧(core stack),是因?yàn)椋╟ore stack)是用于跑OS的。內(nèi)核堆棧用于保存操作系統(tǒng)內(nèi)核的執(zhí)行上下文,而用戶堆棧用于保存應(yīng)用程序的執(zhí)行上下文。中斷棧(interrupt stack)則是用于保存中斷處理程序執(zhí)行上下文的堆棧空間。上面說的3個(gè)堆棧空間,其實(shí)就是說在跑操作系統(tǒng)和中斷的時(shí)候用的是MSP,跑任務(wù),用的用戶堆棧,也就是PSP。所謂的內(nèi)核堆棧和用戶堆棧是基于OS的堆棧指針的指向是根據(jù)當(dāng)前處理器所處的模式(特權(quán)模式或用戶權(quán)模式)來確定的。
2.1 在特權(quán)模式下,處理器可以訪問所有的處理器資源和指令,包括特殊的系統(tǒng)寄存器、中斷控制器、內(nèi)存管理單元等。也就是說,在特權(quán)模式下,處理器可以訪問用戶模式下的堆棧。處理器可以使用PSP指針來訪問用戶堆棧,并讀取或?qū)懭胗脩舳褩I系臄?shù)據(jù)。
2.2 而在用戶模式下,處理器只能訪問受限的處理器資源和指令。用戶模式下,處理器只能訪問用戶的數(shù)據(jù)和代碼,無法訪問系統(tǒng)的關(guān)鍵資源。這樣可以確保用戶代碼不會(huì)對系統(tǒng)的穩(wěn)定性和安全性產(chǎn)生影響。
也就是說內(nèi)核堆棧是在特權(quán)模式下,并且用的MSP,但是他可以方訪問PSP。而中斷也是在特權(quán)模式下的MSP里,可以方訪問PSP。用戶堆棧就是在非特權(quán)模式下只能用的PSP。
?2.3 因?yàn)橹袛嗪彤惓L幚硗ǔP枰L問操作系統(tǒng)內(nèi)核代碼和資源,而這些資源只能在特權(quán)模式下訪問,所以中斷堆棧必須位于特權(quán)模式下。
?2.4 中斷堆棧包含了一些重要的信息,如 CPU 寄存器、程序計(jì)數(shù)器、堆棧指針等,這些信息用于在中斷或異常處理完成后恢復(fù)原來的執(zhí)行上下文。
2.5 內(nèi)核堆棧和用戶堆棧用于保存執(zhí)行上下文,中斷堆棧用于保存中斷處理程序的執(zhí)行上下文。



除此之外還有三個(gè)寄存器,一個(gè)是SP也就是A[10],一個(gè)ISP,還有一個(gè)PSW。
A[10]:這個(gè)就在GPR中,也稱之為SP(Stack Pointer),與傳統(tǒng)內(nèi)核的SP類似.如下圖:

ISP:在CSFR中,專用于中斷的Stack.進(jìn)入中斷后自動(dòng)切換使用ISP,以防止對主任務(wù)Stack的誤操作.
PSW中的IS用于標(biāo)記當(dāng)前Stack Pointer狀態(tài). PSW.IS==0時(shí),表示Upper Context已經(jīng)被保存,A10(SP)已經(jīng)裝入ISP的值.當(dāng)PSW.IS==1時(shí),表示已經(jīng)使用的ISP的值(比如中斷嵌套),此時(shí)SP已經(jīng)是ISP的值,無須再裝入ISP的值.

3. 代碼中的堆棧

3.1 棧(操作系統(tǒng)):存局部變量、函數(shù),調(diào)用函數(shù)時(shí)會(huì)開辟棧區(qū),函數(shù)結(jié)束時(shí)就自動(dòng)回收,遵循后進(jìn)先出的原則,從高地址向低地址增長。
靜態(tài)內(nèi)存分配:靜態(tài)內(nèi)存是程序編譯執(zhí)行后系統(tǒng)自動(dòng)分配,由系統(tǒng)自動(dòng)釋放,靜態(tài)內(nèi)存是棧分配的,特點(diǎn):不持久。
使用靜態(tài)內(nèi)存分配的變量有:全局變量&靜態(tài)變量
3.2 堆(操作系統(tǒng)):malloc、realloc、calloc等開辟的內(nèi)存就在堆,從低地址向高地址增長,由程序員分配和釋放,系統(tǒng)不自動(dòng)回收,所以一定要記得申請了就要釋放,以免溢出。
在嵌入式系統(tǒng)中,使用堆內(nèi)存相對于棧內(nèi)存來說是比較少的。嵌入式系統(tǒng)通常擁有有限的內(nèi)存資源,而使用堆內(nèi)存可能會(huì)導(dǎo)致內(nèi)存碎片和性能問題。在嵌入式系統(tǒng)中,通常會(huì)限制堆內(nèi)存的大小,并且使用堆內(nèi)存時(shí)需要非常小心,以確保不會(huì)出現(xiàn)內(nèi)存泄漏或者堆溢出等問題。在某些情況下,嵌入式系統(tǒng)需要使用堆內(nèi)存,例如當(dāng)需要?jiǎng)討B(tài)創(chuàng)建對象或者動(dòng)態(tài)分配數(shù)組時(shí)。在這種情況下,程序員需要小心地管理堆內(nèi)存,以確保不會(huì)出現(xiàn)內(nèi)存泄漏或者堆溢出等問題。
動(dòng)態(tài)內(nèi)存分配:動(dòng)態(tài)內(nèi)存是開發(fā)者手動(dòng)分配的,是堆分配的。特點(diǎn):持久。
在C語言中,全局變量分配在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū),非靜態(tài)的局部變量【動(dòng)態(tài)局部變量】(包括形參)是分配在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū),該存儲(chǔ)區(qū)被稱為棧。除此之外,c語言還允許建立內(nèi)存動(dòng)態(tài)分配區(qū)域,以存放一些臨時(shí)用的數(shù)據(jù),這些數(shù)據(jù)不必在程序的聲明部分定義,也不必等到函數(shù)結(jié)束時(shí)才釋放,而是需要時(shí)隨時(shí)開辟,不需要是隨時(shí)釋放。這些數(shù)據(jù)臨時(shí)存在一個(gè)特別的自由存儲(chǔ)區(qū),稱為堆區(qū)。
4. 如何調(diào)試

原文鏈接:https://blog.csdn.net/xiandang8023/article/details/131724885
?end?

?專業(yè)社群?

?精品活動(dòng)推薦?


更多文章
關(guān)于涉嫌仿冒AutoSec會(huì)議品牌的律師聲明
一文帶你了解智能汽車車載網(wǎng)絡(luò)通信安全架構(gòu)
網(wǎng)絡(luò)安全:TARA方法、工具與案例
汽車數(shù)據(jù)安全合規(guī)重點(diǎn)分析
淺析汽車芯片信息安全之安全啟動(dòng)
域集中式架構(gòu)的汽車車載通信安全方案探究
系統(tǒng)安全架構(gòu)之車輛網(wǎng)絡(luò)安全架構(gòu)
車聯(lián)網(wǎng)中的隱私保護(hù)問題
智能網(wǎng)聯(lián)汽車網(wǎng)絡(luò)安全技術(shù)研究
AUTOSAR 信息安全框架和關(guān)鍵技術(shù)分析
AUTOSAR 信息安全機(jī)制有哪些?
信息安全的底層機(jī)制
汽車網(wǎng)絡(luò)安全
Autosar硬件安全模塊HSM的使用
首發(fā)!小米雷軍兩會(huì)上就汽車數(shù)據(jù)安全問題建言:關(guān)于構(gòu)建完善汽車數(shù)據(jù)安全管理體系的建議