當(dāng)前位置:首頁(yè) > 工業(yè)控制 > 《機(jī)電信息》
[導(dǎo)讀]隨著嵌入式計(jì)算設(shè)備基礎(chǔ)硬件性能的提升,在通信、工業(yè)制造、交通運(yùn)輸?shù)阮I(lǐng)域,嵌入式系統(tǒng)逐漸承擔(dān)起更加綜合化和關(guān)鍵的任務(wù),這也導(dǎo)致嵌入式軟件在結(jié)構(gòu)愈加復(fù)雜的同時(shí),其安全性問題也越來越受到重視。堆棧是嵌入式軟件中的重要存儲(chǔ)結(jié)構(gòu),它用于保存軟件運(yùn)行過程中的關(guān)鍵信息。堆棧的安全也直接影響到嵌入式軟件的安全,因此,在一些安全性要求較高的領(lǐng)域,堆棧的使用分析已成為保證軟件安全性的必要工作之一,如機(jī)載領(lǐng)域DO—178C中要求,在對(duì)軟件源代碼的準(zhǔn)確性和一致性評(píng)審和分析時(shí)需要包含對(duì)堆棧使用的分析。本文結(jié)合現(xiàn)有技術(shù),說明如何進(jìn)行嵌入式軟件堆棧使用分析[1]。

引言

隨著嵌入式計(jì)算設(shè)備基礎(chǔ)硬件性能的提升,在通信、工業(yè)制造、交通運(yùn)輸?shù)阮I(lǐng)域,嵌入式系統(tǒng)逐漸承擔(dān)起更加綜合化和關(guān)鍵的任務(wù),這也導(dǎo)致嵌入式軟件在結(jié)構(gòu)愈加復(fù)雜的同時(shí),其安全性問題也越來越受到重視。堆棧是嵌入式軟件中的重要存儲(chǔ)結(jié)構(gòu),它用于保存軟件運(yùn)行過程中的關(guān)鍵信息。堆棧的安全也直接影響到嵌入式軟件的安全,因此,在一些安全性要求較高的領(lǐng)域,堆棧的使用分析已成為保證軟件安全性的必要工作之一,如機(jī)載領(lǐng)域DO—178C中要求,在對(duì)軟件源代碼的準(zhǔn)確性和一致性評(píng)審和分析時(shí)需要包含對(duì)堆棧使用的分析。本文結(jié)合現(xiàn)有技術(shù),說明如何進(jìn)行嵌入式軟件堆棧使用分析[1]。

1堆棧的概念

堆棧,又稱棧,是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)。當(dāng)軟件中任務(wù)因函數(shù)調(diào)用、中斷或異常處理而發(fā)生跳轉(zhuǎn)時(shí),會(huì)將任務(wù)現(xiàn)場(chǎng)的上下文信息、變量、參數(shù)等緩存到堆棧中,待處理完成后,返回時(shí)從堆棧中再恢復(fù)現(xiàn)場(chǎng)信息繼續(xù)處理[2]。

堆棧因使用場(chǎng)景不同,通常分為三種:任務(wù)棧、任務(wù)異常棧和中斷棧。

任務(wù)棧是軟件中任務(wù)在正常運(yùn)行時(shí)使用到的棧。任務(wù)在運(yùn)行時(shí)會(huì)持續(xù)進(jìn)行函數(shù)調(diào)用,每一次調(diào)用都意味著一次函數(shù)跳轉(zhuǎn)。任務(wù)棧用于在函數(shù)跳轉(zhuǎn)前緩存現(xiàn)場(chǎng)信息,在函數(shù)返回時(shí)從任務(wù)棧中恢復(fù)現(xiàn)場(chǎng)信息。

任務(wù)異常棧是系統(tǒng)處理任務(wù)引發(fā)異常時(shí)使用到的棧。任務(wù)在運(yùn)行時(shí)可能會(huì)因?yàn)槌绦蝈e(cuò)誤而引起系統(tǒng)異常,此時(shí)操作系統(tǒng)會(huì)進(jìn)入異常處理,該處理過程中使用任務(wù)異常棧保存異常發(fā)生現(xiàn)場(chǎng)信息和處理過程信息。

