專利名稱:一種任務(wù)棧溢出檢測(cè)方法、裝置及計(jì)算機(jī)系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及堆棧處理技術(shù),具體涉及一種任務(wù)棧溢出檢測(cè)方法、裝置及 計(jì)算機(jī)系統(tǒng)。
背景技術(shù):
現(xiàn)代嵌入式實(shí)時(shí)操作系統(tǒng)中,任務(wù)越來(lái)越多,功能也越來(lái)越多,系統(tǒng)也 越來(lái)越復(fù)雜。在多任務(wù)的實(shí)時(shí)操作系統(tǒng)中, 一般每個(gè)任務(wù)(或進(jìn)程)多有自 己獨(dú)立的堆棧, 一個(gè)典型的實(shí)時(shí)多任務(wù)操作系統(tǒng)的任務(wù)棧分布情況為一個(gè)首 尾相連的鏈表結(jié)構(gòu)。任務(wù)棧中存放了任務(wù)相關(guān)的任務(wù)首地址、狀態(tài)寄存器、 現(xiàn)場(chǎng)數(shù)據(jù)等重要信息。在系統(tǒng)運(yùn)行過(guò)程中,當(dāng)任務(wù)的現(xiàn)場(chǎng)數(shù)據(jù)越來(lái)越大時(shí), 比如有太大的局部變量或者數(shù)組越界訪問(wèn)時(shí)可能會(huì)越過(guò)棧頂,出現(xiàn)任務(wù)棧溢 出現(xiàn)象,即出現(xiàn)任務(wù)棧越界的現(xiàn)象,在任務(wù)棧溢出時(shí),會(huì)將其他任務(wù)的首地 址或者狀態(tài)寄存器等數(shù)據(jù)修改,該修改可能會(huì)導(dǎo)致其他任務(wù)異常甚至系統(tǒng)崩 潰。
現(xiàn)有的一種任務(wù)棧溢出檢測(cè)方法是這樣的如圖1所示,描述了 n個(gè)任
務(wù)(任務(wù)l、任務(wù)2.....任務(wù)n)的任務(wù)棧的情況,每個(gè)任務(wù)的任務(wù)棧從棧
底部分開(kāi)始分別是任務(wù)首地址、狀態(tài)寄存器等信息,現(xiàn)場(chǎng)數(shù)據(jù)存儲(chǔ)在寄存器 中,為了檢測(cè)任務(wù)棧溢出,在每個(gè)任務(wù)的棧頂部分設(shè)置了一段標(biāo)志空間101, 使原來(lái)相鄰任務(wù)的臨界點(diǎn),如圖1中的任務(wù)1的棧頂和任務(wù)2的棧底加了一 段標(biāo)志空間101,因而原有的相鄰任務(wù)可以通過(guò)標(biāo)志空間101隔開(kāi)。
為了能夠?qū)θ蝿?wù)棧的溢出進(jìn)行檢測(cè),在標(biāo)志空間101寫上預(yù)置的一^:特 殊標(biāo)志, 一般情況下是不會(huì)有任務(wù)所填寫的數(shù)據(jù)與所述的特殊標(biāo)志相同,因 而可以在標(biāo)志空間101寫上特殊標(biāo)志后,可以通過(guò)在定時(shí)檢測(cè)任務(wù)、或者通
被任務(wù)所改寫,則說(shuō)明發(fā)生了任務(wù)棧溢出,從而進(jìn)行相應(yīng)的后續(xù)處理。
測(cè),但是需要啟動(dòng)額外的定時(shí)檢測(cè)任務(wù)或定時(shí)檢測(cè)中斷,浪費(fèi)系統(tǒng)資源;同
時(shí),由于是通過(guò)定時(shí)檢測(cè)任務(wù)或定時(shí)檢測(cè)中斷進(jìn)行檢測(cè),不能實(shí)時(shí)的對(duì)任務(wù) 棧溢出進(jìn)行檢測(cè)。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供了一種任務(wù)棧溢出檢測(cè)方法、裝置及計(jì)算機(jī)系統(tǒng),不
本發(fā)明實(shí)施例的目的是通過(guò)以下技術(shù)方案實(shí)現(xiàn)的
本發(fā)明實(shí)施例提供了一種任務(wù)棧溢出檢測(cè)方法,包括在任務(wù)棧的棧頂 設(shè)置檢測(cè)空間;將所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性;通過(guò)檢測(cè)是否有 任務(wù)嘗試更改所述只讀屬性的數(shù)據(jù),判斷是否有任務(wù)棧溢出。
相應(yīng)的,本發(fā)明實(shí)施例提供了一種任務(wù)棧溢出檢測(cè)裝置,包括空間設(shè) 置單元,用于在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;屬性設(shè)置單元,用于將所述空 間設(shè)置單元設(shè)置的所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性;檢測(cè)單元,用于 檢測(cè)是否有任務(wù)嘗試更改所述屬性設(shè)置單元設(shè)置的所述只讀屬性的數(shù)據(jù)。
本發(fā)明實(shí)施例還提供了 一種計(jì)算機(jī)系統(tǒng),包括本發(fā)明實(shí)施例提供的上述 任務(wù)棧溢出檢測(cè)裝置。
從本發(fā)明實(shí)施例提供的以上技術(shù)方案可以看出,由于本發(fā)明實(shí)施例可以 設(shè)置檢測(cè)空間,并將檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性,從而在有任務(wù)嘗試 更改只讀屬性的數(shù)據(jù)時(shí)可以直接檢測(cè)到任務(wù)棧溢出,而不需要設(shè)置定時(shí)任務(wù)、 或定時(shí)檢測(cè)中斷,因而可以節(jié)省有限的系統(tǒng)資源;同時(shí),由于并不能更改只 讀屬性的數(shù)據(jù),因而在任務(wù)棧溢出后不會(huì)對(duì)其他的任務(wù)棧造成影響,提高系 統(tǒng)的穩(wěn)定性。
圖1為現(xiàn)有技術(shù)中任務(wù)棧分布示意圖2為本發(fā)明實(shí)施例中任務(wù)棧溢出檢測(cè)方法實(shí)施例一的流程示意圖; 圖3為本發(fā)明實(shí)施例中任務(wù)棧分布示意圖4為本發(fā)明實(shí)施例中任務(wù)棧溢出檢測(cè)裝置實(shí)施例一的結(jié)構(gòu)示意圖; 圖5為本發(fā)明實(shí)施例中任務(wù)棧溢出檢測(cè)裝置實(shí)施例二的結(jié)構(gòu)示意圖。
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案、及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并 舉實(shí)施例,對(duì)本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。
圖2描述了本發(fā)明提供的任務(wù)棧溢出檢測(cè)方法實(shí)施例一的流程,包括
步驟201 、在任務(wù)棧的棧頂設(shè)置檢測(cè)空間。
具體的,可以在分配任務(wù)棧時(shí)多分配一些空間作為4企測(cè)空間,也可以在 分配任務(wù)棧后,從任務(wù)棧的棧頂選取部分空間作為4全測(cè)空間;其中,4企測(cè)空 間的大小根據(jù)具體的使用環(huán)境、不同的中央處理器(CPU: Central Process Unit) 類型等會(huì)有不同,因而檢測(cè)空間的大小需要按照具體需要進(jìn)行設(shè)置。
步驟202、將檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性。
本發(fā)明實(shí)施例優(yōu)選通過(guò)存儲(chǔ)器管理單元(MMU: Memory Management Unit)將檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性,所述的MMU可以設(shè)置在CPU 內(nèi),也可以設(shè)置在CPU外,本發(fā)明實(shí)施例優(yōu)選將MMU設(shè)置在CPU內(nèi)。但是 本發(fā)明實(shí)施例并不限定只采用MMU將檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性。
其中,可以只將檢測(cè)空間中的部分?jǐn)?shù)據(jù)設(shè)置為只讀屬性,也可以將檢測(cè) 空間的全部數(shù)據(jù)設(shè)置為只讀屬性。
步驟203、通過(guò)檢測(cè)是否有任務(wù)嘗試更改只讀屬性的數(shù)據(jù),判斷是否有任 務(wù)棧溢出。
如果有任務(wù)嘗試更改只讀屬性的數(shù)據(jù),則說(shuō)明有任務(wù)棧溢出;反之,則 說(shuō)明沒(méi)有任務(wù)棧溢出。
數(shù)據(jù)的屬性設(shè)置為只讀,因而只能讀取其中的數(shù)據(jù),不能對(duì)數(shù)據(jù)進(jìn)行修 改。在任務(wù)棧溢出時(shí),需要寫入相應(yīng)的數(shù)據(jù),由于數(shù)據(jù)為只讀屬性,因而在
任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí),會(huì)產(chǎn)生異常,例如產(chǎn)生CPU的數(shù)據(jù)訪問(wèn)異
常等,從而可以通過(guò)檢測(cè)是否有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)來(lái)判斷是否有 任務(wù)棧溢出。在檢測(cè)到有任務(wù)嘗試更改只讀屬性的數(shù)據(jù),即檢測(cè)到任務(wù)棧溢 出時(shí),就可以觸發(fā)相應(yīng)的后續(xù)操作。
從上可知,本實(shí)施例通過(guò)設(shè)置檢測(cè)空間,并將檢測(cè)空間中的數(shù)據(jù)設(shè)置為 只讀屬性,從而在有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí)可以直接檢測(cè)到任務(wù)棧 溢出,而不需要設(shè)置定時(shí)任務(wù)、或定時(shí)檢測(cè)中斷,因而可以節(jié)省有限的系統(tǒng) 資源;同時(shí),由于并不能更改只讀屬性的數(shù)據(jù),因而在任務(wù)棧溢出后不會(huì)對(duì) 其他的任務(wù)棧造成影響,提高系統(tǒng)的穩(wěn)定性。
在檢測(cè)到有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí),可以觸發(fā)CPU的數(shù)據(jù)訪問(wèn) 異常,通過(guò)數(shù)據(jù)訪問(wèn)異常將嘗試更改只讀屬性的數(shù)據(jù)的任務(wù)掛起,即暫停該 任務(wù),從而中止該任務(wù)對(duì)只讀屬性的數(shù)據(jù)的更改,避免對(duì)其他的任務(wù)棧造成 影響。
由于在有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí),會(huì)觸發(fā)CPU的數(shù)據(jù)訪問(wèn)異常,
因而可以對(duì)CPU數(shù)據(jù)訪問(wèn)異常中斷處理程序進(jìn)行優(yōu)化,使優(yōu)化后的CPU數(shù)據(jù)
訪問(wèn)異常中斷處理程序可以記錄數(shù)據(jù)異常訪問(wèn)時(shí)的任務(wù)標(biāo)識(shí)、和/或嘗試更改 的數(shù)據(jù)的數(shù)據(jù)地址。因此,本發(fā)明實(shí)施例在觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常 后,可以調(diào)用預(yù)置的CPU數(shù)據(jù)訪問(wèn)異常中斷處理程序,記錄任務(wù)的任務(wù)標(biāo)識(shí)、 和/或嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址。
通過(guò)記錄任務(wù)標(biāo)識(shí),在再次為該任務(wù)分配任務(wù)棧時(shí)可以適當(dāng)?shù)脑黾右恍?br>
空間,使再次為該任務(wù)分配的任務(wù)棧不容易溢出,從而提高系統(tǒng)穩(wěn)定性;進(jìn) 一步,通過(guò)記錄嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址,可以具體知道為該任務(wù)分配的 任務(wù)棧的大小,避免造成對(duì)有限的空間資源的浪費(fèi)。
在使用MMU時(shí),本發(fā)明實(shí)施例優(yōu)選將檢測(cè)空間的容量設(shè)置為MMU最 小管理頁(yè)大小的兩倍,但是本發(fā)明實(shí)施例并不限定只將檢測(cè)空間的容量設(shè)置 為MMU最小管理頁(yè)大小的兩倍,例如設(shè)置為2.5倍、三倍或四倍等都不會(huì)影
響本發(fā)明的實(shí)現(xiàn)。假設(shè)MMU最小管理頁(yè)大小為4K字節(jié)(Bytes),則本發(fā)明 實(shí)施例優(yōu)選將檢測(cè)空間的容量設(shè)置為8Kbytes。例如,最小管理頁(yè)大小為4K Bytes, —個(gè)任務(wù)本來(lái)需要的空間大小為7K Bytes,再加上檢測(cè)空間需要的8K Bytes,實(shí)際上分配給該任務(wù)的空間大小應(yīng)該為15KBytes。因而在為任務(wù)棧設(shè) 置了最小管理頁(yè)大小的兩倍容量的檢測(cè)空間時(shí),需要從最小管理頁(yè)大小的兩 倍容量的檢測(cè)空間中,找到是最小管理頁(yè)大小的整數(shù)倍的數(shù)據(jù)地址,該最小 管理頁(yè)的整數(shù)倍的數(shù)據(jù)地址置于檢測(cè)空間的起始地址與中間地址之間;以最 小管理頁(yè)大小的整數(shù)倍的數(shù)據(jù)地址開(kāi)始,將容量為最小管理頁(yè)大小的空間中 的數(shù)據(jù)設(shè)置為只讀屬性。其中,最小管理頁(yè)的整數(shù)倍的數(shù)據(jù)地址置于檢測(cè)空 間的起始地址與中間地址之間,可以在找到最小管理頁(yè)的整數(shù)倍的數(shù)據(jù)地址 后,找到以最小管理頁(yè)的整數(shù)倍的數(shù)據(jù)地址開(kāi)始的空間,該空間的容量為最 小管理頁(yè)大小。以最小管理頁(yè)大小為4K為例,例如本來(lái)應(yīng)該為一個(gè)任務(wù)棧分 配的空間大小為25K Bytes,分配的地址空間從0 25K,此時(shí)為該任務(wù)棧分配 的檢測(cè)空間為8K,地址空間從25K 33K,由于MMU的要求,在設(shè)置檢測(cè)空 間的數(shù)據(jù)為只讀屬性時(shí),可以選4奪將從地址為28K開(kāi)始的4K Bytes大小的空 間內(nèi)的數(shù)據(jù)設(shè)置為只讀屬性,即將地址空間從28K 32K內(nèi)的數(shù)據(jù)設(shè)置為只讀 屬性。
以下舉具體的實(shí)施例對(duì)本發(fā)明實(shí)施例提供的任務(wù)棧溢出檢測(cè)方法進(jìn)行描 述,如圖3所示,描述了兩個(gè)任務(wù)(任務(wù)1和任務(wù)2)的任務(wù)棧的情況在為 任務(wù)1和任務(wù)2分配的任務(wù)棧的棧底為任務(wù)首地址,任務(wù)首地址上是為任務(wù) 棧分配狀態(tài)寄存器,用于保存現(xiàn)場(chǎng)數(shù)據(jù),在任務(wù)棧的棧頂設(shè)定了相應(yīng)的檢測(cè) 空間301。
在任務(wù)??臻g分配時(shí),為每個(gè)任務(wù)棧多分配MMU最小管理頁(yè)大小的兩 倍大小的空間;例如設(shè)置為4K Bytes*2=8K Bytes;
通過(guò)MMU將此兩倍頁(yè)空間大小中間頁(yè)起始地址的數(shù)據(jù)設(shè)置成只讀;
優(yōu)化CPU數(shù)據(jù)訪問(wèn)異常中斷處理程序,增加記錄異常訪問(wèn)時(shí)的數(shù)據(jù)地址 和任務(wù)標(biāo)識(shí);
當(dāng)有任務(wù)的任務(wù)棧發(fā)生越界,即溢出時(shí)時(shí),將觸發(fā)CPU的數(shù)據(jù)訪問(wèn)異常, 使用數(shù)據(jù)訪問(wèn)異常中斷處理程序可以記錄發(fā)生異常的任務(wù)標(biāo)識(shí)和異常訪問(wèn)時(shí) 的數(shù)據(jù)地址。
從上可知,通過(guò)設(shè)置檢測(cè)空間,并將檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性, 可以在有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí)直接檢測(cè)到任務(wù)棧溢出,而不需要
設(shè)置定時(shí)任務(wù)、或定時(shí)檢測(cè)中斷,因而可以節(jié)省有限的系統(tǒng)資源;同時(shí),由 于并不能更改只讀屬性的數(shù)據(jù),因而在任務(wù)棧溢出能夠起到預(yù)防的作用,不 會(huì)對(duì)其他的任務(wù)棧造成影響,提高系統(tǒng)的穩(wěn)定性。
在CPU為MPC8260、實(shí)時(shí)操作系統(tǒng)為vxWorks5.5的系統(tǒng)中
1、 需要保護(hù)的關(guān)鍵任務(wù)創(chuàng)建時(shí)在原有任務(wù)堆棧需求增加8k (假設(shè)MMU 最小管理頁(yè)空間為4k)大小空間;
2、 通過(guò)vxWorks的vmBaseLib庫(kù)中的vmBaseStateSet函數(shù)把中間中8k 空間中4k開(kāi)始處的空間設(shè)置成只讀;
假設(shè)該任務(wù)創(chuàng)建在之后的任務(wù)棧的棧頂?shù)刂窞閜TaskTcbl = 0x3000;可 以通過(guò)如下的描述進(jìn)行上述設(shè)置;
#include "vmlib.h"
int g—vmChangeBase = 0x3000 - 0x1000; int g—vmChangeLen = 0x1000;
int g—vmStateMasl^VM—STATE—MASKVALIDIM STATE—MASK—WRTIABLE; int g—vmState = VM—STATE—VALID | VM_STATE_WRITABLE—NOT; void testProtectTaskStack (void)
{
int Result;
Result = vmBaseStateSet (NULL, g—vmChangeBase, g一vmChangeLen, g—vmStateMasK g—vmState);if (OK != Result)
printf ("Error protect task's stack \r\n");
3、當(dāng)任務(wù)棧被修改時(shí),將觸發(fā)8260CPU的數(shù)據(jù)訪問(wèn)異常,從而起到任 務(wù)棧溢出的檢測(cè)和預(yù)防作用;
可以在串口或者shell下輸入
-> testProtectTaskStack
-> m 0x2000
00002000: 1234-5678
進(jìn)行測(cè)試,在輸入后將觸發(fā)以下異常
data access
Exception current instruction address: 0x000b6e00
Machine Status Register: 0x00009030
Data Access Register: 0x00002000
Condition Register: 0x42400080
Data storage interrupt Register: 0x00009030
d01ec vxTaskEntry +5c : shell 0
98da8 shell +180:98dd4()
98fe4 shell +3bc: execute 0
99164 execute +d4 : yyparse 0
f75c4yyparse +790: f5580 ()
f56fD yystart +878: m (0)
shell restarted.
從上面的描述可以知道任務(wù)(shell)非法訪問(wèn)了 0x00002000處的地址, 由于觸發(fā)了 CPU數(shù)據(jù)訪問(wèn)異常,拒絕了任務(wù)(shell)的訪問(wèn),起到了任務(wù)棧 溢出的檢測(cè)和預(yù)防作用。
本發(fā)明實(shí)施例還提供了任務(wù)棧溢出檢測(cè)裝置,圖4描述了本發(fā)明提供的 任務(wù)棧溢出檢測(cè)裝置實(shí)施例一的結(jié)構(gòu),包括
空間設(shè)置單元401,用于在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;
屬性設(shè)置單元402,用于將空間設(shè)置單元401設(shè)置的檢測(cè)空間中的數(shù)據(jù) 設(shè)置為只讀屬性;
檢測(cè)單元403,用于檢測(cè)是否有任務(wù)嘗試更改屬性設(shè)置單元402設(shè)置的 只讀屬性的數(shù)據(jù)。
從上可知,本實(shí)施例通過(guò)設(shè)置檢測(cè)空間,并將檢測(cè)空間中的數(shù)據(jù)設(shè)置為 只讀屬性,從而在有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí)可以直接檢測(cè)到任務(wù)棧 溢出,而不需要設(shè)置定時(shí)任務(wù)、或定時(shí)檢測(cè)中斷,因而可以節(jié)省有限的系統(tǒng) 資源;同時(shí),由于并不能更改只讀屬性的數(shù)據(jù),因而在任務(wù)棧溢出后不會(huì)對(duì) 其他的任務(wù)棧造成影響,提高系統(tǒng)的穩(wěn)定性。
本發(fā)明實(shí)施例提供的任務(wù)棧溢出檢測(cè)裝置還可以包括處理單元,用于在 檢測(cè)單元403檢測(cè)到有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí),觸發(fā)中央處理器的 數(shù)據(jù)訪問(wèn)異常,中止任務(wù)對(duì)只讀屬性的數(shù)據(jù)的更改;從而避免對(duì)其他任務(wù)的 任務(wù)棧造成影響。
本發(fā)明提供的任務(wù)棧溢出檢測(cè)裝置實(shí)施例二如圖5所示,包括
空間設(shè)置單元401,用于在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;
屬性設(shè)置單元402,用于將空間設(shè)置單元401設(shè)置的檢測(cè)空間中的數(shù)據(jù) 設(shè)置為只讀屬性;
檢測(cè)單元403,用于檢測(cè)是否有任務(wù)嘗試更改屬性設(shè)置單元402設(shè)置的 只讀屬性的數(shù)據(jù);
處理單元404,用于在檢測(cè)單元403檢測(cè)到有任務(wù)嘗試更改只讀屬性的數(shù)據(jù)時(shí),觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常,中止任務(wù)對(duì)只讀屬性的數(shù)據(jù)的更
改;從而ik免對(duì)其他任務(wù)的任務(wù)棧造成影響;
記錄單元405,用于在處理單元404觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常后, 調(diào)用預(yù)置的中央處理器數(shù)據(jù)訪問(wèn)異常中斷處理程序,記錄任務(wù)的任務(wù)標(biāo)識(shí)、 和/或嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址。
本實(shí)施例可以進(jìn)一步記錄任務(wù)的任務(wù)標(biāo)識(shí)、和/或嘗試更改的數(shù)據(jù)的數(shù)據(jù) 地址,通過(guò)記錄任務(wù)標(biāo)識(shí),可以在再次為該任務(wù)分配任務(wù)棧時(shí)可以適當(dāng)?shù)脑?加一些空間,使再次為該任務(wù)分配的任務(wù)棧不容易溢出,從而提高系統(tǒng)穩(wěn)定 性;進(jìn)一步,通過(guò)記錄嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址,可以具體知道為該任務(wù) 分配的任務(wù)棧的大小,避免造成對(duì)有限的空間資源的浪費(fèi)。
本發(fā)明實(shí)施例還提供了 一種計(jì)算機(jī)系統(tǒng),該計(jì)算機(jī)系統(tǒng)包括本發(fā)明實(shí)施 例所提供的任務(wù)棧溢出檢測(cè)裝置。上述的計(jì)算機(jī)系統(tǒng)可以是個(gè)人電腦、移動(dòng) 通信終端、通信系統(tǒng)中的單板等。
柳
々貝二
是可以通過(guò)程序來(lái)指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī) 可讀存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),包括如下步驟
在任務(wù)棧的棧頂設(shè)置檢測(cè)空間; 將所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性; 檢測(cè)是否有任務(wù)嘗試更改所述只讀屬性的數(shù)據(jù)。 上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等。
以上對(duì)本發(fā)明實(shí)施例所提供的一種任務(wù)棧溢出檢測(cè)方法、裝置及計(jì)算機(jī) 系統(tǒng)進(jìn)行了詳細(xì)介紹,以上實(shí)施例的說(shuō)明只是用于幫助理解本發(fā)明的方法及 其思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí) 施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說(shuō)明書內(nèi)容不應(yīng)理解為 對(duì)本發(fā)明的限制。
權(quán)利要求
1、一種任務(wù)棧溢出檢測(cè)方法,其特征在于,包括在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;將所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性;通過(guò)檢測(cè)是否有任務(wù)嘗試更改所述只讀屬性的數(shù)據(jù),判斷是否有任務(wù)棧溢出。
2、 如權(quán)利要求1所述的任務(wù)棧溢出檢測(cè)方法,其特征在于,檢測(cè)到有任 務(wù)嘗試更改所述只讀屬性的數(shù)據(jù),該方法進(jìn)一步包括觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常,中止所述任務(wù)對(duì)所述只讀屬性的數(shù)據(jù) 的更改。
3、 如權(quán)利要求2所述的任務(wù)棧溢出檢測(cè)方法,其特征在于,觸發(fā)中央處 理器的數(shù)據(jù)訪問(wèn)異常后,該方法進(jìn)一步包括調(diào)用預(yù)置的中央處理器數(shù)據(jù)訪問(wèn)異常中斷處理程序,記錄所述任務(wù)的任 務(wù)標(biāo)識(shí)、和/或嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址。
4、 如權(quán)利要求1至3任一所述的任務(wù)棧溢出檢測(cè)方法,其特征在于,使 用存儲(chǔ)器管理單元將所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性。
5、 如權(quán)利要求4所述的任務(wù)棧溢出檢測(cè)方法,其特征在于,所述在任務(wù) 棧的棧頂設(shè)置檢測(cè)空間的步驟包括將所述檢測(cè)空間的容量設(shè)置為所述存儲(chǔ)器管理單元最小管理頁(yè)大小的至 少兩倍。
6、 如權(quán)利要求5所述的任務(wù)棧溢出檢測(cè)方法,其特征在于,所述將所述 檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性的步驟包括從所述容量為最小管理頁(yè)大小的兩倍的檢測(cè)空間中,找到是所述最小管 理頁(yè)大小的整數(shù)倍的數(shù)據(jù)地址,所述最小管理頁(yè)大小的整數(shù)倍的數(shù)據(jù)地址置 于所述才全測(cè)空間的起始地址到中間地址之間;以所述最小管理頁(yè)大小的整數(shù)倍的數(shù)據(jù)地址開(kāi)始,將容量為所述最小管理頁(yè)大小的空間的數(shù)據(jù)設(shè)置為只讀屬性。
7、 一種任務(wù)棧溢出檢測(cè)裝置,其特征在于,包括空間設(shè)置單元,用于在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;屬性設(shè)置單元,用于將所述空間設(shè)置單元設(shè)置的所述檢測(cè)空間中的數(shù)據(jù) 設(shè)置為只讀屬性;檢測(cè)單元,用于檢測(cè)是否有任務(wù)嘗試更改所述屬性設(shè)置單元設(shè)置的所述 只讀屬性的數(shù)據(jù)。
8、 如權(quán)利要求7所述的任務(wù)棧溢出檢測(cè)裝置,其特征在于,還包括處理單元,用于在所述檢測(cè)單元檢測(cè)到有任務(wù)嘗試更改所述只讀屬性的 數(shù)據(jù)時(shí),觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常,中止所述任務(wù)對(duì)所述只讀屬性的 數(shù)據(jù)的更改。
9、 如權(quán)利要求8所述的任務(wù)棧溢出檢測(cè)裝置,其特征在于,還包括記錄單元,用于在所述處理單元觸發(fā)中央處理器的數(shù)據(jù)訪問(wèn)異常后,調(diào) 用預(yù)置的中央處理器數(shù)據(jù)訪問(wèn)異常中斷處理程序,記錄所述任務(wù)的任務(wù)標(biāo)識(shí)、 和/或嘗試更改的數(shù)據(jù)的數(shù)據(jù)地址。
10、 一種計(jì)算機(jī)系統(tǒng),其特征在于,包括如權(quán)利要求7至9任一所述的 任務(wù)棧溢出檢測(cè)裝置。
全文摘要
本發(fā)明涉及堆棧處理技術(shù),公開(kāi)了一種任務(wù)棧溢出檢測(cè)方法、裝置及計(jì)算機(jī)系統(tǒng),其中任務(wù)棧溢出檢測(cè)方法包括在任務(wù)棧的棧頂設(shè)置檢測(cè)空間;將所述檢測(cè)空間中的數(shù)據(jù)設(shè)置為只讀屬性;通過(guò)檢測(cè)是否有任務(wù)嘗試更改所述只讀屬性的數(shù)據(jù),判斷是否有任務(wù)棧溢出。使用本發(fā)明實(shí)施例提供的技術(shù)方案,不需要啟動(dòng)額外的定時(shí)檢測(cè)任務(wù)或定時(shí)檢測(cè)中斷對(duì)任務(wù)棧溢出進(jìn)行檢測(cè),可以節(jié)省有限的系統(tǒng)資源。
文檔編號(hào)G06F11/36GK101183331SQ20071017238
公開(kāi)日2008年5月21日 申請(qǐng)日期2007年12月12日 優(yōu)先權(quán)日2007年12月12日
發(fā)明者崔愛(ài)國(guó) 申請(qǐng)人:上海華為技術(shù)有限公司