欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法

文檔序號:6556582閱讀:245來源:國知局
專利名稱:一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法
技術(shù)領(lǐng)域
本發(fā)明涉及嵌入式系統(tǒng)程序編譯技術(shù)領(lǐng)域,特別是涉及一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法。
背景技術(shù)
在最近二、三十年嵌入式領(lǐng)域取得了長足的發(fā)展,許多行業(yè)的發(fā)展已經(jīng)離不開嵌入式領(lǐng)域的參與,如汽車、航空、重工、機(jī)器人、智能管家等不一而足。這些產(chǎn)業(yè)嵌入式領(lǐng)域的需求,促使了嵌入式系統(tǒng)的發(fā)展,同時也提出了越來越高的要求。
目前的嵌入式系統(tǒng)主要分為高端嵌入式系統(tǒng)和低端嵌入式系統(tǒng)兩大類,所謂高端嵌入式是指那些擁有高處理速度,多應(yīng)用的系統(tǒng),這些系統(tǒng)有高級的硬件設(shè)備。而低端是指處理速度、功能等方面一般的系統(tǒng)。這些系統(tǒng)往往在內(nèi)存上存在空間限制性的問題。由于有不同的特性所以他們被用在不同的環(huán)境,提供不同的功能和效率。
低端的嵌入式系統(tǒng)很大一部分都存在內(nèi)存不足的問題,造成這個問題的原因主要來自兩個方面一是硬件技術(shù)上的限制,二是成本上的限制。內(nèi)存不足嚴(yán)重地影響了運行于系統(tǒng)上的程序的安全。一些對內(nèi)存空間要求比較高的程序會在無警告的情況下發(fā)生堆棧溢出錯誤,最終導(dǎo)致系統(tǒng)崩潰。雖然對于小型程序這樣的問題發(fā)生的幾率很小,但是只要有這樣的可能,那么系統(tǒng)就有隱患。
多年來,針對嵌入式系統(tǒng)內(nèi)存限制導(dǎo)致堆棧溢出的研究有很多,但是其中有些太過理論,可行性太差。如內(nèi)存壓縮。內(nèi)存壓縮的目的就是能在有限的空間存儲更多的信息,但是這種方法花費太多的數(shù)據(jù)壓縮時間和數(shù)據(jù)解壓縮時間,所以在時間應(yīng)用種實效性很差。

發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中的不足,提供一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法。
本發(fā)明解決其技術(shù)問題采用的技術(shù)方案如下嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法,包括以下步驟(1)編譯器分析掃描原程序,生成程序函數(shù)調(diào)用表,供回卷函數(shù)優(yōu)化時使用;(2)編譯器在函數(shù)中插入運行時檢測代碼,檢測堆棧的使用狀態(tài),并返回信息,供插入的運行時處理代碼使用;(3)編譯器在函數(shù)中插入堆棧運行時處理代碼如果無運行時堆棧溢出錯誤發(fā)生則處理代碼不做任何事;有錯誤發(fā)生時a、若程序發(fā)現(xiàn)堆棧空間底部處有富余可用的空間,則調(diào)整堆棧寄存器的位置和堆?;鶞?zhǔn)寄存器的位置,從而擴(kuò)大堆??臻g,同時平移原棧中的數(shù)據(jù)到新棧底;恢復(fù)引起錯誤的函數(shù)調(diào)用以前的狀態(tài),并重新執(zhí)行函數(shù)調(diào)用;b、在??臻g底部沒有發(fā)現(xiàn)有用空間,在整個內(nèi)存空間尋找可用的空間;如果在整個內(nèi)存空間中存在有用空間,則利用內(nèi)存分配調(diào)用,分配一塊內(nèi)存,并通過數(shù)據(jù)結(jié)構(gòu)和原堆棧連在一起,形成新堆棧,并平移原棧中的數(shù)據(jù)到新棧底;恢復(fù)引起錯誤的函數(shù)調(diào)用以前的狀態(tài),并重新執(zhí)行函數(shù)調(diào)用;c、如果在整個內(nèi)存空間中沒有可用空間,則程序被掛起,等到有可用空間時再次被置入操作系統(tǒng)任務(wù)隊列中運行;(4)采用函數(shù)回卷技術(shù),優(yōu)化在函數(shù)中插入的代碼對普通函數(shù),不做任何處理;對嵌套調(diào)用的函數(shù),進(jìn)行函數(shù)回卷優(yōu)化,從函數(shù)調(diào)用表中形成調(diào)用路徑,將路徑中所以的在的函數(shù)中插入的代碼簡化合并到最頂層的函數(shù)中,簡化代碼量。
本發(fā)明與背景技術(shù)相比,具有的有益的效果是本發(fā)明主要是采用編譯技術(shù)將運行時檢測代碼和運行時處理代碼插入到每個函數(shù)的開始處,在出現(xiàn)嵌套函數(shù)調(diào)用時,采用檢測代碼回卷技術(shù),只在起始調(diào)用函數(shù)中插入代碼,而無需在每個嵌套函數(shù)中插入代碼。這樣就大大的減少了代碼量。通過這樣的方法就能夠在應(yīng)用程序運行時動態(tài)檢測堆??臻g,并做相應(yīng)的處理,排除發(fā)生堆棧運行溢出的可能性,最終保證系統(tǒng)可以在安全的前提下運行。