中斷棧是系統(tǒng)處理外部中斷時(shí)使用到的棧。任務(wù)在運(yùn)行時(shí)可能會(huì)被外部中斷打斷,此時(shí)操作系統(tǒng)會(huì)進(jìn)入中斷處理,該處理過程中使用中斷棧保存中斷發(fā)生現(xiàn)場(chǎng)信息和處理過程信息。

嵌入式軟件的運(yùn)行實(shí)際上是多個(gè)任務(wù)的持續(xù)調(diào)度和執(zhí)行,通常操作系統(tǒng)在創(chuàng)建每個(gè)任務(wù)時(shí)都會(huì)為其分配一個(gè)任務(wù)棧和一個(gè)任務(wù)異常棧。任務(wù)從其入口函數(shù)開始啟動(dòng)執(zhí)行,執(zhí)行過程中發(fā)生函數(shù)調(diào)用時(shí)進(jìn)行數(shù)據(jù)壓棧,用任務(wù)棧存儲(chǔ)參數(shù)、變量、寄存器值等臨時(shí)數(shù)據(jù)。函數(shù)返回時(shí)進(jìn)行彈棧,從任務(wù)棧中恢復(fù)臨時(shí)數(shù)據(jù)。任務(wù)切換時(shí)會(huì)切換使用的任務(wù)棧,因此任務(wù)棧之間是相互隔離的。任務(wù)運(yùn)行時(shí)可能因代碼缺陷等原因觸發(fā)系統(tǒng)異常,此時(shí)停止任務(wù)運(yùn)行,將任務(wù)棧切換為任務(wù)異常棧進(jìn)行異常處理,處理完成后再切換回任務(wù)棧。任務(wù)運(yùn)行時(shí)會(huì)被外部設(shè)備中斷打斷,如定時(shí)器中斷、串口中斷等,此時(shí)停止任務(wù)運(yùn)行,將任務(wù)棧切換到中斷棧進(jìn)行中斷處理,處理完成后再切換回任務(wù)棧。

2嵌入式軟件堆棧使用分析目的

嵌入式軟件堆棧使用分析的目的是分析并計(jì)算軟件運(yùn)行期間堆棧的最差使用情況,確認(rèn)堆棧資源分配是否合理'需確保在最差情況下也不會(huì)出現(xiàn)棧溢出,從而保證軟件運(yùn)行過程中堆棧中的關(guān)鍵數(shù)據(jù)始終是正確的。

任務(wù)棧是軟件運(yùn)行過程中被操作最頻繁的堆棧,且存儲(chǔ)著任務(wù)運(yùn)行時(shí)的關(guān)鍵信息。任務(wù)棧中的信息若被破壞或篡改'將會(huì)導(dǎo)致程序運(yùn)行不符合預(yù)期甚至程序崩潰。對(duì)于高安全性的嵌入式軟件'針對(duì)任務(wù)棧的堆棧使用分析是軟件安全性保證工作的重要部分。故本文只針對(duì)嵌入式軟件任務(wù)棧的堆棧使用分析方法進(jìn)行說明。

3嵌入式軟件堆棧使用分析技術(shù)

在進(jìn)行嵌入式軟件堆棧使用分析時(shí)可以采用多種技術(shù),以下針對(duì)三種常見的技術(shù)方法進(jìn)行說明。

1)手工計(jì)算法:人工計(jì)算任務(wù)執(zhí)行流程中各函數(shù)調(diào)用期間所需的任務(wù)??臻g大小,并估算出所有可能的調(diào)用路徑上所需的任務(wù)棧空間大小,其中值最大的即為任務(wù)棧的最壞使用情況。該方法需要分析人員熟悉程序源代碼和函數(shù)調(diào)用期間使用的寄存器數(shù)量和每個(gè)寄存器所占用的??臻g大小。對(duì)于較復(fù)雜的軟件,該方法工作量大、耗時(shí)長(zhǎng)、易出錯(cuò),其計(jì)算結(jié)果準(zhǔn)確程度依賴于分析人員個(gè)人能力。

2)靜態(tài)代碼分析法:通過堆棧分析工具對(duì)代碼展開靜態(tài)分析,從而計(jì)算出任務(wù)棧的最壞使用情況及路徑。工具以任務(wù)入口函數(shù)為起點(diǎn),計(jì)算出一條從起點(diǎn)到調(diào)用終點(diǎn)的任務(wù)棧最壞使用路徑,該路徑上各函數(shù)節(jié)點(diǎn)的堆棧使用之和便是任務(wù)棧的最壞使用情況。該方法僅前期準(zhǔn)備階段需要一定工作量,后續(xù)階段工作易實(shí)施、耗時(shí)短、結(jié)果直觀。但該方法無法分析動(dòng)態(tài)調(diào)用場(chǎng)景,如通過指針調(diào)用,需要人工干預(yù)。

3)動(dòng)態(tài)運(yùn)行時(shí)分析法:通過動(dòng)態(tài)分析工具監(jiān)控程序的運(yùn)行時(shí)堆棧使用情況從而獲得最壞使用情況。該方法通常需先按照工具約定對(duì)代碼進(jìn)行插樁并重新編譯生成可執(zhí)行程序,之后通過執(zhí)行測(cè)試用例覆蓋所有可能的程序路徑,工具可以跟蹤用例執(zhí)行期間的函數(shù)調(diào)用和返回,記錄堆棧的使用情況,最終分析出堆棧最壞使用情況。該方法分析階段自動(dòng)化,無須人工干預(yù)、工作量較小、可覆蓋動(dòng)態(tài)調(diào)用場(chǎng)景。但該方法分析結(jié)果準(zhǔn)確程度依賴于測(cè)試用例設(shè)計(jì)完善程度,若測(cè)試用例未覆蓋到全部路徑,則可能會(huì)導(dǎo)致結(jié)果不準(zhǔn)確。

綜上所述,相較于其他兩種方法,靜態(tài)代碼分析法使用工具代替人工分析,效率更高,同時(shí)無須部署運(yùn)行目標(biāo)軟件,更加方便靈活。因此本文基于靜態(tài)代碼分析法,介紹如何通過靜態(tài)分析工具stackAnalyer進(jìn)行嵌入式軟件堆棧使用分析。

4 stackAnaIyer概述

stackAnalyer是一款由Abslnt公司開發(fā)的用于嵌入式軟件堆棧使用情況分析的工具。它是一款靜態(tài)分析工具,不依賴程序執(zhí)行。它通過對(duì)二進(jìn)制可執(zhí)行文件展開靜態(tài)分析,自動(dòng)分析從輸入的程序入口函數(shù)到結(jié)束的所有可能調(diào)用路徑,并計(jì)算路徑上的堆棧使用情況,識(shí)別堆棧最差使用情況和路徑。stackAnalyer工具的工作原理如下:

1)以任務(wù)入口函數(shù)為起點(diǎn)分析代碼,為任務(wù)建立一棵調(diào)用樹;

2)分析該調(diào)用樹中每個(gè)節(jié)點(diǎn)上函數(shù)的堆棧使用量;

3)分析并計(jì)算從樹根節(jié)點(diǎn)到葉子節(jié)點(diǎn)哪條調(diào)用路徑上經(jīng)過的節(jié)點(diǎn)函數(shù)的堆棧使用量之和最大,該條路徑便是任務(wù)堆棧最差使用路徑,使用量之和為任務(wù)堆棧最差使用情況。

stackAnalyer工具存在如下兩處功能缺陷:

1)作為靜態(tài)代碼分析工具無法分析包括函數(shù)指針調(diào)用在內(nèi)的動(dòng)態(tài)調(diào)用場(chǎng)景,遇到通過函數(shù)指針的跳轉(zhuǎn)時(shí),由于跳轉(zhuǎn)地址不是有效的函數(shù)地址,會(huì)導(dǎo)致分析失敗;