圖1是本發(fā)明方法的流程示意圖。
具體實施例方式
下面結(jié)合附圖和具體實施例對本發(fā)明的內(nèi)容進(jìn)行詳細(xì)描述。
在實施嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法時,具體方式如下第一步,編譯器分析掃描原程序,生成程序函數(shù)調(diào)用表本方法的核心是在應(yīng)用程序代碼中插入運行時檢測代碼和程序堆棧處理代碼。但是對于不同的函數(shù)需要不同的插入方法。如果是普通單函數(shù)調(diào)用,則正常插入就可以。但是對于嵌套調(diào)用的函數(shù),情況就不一樣,相較簡單函數(shù)調(diào)用就復(fù)雜許多。下面的代碼就是兩種不同的情況void fun() void fun1(){{//內(nèi)部無函數(shù)調(diào)用 fun2();//調(diào)用函數(shù)fun2()}}對于fun()和fun1(),就是兩種不同的情況,需要不同的處理。所以要有函數(shù)調(diào)用表加以分析,得到的函數(shù)調(diào)用表由下面的步驟使用。
第二步,在函數(shù)中插入運行時檢測代碼運行時檢測代碼主要的功能是在程序運行時檢測堆棧的使用狀態(tài),判定是否發(fā)生堆棧運行時溢出,需要做以下檢測檢測堆向下生長位置是否已經(jīng)和棧指針有交叉,如果有交叉說明堆棧運行時溢出錯誤已經(jīng)發(fā)生。如果沒有交叉則說明運行狀態(tài)良好沒有錯誤。返回的信息如下(1)有錯誤,返回錯誤信息,包括當(dāng)時堆的位置和引起錯誤的函數(shù)調(diào)用信息函數(shù)局部變量、參數(shù)。
(2)無錯誤,返回正確信息。不做任何處理。
代碼由編譯器插入到程序函數(shù)的開頭處,以便在程序調(diào)用函數(shù)之后立即進(jìn)行檢測。
第三步,在函數(shù)中插入運行時處理代碼
運行時處理代碼的功能是根據(jù)第二步返回的結(jié)果對堆棧進(jìn)行處理,如果第二步返回的結(jié)果沒有任何問題則此部分代碼不做任何處理。如果第二步的返回結(jié)果說明堆棧運行時溢出錯誤已發(fā)生,則做查看堆棧底部有無多余可用空間(1)有多余空間,則調(diào)整堆棧底部位置,將堆棧底部向外擴(kuò)展。此時堆棧內(nèi)部的原來存儲在棧中的數(shù)據(jù)相對于棧底的位置發(fā)生了偏移,所以必須將原來棧中的數(shù)據(jù)平移到棧底,并重新設(shè)置?;羔樀綏5孜恢?,棧指針到當(dāng)前站頂位置,重新執(zhí)行由第二步執(zhí)行的引發(fā)錯誤的指令。通過這樣觸發(fā)錯誤的函數(shù)調(diào)用將會被重新調(diào)用,而引起錯誤時的調(diào)用所設(shè)置的數(shù)據(jù)已在第二步中進(jìn)行了記錄,這些記錄被用來恢復(fù)到錯誤狀態(tài)前一步。等堆棧擴(kuò)充過之后就可以重新調(diào)用引起錯誤的調(diào)用,這樣就能將錯誤恢復(fù)過來,保證了程序運行的堆棧安全性。
(1)沒有多余空間,則系統(tǒng)通過系統(tǒng)調(diào)用,在整個可用內(nèi)存中尋找可用的內(nèi)存空間,(2)在整個內(nèi)存里有可用內(nèi)存,則分配一塊內(nèi)存,并將這塊內(nèi)存通過數(shù)據(jù)結(jié)構(gòu)和原來的棧底連接起來并平移原棧中的數(shù)據(jù)到新棧底部,重新設(shè)置?;羔樅蜅V羔?。
(3)在整個內(nèi)存空間內(nèi)沒有可用內(nèi)存,則該程序被掛起,等到有可用內(nèi)存后才能再次被置如操作系統(tǒng)任務(wù)隊列中執(zhí)行。
第四步,插入代碼回卷技術(shù),優(yōu)化插入代碼第一步和第二步的代碼的插入是沒有優(yōu)化過的,通過第一、第二兩步插入的代碼量很大,所以對在為程序提供堆棧溢出保護(hù)的同時也增加了程序的代碼量。一個有效的方法是對插入代碼進(jìn)行優(yōu)化。優(yōu)化的情況主要分為兩個部分(1)簡單函數(shù)優(yōu)化簡單函數(shù)是指內(nèi)部沒有其他函數(shù)調(diào)用的函數(shù),這樣的函數(shù),內(nèi)部都是簡單代碼,沒有嵌套函數(shù)調(diào)用,所以編譯器插入代碼時針對這類函數(shù),只需在函數(shù)中簡單的插入運行時檢測代碼和運行時處理代碼就可以,所以無需優(yōu)化。
(2)嵌套函數(shù)優(yōu)化嵌套函數(shù)時指一個函數(shù)中有別的函數(shù)調(diào)用,所以整個函數(shù)調(diào)用會涉及多處函數(shù)調(diào)用所以,會因為這一個函數(shù)的插入代碼需要插入大量的代碼。主要方法是利用第一步生成的函數(shù)調(diào)用表,分類簡單函數(shù)嵌套函數(shù)。在嵌套函數(shù)調(diào)用部分,根據(jù)函數(shù)調(diào)用表,找出函數(shù)調(diào)用路徑。無論那個函數(shù)都是簡單函數(shù)堆砌而成,所以在函數(shù)調(diào)用路徑中,根據(jù)函數(shù)調(diào)用表,找出函數(shù)調(diào)用路徑。從函數(shù)調(diào)用路徑底部開始把插入路徑中每個函數(shù)的代碼,優(yōu)化合并卷回到最頂層函數(shù)。這樣就降低了插入的代碼量,提高了可用性。
最后,還需要注意的是,以上列舉的僅是本發(fā)明的具體實施例子。顯然,本發(fā)明不限于以上實施例子,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法,包括以下步驟(1)編譯器分析掃描原程序,生成程序函數(shù)調(diào)用表,供回卷函數(shù)優(yōu)化時使用;(2)編譯器在函數(shù)中插入運行時檢測代碼,檢測堆棧的使用狀態(tài),并返回信息,供插入的運行時處理代碼使用;(3)編譯器在函數(shù)中插入堆棧運行時處理代碼如果無運行時堆棧溢出錯誤發(fā)生則處理代碼不做任何事;有錯誤發(fā)生時a、若程序發(fā)現(xiàn)堆棧空間底部處有富余可用的空間,則調(diào)整堆棧寄存器的位置和堆?;鶞?zhǔn)寄存器的位置,從而擴(kuò)大堆??臻g,同時平移原棧中的數(shù)據(jù)到新棧底;恢復(fù)引起錯誤的函數(shù)調(diào)用以前的狀態(tài),并重新執(zhí)行函數(shù)調(diào)用;b、在??臻g底部沒有發(fā)現(xiàn)有用空間,在整個內(nèi)存空間尋找可用的空間;如果在整個內(nèi)存空間中存在有用空間,則利用內(nèi)存分配調(diào)用,分配一塊內(nèi)存,并通過數(shù)據(jù)結(jié)構(gòu)和原堆棧連在一起,形成新堆棧,并平移原棧中的數(shù)據(jù)到新棧底;恢復(fù)引起錯誤的函數(shù)調(diào)用以前的狀態(tài),并重新執(zhí)行函數(shù)調(diào)用;c、如果在整個內(nèi)存空間中沒有可用空間,則程序被掛起,等到有可用空間時再次被置入操作系統(tǒng)任務(wù)隊列中運行;(4)采用函數(shù)回卷技術(shù),優(yōu)化在函數(shù)中插入的代碼對普通函數(shù),不做任何處理;對嵌套調(diào)用的函數(shù),進(jìn)行函數(shù)回卷優(yōu)化,從函數(shù)調(diào)用表中形成調(diào)用路徑,將路徑中所以的在的函數(shù)中插入的代碼簡化合并到最頂層的函數(shù)中,簡化代碼量。
全文摘要
本發(fā)明涉及嵌入式系統(tǒng)程序編譯技術(shù)領(lǐng)域,旨在提供一種嵌入式系統(tǒng)運行時堆棧溢出保護(hù)方法。該方法包括(1)編譯器分析掃描原程序,生成程序函數(shù)調(diào)用表,供回卷函數(shù)優(yōu)化時使用;(2)編譯器在函數(shù)中插入運行時檢測代碼,檢測堆棧的使用狀態(tài),并返回信息,供插入的運行時處理代碼使用;(3)編譯器在函數(shù)中插入堆棧運行時處理代碼;(4)采用函數(shù)回卷技術(shù),優(yōu)化在函數(shù)中插入的代碼的步驟。本發(fā)明無需在每個嵌套函數(shù)中插入代碼,大大的減少了代碼量。通過這樣的方法就能夠在應(yīng)用程序運行時動態(tài)檢測堆棧空間,并做相應(yīng)的處理,排除發(fā)生堆棧運行溢出的可能性,最終保證系統(tǒng)可以在安全的前提下運行。
文檔編號G06F9/45GK1851648SQ20061005162
公開日2006年10月25日 申請日期2006年5月25日 優(yōu)先權(quán)日2006年5月25日
發(fā)明者陳天洲, 沙峰, 謝斌, 趙懿 申請人:浙江大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
稻城县| 新巴尔虎左旗| 师宗县| 米易县| 沅陵县| 含山县| 闵行区| 随州市| 五莲县| 永嘉县| 万安县| 澜沧| 巢湖市| 宿州市| 全州县| 绍兴县| 固原市| 黄山市| 新沂市| 梧州市| 长汀县| 海原县| 灵宝市| 武功县| 定西市| 太保市| 乌拉特中旗| 博白县| 钟祥市| 宁陵县| 武安市| 墨江| 垦利县| 正阳县| 武强县| 瑞安市| 宣恩县| 西丰县| 孝义市| 司法| 读书|