2)無法分析系統(tǒng)調(diào)用場(chǎng)景,遇到系統(tǒng)調(diào)用指令時(shí)由于無法識(shí)別跳轉(zhuǎn)目的函數(shù),會(huì)終止分析該條路徑。

針對(duì)上述兩種場(chǎng)景,在實(shí)際操作時(shí)需要進(jìn)行人工干預(yù)。

5嵌入式軟件堆棧使用分析方法

本章節(jié)結(jié)合stackAnalyer工具分析原理和嵌入式軟件特點(diǎn),以圖1所示的Taskcase任務(wù)為例,針對(duì)基于靜態(tài)代碼分析的嵌入式軟件堆棧使用分析實(shí)施過程進(jìn)行說明。

5.1梳理軟件任務(wù)信息

在進(jìn)行堆棧使用分析時(shí),只有明確待分析軟件中運(yùn)行的任務(wù)的基本信息,才能針對(duì)具體任務(wù)展開分析和評(píng)估工作。因此首先需要梳理出軟件系統(tǒng)中運(yùn)行任務(wù)的信息,該工作至關(guān)重要,是后續(xù)所有工作的基礎(chǔ),且只能由人工完成。梳理的任務(wù)需要覆蓋本次待分析軟件包含的所有任務(wù),且梳理的信息需準(zhǔn)確。梳理的任務(wù)信息至少需要包含如下屬性:

1)任務(wù)標(biāo)識(shí):可唯一標(biāo)識(shí)一個(gè)任務(wù)的屬性,如任務(wù)名或任務(wù)ID。建議使用任務(wù)名作為任務(wù)標(biāo)識(shí),因?yàn)橥ǔH蝿?wù)ID在每次運(yùn)行軟件時(shí)都可能不同,而任務(wù)名是不變的且易于理解。

2)任務(wù)入口函數(shù):創(chuàng)建任務(wù)時(shí)為其指定的入口函數(shù)。任務(wù)入口函數(shù)必須是軟件的可執(zhí)行文件中存在的、有效的函數(shù)符號(hào),若存在同名的函數(shù),則需要說明定義該任務(wù)入口函數(shù)的文件名以便區(qū)分。若在創(chuàng)建任務(wù)時(shí)是通過函數(shù)指針方式指定的入口函數(shù),則需要確定指針具體指向的函數(shù)。只需要記錄函數(shù)名即可,無須關(guān)注其參數(shù)和返回值。

3)任務(wù)特權(quán)狀態(tài):指任務(wù)運(yùn)行時(shí)所處的系統(tǒng)特權(quán)狀態(tài),如用戶態(tài)和系統(tǒng)態(tài),部分支持虛擬化的系統(tǒng)還存在超級(jí)用戶態(tài)等第三種狀態(tài),本文不考慮三態(tài)場(chǎng)景。該屬性說明了任務(wù)運(yùn)行時(shí)任務(wù)棧所屬的特權(quán)空間。

4)分配的任務(wù)棧大小:任務(wù)創(chuàng)建時(shí)為其分配的任務(wù)棧大小,用于和分析結(jié)果進(jìn)行對(duì)比評(píng)估。

5)任務(wù)棧最差使用情況:記錄當(dāng)前任務(wù)的堆棧使用分析結(jié)果。

6)補(bǔ)充分析說明:若工具分析結(jié)果不準(zhǔn)確或分析失敗,則需要人工補(bǔ)充分析并說明具體的補(bǔ)充分析情況,否則無須說明。

在實(shí)際工作中可以按列表的形式梳理和記錄上述任務(wù)信息。以圖1中用戶Taskcase任務(wù)為例梳理任務(wù)信息表,如表1所示。

5.2工具分析

梳理完成任務(wù)信息表后,使用stackAnalyer工具對(duì)表中任務(wù)記錄逐條進(jìn)行靜態(tài)代碼分析。工具根據(jù)輸入的任務(wù)入口函數(shù)自動(dòng)分析并生成分析報(bào)告,若分析成功,則會(huì)在報(bào)告中顯示任務(wù)棧最大使用大小和路徑。以Taskcase任務(wù)為例,分析結(jié)果報(bào)告如圖2所示。

5.3補(bǔ)充分析

如上文所述,StackAnalyer工具在遇到函數(shù)指針調(diào)用和系統(tǒng)調(diào)用時(shí)會(huì)分析失敗,導(dǎo)致無法產(chǎn)生準(zhǔn)確的結(jié)果,因此需要在工具分析后針對(duì)分析失敗的任務(wù)進(jìn)行補(bǔ)充分析。

對(duì)于函數(shù)指針調(diào)用場(chǎng)景,需要走讀代碼確認(rèn)程序運(yùn)行時(shí)實(shí)際調(diào)用的函數(shù),使用工具提供的AIS工程腳本,將該函數(shù)補(bǔ)充到任務(wù)的函數(shù)調(diào)用樹上,重新分析生成最終結(jié)果。若存在多個(gè)可能調(diào)用的函數(shù),則需要對(duì)每一個(gè)函數(shù)都進(jìn)行補(bǔ)充分析,其中結(jié)果值最大的即為該任務(wù)最終分析結(jié)果。

對(duì)于系統(tǒng)調(diào)用場(chǎng)景,需要根據(jù)具體實(shí)現(xiàn)場(chǎng)景分析。系統(tǒng)調(diào)用是一種軟中斷,通常作為用戶態(tài)程序進(jìn)入系統(tǒng)態(tài)的接口。嵌入式操作系統(tǒng)提供兩種通過觸發(fā)系統(tǒng)調(diào)用實(shí)現(xiàn)函數(shù)調(diào)用的機(jī)制:

1)進(jìn)入系統(tǒng)態(tài)的系統(tǒng)調(diào)用。該機(jī)制是一種跨特權(quán)狀態(tài)的調(diào)用,會(huì)切換任務(wù)棧為系統(tǒng)態(tài)堆棧,后續(xù)堆棧的使用不會(huì)再影響任務(wù)棧,因此無須計(jì)算后續(xù)調(diào)用函數(shù)的堆棧使用量,將其直接指定為0后重新分析最終結(jié)果。

2)共享庫(kù)calllib調(diào)用。該機(jī)制通過觸發(fā)系統(tǒng)調(diào)用查找內(nèi)存空間中共享庫(kù)函數(shù)地址從而實(shí)現(xiàn)跨層級(jí)的函數(shù)調(diào)用。該調(diào)用只能在同一特權(quán)狀態(tài)下進(jìn)行,不會(huì)切換任務(wù)棧,后續(xù)堆棧使用會(huì)影響當(dāng)前任務(wù)棧,因此需要人工對(duì)后續(xù)調(diào)用過程進(jìn)行堆棧使用分析,將結(jié)果補(bǔ)充到最終分析結(jié)果中。

5.4結(jié)果分析

將軟件中所有任務(wù)都分析和補(bǔ)充分析完成后,需要逐條對(duì)軟件任務(wù)信息表中“分配的任務(wù)棧大小”和“任務(wù)棧最差使用情況”屬性進(jìn)行比較。若前者不小于后者,則說明該任務(wù)的任務(wù)??臻g分配充足,不存在棧溢出風(fēng)險(xiǎn),同時(shí)可根據(jù)具體差值適當(dāng)調(diào)整任務(wù)棧大小,節(jié)省系統(tǒng)資源;若前者小于后者,則說明存在棧溢出風(fēng)險(xiǎn),需要擴(kuò)充該任務(wù)的任務(wù)??臻g。

6結(jié)束語

本文提供了一種基于靜態(tài)代碼分析的嵌入式軟件堆棧使用分析方法,主要說明如何分析軟件任務(wù)棧的最差使用情況,同時(shí)對(duì)指針調(diào)用和系統(tǒng)調(diào)用兩種特殊調(diào)用場(chǎng)景提供了補(bǔ)充分析方法。對(duì)于異常棧和中斷棧,其使用場(chǎng)景特殊,無法使用靜態(tài)分析工具自動(dòng)分析,因此還需進(jìn)一步研究對(duì)其分析的問題和難點(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)系本站刪除。
換一批
延伸閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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