国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種任務棧溢出的監(jiān)測方法

      文檔序號:6560913閱讀:233來源:國知局
      專利名稱:一種任務棧溢出的監(jiān)測方法
      技術領域
      本發(fā)明涉及內存管理,特別涉及一種任務棧溢出的監(jiān)測方法。
      技術背景一般而言,每個任務或線程都有自己獨立的棧(stack)空間,用于分配 任務或線程內局部變量占用的內存,保存任務或線程運行時的函數(shù)調用信息 以及任務或線程切換時的上下文信息。在一些實時操作系統(tǒng)中,如VxWorks、 OSE等,為了提高系統(tǒng)效率,通 常不進行虛擬內存管理,所有任務(包括內核)共享同一物理地址空間,任 務之間沒有地址保護機制。從而使任務切換時不需要進行虛擬地址空間切換, 任務間可以直接共享變量,不需要通過內核在不同的地址空間之間復制數(shù)據(jù), 并且系統(tǒng)調用時不需要在核心態(tài)和用戶態(tài)之間切換,相當于直接的函數(shù)調用。但是由于所有的任務均在同一物理地址空間上運行,任務棧大小的設置 必須合理。太大會浪費內存空間,太小時可能會引起棧溢出。而棧溢出又會 引起連鎖反應,出現(xiàn)紛繁復雜的異常現(xiàn)象。如圖1所示,由于任務A的棧溢出,導致任務B棧中的內容被改寫。若 改寫的是任務B內局部變量,則可能造成地址訪問異常,若改寫的是任務B 的函數(shù)調用指針信息,則可能造成指令訪問異常。即任務A棧溢出,表現(xiàn)出 來的現(xiàn)象卻是任務B異常,嚴重干擾了問題的分析和定位。為了避免棧溢出, 一般會先憑經(jīng)驗預估每個任務所需的棧空間的大小, 再根據(jù)測試反饋的結果去進行修正。但是無論是白箱測試,還是黑箱測試, 代碼的覆蓋率均不可能達到100%,即總存在未測試到的分支。如果任務的各 種邊界條件以及可能引發(fā)的最深嵌套調用情況無法一一測到,則存在在產(chǎn)品 階段出現(xiàn)任務棧溢出的可能性。因此,即使在進入產(chǎn)品階段,很多嵌入式設 備仍會采用一些方案對任務棧的使用情況進行監(jiān)測,以利于出現(xiàn)故障時的診 斷及定位。
      現(xiàn)有技術中,任務桟溢出監(jiān)測通常采用兩種方法是方法一,在任務切換鉤子(Hook)函數(shù)中,查詢發(fā)生切換時棧的使用情況。即由任務A切換到任務B時,查詢任務A棧的使用情況,如果任務A 的棧溢出,則將任務A掛起,并以任務B的身份,構造告警消息,上報管理 站。方法二,創(chuàng)建一個監(jiān)測任務,該任務每隔一段時間,定時査詢相關任務 棧的使用情況。如果檢測到某個任務棧溢出,則將該任務掛起,并以監(jiān)測任 務的身份,構造告警消息,上報管理站。在上述的方法中,判斷任務棧溢出的常用方法是記錄任務棧的使用峰值, 若使用峰值越界,即使用峰值超過了任務棧的邊界,則判定棧溢出??梢钥闯觯捎蒙鲜龅谋O(jiān)測方法,當監(jiān)測到任務桟溢出時錯誤已經(jīng)產(chǎn)生, 并很有可能已經(jīng)對其它的任務的內存空間造成破壞。其次,無論是任務切換 時檢測任務棧溢出還是定時檢測任務棧溢出,都不能保證當任務棧溢出被實 時發(fā)現(xiàn),從而進行相應的后續(xù)處理以防止錯誤繼續(xù)。而且會因為任務棧的溢 出而使進行任務棧溢出監(jiān)測的任務本身收到破壞,而無法實現(xiàn)正常的監(jiān)測功 能。發(fā)明內容本發(fā)明要解決的一個技術問題是提供一種任務棧溢出的監(jiān)測方法,通過 該方法,可以及時檢測到任務棧的溢出,并防止由于任務棧溢出而對其它任 務造成破壞。本發(fā)明提供的任務棧溢出的監(jiān)測方法,應用于靜態(tài)分配的任務棧,包括如下步驟A,確定一位于任務棧末端區(qū)域的內存空間,將其設置為只讀屬性; B,監(jiān)聽操作系統(tǒng)的地址訪問異常中斷;C,當監(jiān)聽到地址訪問異常中斷時,判斷產(chǎn)生地址訪問異常中斷的任務是 否棧溢出。其中,步驟A可以包括如下步驟A21,從任務棧的末端區(qū)域確定一首地址、大小為頁表尺寸整數(shù)倍的內 存空間; A22,將步驟A21中確定的內存空間進行頁表映射,并將該頁表設置為 只讀屬性。 或者,任務棧位于系統(tǒng)內存中的靜態(tài)數(shù)據(jù)區(qū),步驟A可以包括如下步驟-A31,確定任務棧末端區(qū)域一指定大小的內存空間; A32,將步驟A31中確定的內存空間作為數(shù)據(jù)段設置為只讀屬性。 進一步,步驟B包括如下步驟-設置任務異常鉤子函數(shù),通過任務異常鉤子函數(shù)監(jiān)聽地址訪問異常中斷。 或者設置中斷服務程序,通過對應于地址訪問異常中斷的中斷服務程序監(jiān)聽 地址訪問異常中斷。判斷產(chǎn)生地址訪問異常中斷的任務的棧指針是否達到棧的頂部,如果是, 則判定棧溢出,否則,判定棧沒有溢出。進一步,在判定任務棧溢出后,還可以包括步驟獲取該任務的當前信息,保存當前信息或者構造告警消息上報管理站。上述任務的當前信息可以保存于不易失內存或者文件中,并包括如下信息任務名稱、寄存器信息和任務棧內函數(shù)調用信息。而寄存器信息包括程序指針、控制寄存器指針、機器狀態(tài)寄存器指針、棧指針、數(shù)據(jù)訪問寄存器 指針。進一步,在判定任務棧溢出后,還可以包括步驟 重新啟動發(fā)生棧溢出的任務。通過本發(fā)明提供的任務棧溢出的監(jiān)測方法,在任務棧的末端區(qū)域設置只 讀屬性的隔離區(qū),并監(jiān)聽操作系統(tǒng)的地址訪問異常中斷。當任務棧發(fā)生溢出 時,將對任務棧內的只讀屬性的隔離區(qū)進行寫操作,導致操作系統(tǒng)產(chǎn)生地址 訪問異常中斷,該地址訪問異常中斷將被監(jiān)聽到并進一步判斷任務棧是否發(fā) 生溢出。所以任務棧溢出可以被及時發(fā)現(xiàn),而且不會因為破壞棧之外的內存 空間而對別的任務造成破壞。發(fā)生棧溢出的任務當前信息的保存,有助于問 題的分析和定位。在監(jiān)測到任務棧溢出時,通過將該任務重新啟動,減小了 對其后續(xù)處理流程的影響,增強了具備此功能產(chǎn)品的競爭力。


      圖1所示為現(xiàn)有技術中任務棧溢出情況的示意圖; 圖2所示為本發(fā)明的一種任務棧溢出監(jiān)測方法的流程圖。
      具體實施方式
      本發(fā)明的基本思想是,在任務棧的末端區(qū)域確定一段內存區(qū)域并將其設 置為只讀屬性,作為任務棧與其它內存區(qū)域的隔離區(qū);并利用操作系統(tǒng)的如 下特點當操作系統(tǒng)發(fā)現(xiàn)存在"試圖"對只讀屬性的內存區(qū)域進行寫操作時, 就產(chǎn)生一個地址訪問異常中斷,對任務棧的溢出進行監(jiān)測并進行相應的處理。 如圖2所示,本發(fā)明的一種任務棧溢出的監(jiān)測方法,包括如下步驟-步驟201,確定一位于任務棧末端區(qū)域的內存空間,將其設置為只讀屬性。操作系統(tǒng)從系統(tǒng)內存中為任務分配任務棧需要的內存空間。在現(xiàn)有技術 中,實時操作系統(tǒng)的系統(tǒng)內存一般包含靜態(tài)數(shù)據(jù)區(qū)和動態(tài)數(shù)據(jù)區(qū)。在一些實 時操作系統(tǒng),如VxWoks、 pSOS中,動態(tài)數(shù)據(jù)區(qū)包含分別用于堆和棧的區(qū)域。 在這些系統(tǒng)中,用于任務棧的內存空間,既可以從靜態(tài)數(shù)據(jù)區(qū)中分配,又可 以從動態(tài)數(shù)據(jù)區(qū)用于棧的區(qū)域中分配。而在另外一些實時操作系統(tǒng),如OSE、 Pharos中,動態(tài)數(shù)據(jù)區(qū)只有用于堆的區(qū)域,沒有用于棧的區(qū)域。在這些系統(tǒng) 中,用于任務棧的內存空間只能從靜態(tài)數(shù)據(jù)區(qū)中分配。操作系統(tǒng)為從靜態(tài)數(shù)據(jù)區(qū)或者動態(tài)數(shù)據(jù)區(qū)分配任務棧的內存空間提供 API函數(shù)。例如,通過名稱為tasklnit的函數(shù)來創(chuàng)建任務,該函數(shù)的原型為: int tasklnit(WIND一TCB * pTcb, char *name,int priority, int options, char *pStackBase, int stackSize, FUNGPTR entryPt, intargl,);其中,參數(shù)name是該任務的名稱,參數(shù)pStackBase是為任務棧指定的 基地址,參數(shù)stackSize以字節(jié)為單位,是指定的任務棧內存空間的大小。如 果參數(shù)pStackBase指定的地址位于靜態(tài)數(shù)據(jù)區(qū),則操作系統(tǒng)將從靜態(tài)數(shù)據(jù)區(qū) 中為該任務棧分配需要的內存空間。如果參數(shù)pStackBase指定的地址位于動 態(tài)數(shù)據(jù)區(qū),則操作系統(tǒng)將從動態(tài)數(shù)據(jù)區(qū)中為該任務棧分配需要的內存空間?;蛘?,也可以通過名稱為taskSpawn的函數(shù)創(chuàng)建任務。對于通過調用該 函數(shù)創(chuàng)建的任務,操作系統(tǒng)為該任務棧從動態(tài)數(shù)據(jù)區(qū)中分配其所需要的內存 空間,該函數(shù)的原型為int taskSpawn(char *name, int priority , int options , int stackSize, FUNCPTR entiyPt, intargl,…);其中,參數(shù)name是該任務的名稱,參數(shù)stackSize以字節(jié)為單位,是指 定的內存空間的大小(該內存空間包括該任務棧需要內存空間和存儲該任務 名稱需要的空間)。在任務棧的內存空間已經(jīng)分配的情況下,可以通過操作系統(tǒng)提供的API 函數(shù)獲得任務棧的首地址等信息,并獲得任務棧的大小。一種在任務棧中確定一段內存空間并將該空間設置為只讀屬性的方法 是,在任務棧的末端區(qū)域選擇一段大小為系統(tǒng)頁表(page)尺寸整數(shù)倍、且 首地址與頁表尺寸對齊的內存區(qū)域。然后對選定的內存區(qū)域進行頁表映射, 并將該頁表設置為只讀屬性。該方法適用于在系統(tǒng)內存的靜態(tài)數(shù)據(jù)區(qū)和動態(tài) 數(shù)據(jù)區(qū)為任務棧分配的內存空間。另外一種在任務棧中確定一段內存空間并將其設置為只讀屬性的方法, 應用于為任務棧分配的內存空間位于靜態(tài)數(shù)據(jù)區(qū)的情況。該方法在任務棧的 末端區(qū)域選擇一段內存空間,對該內存空間的首地址和大小沒有限制。其大 小可以為1個字節(jié)、或一個頁表大小或更多,也不需要限定為頁表大小的整 數(shù)倍。然后對選定的內存空間作為數(shù)據(jù)段進行保護,設置為只讀屬性。通常來說,棧是從高地址往低地址方向變化的,表現(xiàn)為一種線形結構。 所以,上述任務棧的"末端區(qū)域",指的是任務棧中靠近最低地址的部分。 雖然從節(jié)省內存空間的角度,上述作為隔離區(qū)的內存區(qū)域最好位于棧的最低 內存地址部分,但是,即使最低地址的內存不包含在隔離區(qū)內,也可以實現(xiàn) 本發(fā)明的方法。步驟202,監(jiān)聽操作系統(tǒng)的地址訪問異常中斷。由于已經(jīng)在任務棧的末端區(qū)域設置了只讀屬性的內存空間,當任務棧溢 出時,必然對任務棧的上述只讀屬性的內存空間進行寫操作,而一旦對只讀 屬性的內存空間進行寫操作,操作系統(tǒng)就會產(chǎn)生一個地址訪問異常中斷。所 以,可以通過監(jiān)聽操作系統(tǒng)的地址訪問異常中斷來捕獲任務棧的溢出事件。一種實現(xiàn)監(jiān)聽操作系統(tǒng)的地址訪問異常中斷的方法是通過任務異常鉤子 函數(shù)來實現(xiàn)。
      首先,需要提供任務異常鉤子函數(shù)。假定任務異常鉤子函數(shù)名為excepHook,其函數(shù)的原型可以定義如下-void excepHook (inttask, intvecNum, ESFxx*pEsf);其中,參數(shù)task用于指定產(chǎn)生異常的任務標識(ID),參數(shù)vecNum是產(chǎn) 生異常的中斷向量,而參數(shù)pEsf是指向產(chǎn)生異常時的寄存器信息的指針。excepHook函數(shù)執(zhí)行的功能包括,對異常中斷向量進行判斷,是否為地 址訪問異常中斷,如果是,則獲得與任務標識對應的任務,并進一步判定該 任務的棧是否發(fā)生溢出。其次,調用系統(tǒng)的鉤子安裝函數(shù)安裝任務異常鉤子函數(shù)。例如在VxWorks 操作系統(tǒng)中,可以調用鉤子安裝函數(shù)void excHookAdd (FUNCPTR excepHook)將任務異常鉤子函數(shù)添加到系統(tǒng)中。當一個任務棧溢出時,會對設置為只讀屬性的內存空間進行寫操作,觸 發(fā)操作系統(tǒng)產(chǎn)生一個地址訪問異常中斷,通常地址訪問異常中斷向量對應于 0x300,操作系統(tǒng)將自動調用用戶安裝的任務異常鉤子函數(shù)excepHook,并將 任務的標識、異常中斷向量,以及當前寄存器指針作為輸入?yún)?shù)傳遞給 excepHook。從而實現(xiàn)對地址訪問異常中斷的監(jiān)聽。另外一種實現(xiàn)監(jiān)聽操作系統(tǒng)的地址訪問異常中斷的方法是通過中斷服務 程序來實現(xiàn)。首先,需要提供中斷服務程序(ISR)。假定中斷服務程序名為IntRoutine。 中斷服務程序執(zhí)行的功能包括首先先清空該中斷事件,若不清空該中 斷事件,則退出中斷服務程序后,會再次進入,造成無法響應低優(yōu)先級別的 中斷,以及所有的任務均無法獲得運行機會。清空中斷事件一般通過對中斷 寄存器的相關比特位進行讀/寫操作來完成。有些處理器是采用的讀取寄存器 的值,就立即清空的方式。有些處理器是采用的將寄存器寫0或者寫1清空 的方式。然后査詢所有任務的狀態(tài),若某個任務的狀態(tài)為掛起(suspend), 并且其任務控制塊(TCB)中記錄的棧指針(SP)達到棧頂部,則判定此任 務的棧溢出。需要注意的是,為避免對任務棧溢出的重復檢測,可以對已經(jīng) 發(fā)現(xiàn)棧溢出且處于掛起狀態(tài)沒有恢復的任務進行記錄,如果一個任務已經(jīng)被 記錄了,則可以不將該任務作為觸發(fā)地址訪問異常的任務的候選。
      其次,安裝中斷服務程序。如調用intConnect (int IntVect, FUNCPTR IntRoutine, char* Arg),其中第一個參數(shù)為中斷向量號,第二個參數(shù)為中斷 服務程序入口函數(shù)地址,第三個參數(shù)為傳遞給中斷服務程序入口函數(shù)的參數(shù)。這樣,每當產(chǎn)生地址訪問異常中斷后,都將調用安裝的中斷服務程序, 從而實現(xiàn)對地址訪問異常中斷的監(jiān)聽。步驟203,當監(jiān)聽到地址訪問異常中斷時,判斷對應的任務的棧是否發(fā) 生溢出。通過上述步驟的設置,在系統(tǒng)發(fā)生地址訪問異常中斷時,都將被監(jiān)聽到 并進行后續(xù)的處理,下面分別對應于任務異常鉤子函數(shù)和中斷服務程序進行 介紹。對于任務異常鉤子函數(shù),正如上面所介紹的,將同時獲得任務的標識, 從而可以確定發(fā)生地址訪問異常中斷的任務。但是,也可能該任務的地址訪 問異常不是由于棧溢出導致的,而是對其他內存操作產(chǎn)生的。為了進一步確 定該地址訪問異常是由于任務棧溢出導致的,可以檢查任務控制塊中記錄的 棧指針達到棧頂部,如果是,則判定任務棧溢出,否則,則不是任務棧溢出。對于中斷服務程序,正如上面對其功能所介紹的,將通過査詢任務的狀 態(tài)和棧指針確定發(fā)生棧溢出的任務。在上述對本發(fā)明方法的描述中,作為任務棧隔離區(qū)的內存空間是在任務 棧分配好之后選定的。但是,由于在創(chuàng)建任務的函數(shù)中可以指定任務棧的大 小以及一些其它信息,所以,可以在創(chuàng)建任務前就根據(jù)需要設立隔離區(qū)內存 空間來確定需要的任務棧的大小。例如,如果準備采用頁表映射的方法來對 任務棧內的作為隔離區(qū)的內存空間進行只讀保護,則可以通過如下的步驟確 定任務棧的大小以及作為隔離區(qū)的內存空間首先,將用戶指定的任務棧的大小向上取整,調整為頁表尺寸的整數(shù)倍。 例如,用戶指定的棧大小為5K字節(jié),而一個頁表大小為4K字節(jié),則將該任 務的棧大小調整為8K字節(jié)。其次,將調整后的任務棧大小再加上一個頁表尺寸的大小作為新的任務 棧的大小,然后根據(jù)新的任務棧的大小分配內存pAddress,并且將pAddress按照頁表尺寸對齊。也就是說分配內存時多分配一個頁表尺寸大小的空間。
      最后,將多分配的一個頁表尺寸大小的空間進行頁表映射,將該頁表設 置為只讀屬性。通過上述步驟確定的任務棧的內存空間,既滿足了任務運行的需要,又 考慮到了在任務棧中設立隔離內存空間需要的內存,從而內存分配更合理。對內存區(qū)域進行頁表映射,需要啟動系統(tǒng)的虛擬內存管理功能。由于實 時操作系統(tǒng)支持僅對部分內存空間進行"虛擬"內存管理,并且內存管理單元(MMU)支持在映射時將虛擬內存和物理內存的編址范圍保持一致。這樣 就可以做到既不產(chǎn)生地址沖突,同時在一定程度上提高內存映射的效率,從 而提高了系統(tǒng)處理的性能。在判定任務棧溢出后,還可以包括如下的步驟-獲取發(fā)生棧溢出的任務的當前信息。任務的當前信息可以包括任務名稱、 寄存器信息以及當前函數(shù)調用信息。對于使用任務異常鉤子函數(shù)的情況,任務標識、異常中斷向量,以及當 前寄存器指針作為輸入?yún)?shù)傳遞給excepHook。而對于使用中斷服務程序的 情況,任務標識和寄存器信息是從是從TCB中獲取得到。在獲得任務標識和 寄存器信息后,可以進一步獲得任務的其它當前信息。例如,通過調用函數(shù) taskName(inttask)獲取任務標識所對應的任務的名稱。通過當前寄存器指針, 進一步獲取程序指針、控制寄存器指針、機器狀態(tài)寄存器指針、堆棧指針、 數(shù)據(jù)訪問寄存器指針等寄存器信息。通過調用函數(shù)trcStack(REG—SET *pregs, FUNCPTRtracelog, inttask),以寄存器指針和任務標識為參數(shù),解析棧溢出 前的函數(shù)調用信息。獲得任務的當前信息后,可以將這些信息進行保存??梢詫⑷蝿盏漠斍?信息保存在高端內存中或者以文件的方式保存。由于高端內存通常為不易失 內存,這樣在系統(tǒng)重啟后,高端內存的內容仍會保留,從而用于問題的分析 與定位。在中斷服務程序退出前,需要再次使能該中斷。為了對任務棧溢出后進行進一步的處理,可以運行一異常處理任務。異常處理任務平時處于阻塞狀態(tài),可以通過計數(shù)信號量或者發(fā)送消息將其激活。 任務異常鉤子函數(shù)或者中斷服務程序通過設置計數(shù)信號量或者發(fā)送消息將其 激活。對于中斷服務程序,是不允許以阻塞的方式發(fā)送消息,必須發(fā)出消息 后立即返回,這樣才不會影響其他的處理。該異常處理任務運行后將棧溢出 的任務重啟。即先刪除該任務后再重新創(chuàng)建該任務。在重新創(chuàng)建該任務時, 為避免內存泄漏,可以不為重啟的任務分配新的??臻g,而是使用刪除前為 該任務分配的??臻g,但需要將棧內的內容清空。異常處理任務也可以在重新啟動該任務前首先構造告警消息上報管理站。但是,有時并不需要所有的任務在發(fā)生異常時都重新啟動。為了提供更 多的靈活性,可以根據(jù)任務的重要性來為其設置不同的重新啟動門限值。管 理站在收到該任務的告警消息后,根據(jù)該任務的重新啟動門限值,來決定是 否允許該任務重啟,并將決定結果通知異常處理任務。異常處理任務在收到 管理站的通知后,根據(jù)其決定結果進行相應的處理,如果需要重新啟動該任 務,則重新啟動。由于異常處理任務僅執(zhí)行上述的操作,其分支在測試中可以全部遍歷, 從而能夠準確的獲得其任務棧需要的內存空間,在分配了足夠大的??臻g后,其自身產(chǎn)生棧溢出的概率為o。由上面的描述可以看出,本發(fā)明提供的任務棧溢出的監(jiān)測方法,在任務 棧的末端區(qū)域設置只讀屬性的隔離區(qū),并監(jiān)聽操作系統(tǒng)的地址訪問異常中斷。 當任務棧發(fā)生溢出時,將對任務桟內的只讀屬性的隔離區(qū)進行寫操作,導致 操作系統(tǒng)產(chǎn)生地址訪問異常中斷,該地址訪問異常中斷將被監(jiān)聽到并進一步 判斷任務棧是否發(fā)生溢出。所以任務棧溢出時,可以被及時發(fā)現(xiàn)。而且該錯 誤并未對別的任務造成破壞。由于在任務的棧之間設置只讀區(qū)域進行隔離, 某個任務的堆棧溢出,不會造成連鎖反應,引起相鄰的一個或多個任務棧溢 出,所以某個任務的棧溢出,肯定是由于其自身原因造成的,簡化了分析定 位問題的過程。在監(jiān)測到任務棧溢出時,進一步將對應的任務重新啟動,減 小了對其后續(xù)處理流程的影響,增強了具備此功能產(chǎn)品的競爭力。以上所述,僅為本發(fā)明較佳的具體實施方式
      ,但本發(fā)明的保護范圍并不 局限于此,任何熟悉本技術領域的技術人員在本發(fā)明揭露的技術范圍內,可 輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內。因此,本發(fā)明 的保護范圍應該以權利要求的保護范圍為準。
      權利要求
      1.一種任務棧溢出的監(jiān)測方法,應用于靜態(tài)分配的任務棧,其特征在于,包括如下步驟A,確定一位于任務棧末端區(qū)域的內存空間,將其設置為只讀屬性;B,監(jiān)聽操作系統(tǒng)的地址訪問異常中斷;C,當監(jiān)聽到地址訪問異常中斷時,判斷產(chǎn)生地址訪問異常中斷的任務是否棧溢出。
      2. 如權利要求1所述的方法,其特征在于,所述步驟A包括如下步驟 A21,從任務棧的末端區(qū)域確定一首地址、大小為頁表尺寸整數(shù)倍的內存空間;A22,將步驟A21中確定的內存空間進行頁表映射,并將該頁表設置為 只讀屬性。
      3. 如權利要求1所述的方法,其特征在于,所述任務棧位于系統(tǒng)內存中 的靜態(tài)數(shù)據(jù)區(qū),所述步驟A包括如下步驟-A31,確定任務棧末端區(qū)域一指定大小的內存空間;A32,將步驟A31中確定的內存空間作為數(shù)據(jù)段設置為只讀屬性。
      4. 如權利要求1或2或3所述的方法,其特征在于,所述步驟B包括如 下歩驟設置任務異常鉤子函數(shù),通過該任務異常鉤子函數(shù)監(jiān)聽地址訪問異常中斷。
      5. 如權利要求1或2或3所述的方法,其特征在于,所述步驟B包括如 下步驟設置中斷服務程序,通過中斷服務程序監(jiān)聽地址訪問異常中斷。
      6. 如權利要求1或2或3所述的方法,其特征在于,所述步驟C中判斷產(chǎn)生地址訪問異常中斷的任務是否桟溢出包括如下步驟-判斷所述任務的棧指針是否達到棧的頂部,如果是,則棧溢出,否則, 沒有棧溢出。
      7. 如權利要求1或2或3所述的方法,其特征在于,所述步驟C在判定任務棧溢出后,還包括如下步驟獲取所述任務的當前信息并保存。
      8. 如權利要求7所述的方法,其特征在于,所述任務的當前信息保存于 不易失內存中或者以文件的形式保存。
      9. 如權利要求7所述的方法,其特征在于,所述任務的當前信息包括任 務名稱、寄存器信息和任務棧內函數(shù)調用信息中的一項或者多項。
      10. 如權利要求9所述的方法,其特征在于,所述的寄存器信息包括程 序指針、控制寄存器指針、機器狀態(tài)寄存器指針、棧指針、數(shù)據(jù)訪問寄存器 指針。
      11. 如權利要求1或2或3所述的方法,其特征在于,所述步驟C在判 定任務棧溢出后,還包括如下步驟獲取所述任務的當前信息,并構造告警消息上報管理站。
      12. 如權利要求1或2或3所述的方法,其特征在于,所述步驟C在判 定任務棧溢出后,還包括如下步驟重新啟動所述任務。
      13. 如權利要求12所述的方法,其特征在于,為每個任務分別設置一重新啟動門限值,在所述重新啟動所述任務前包括如下步驟根據(jù)所述任務的重新啟動門限值確定是否重新啟動該任務。
      全文摘要
      本發(fā)明公開了一種任務棧溢出的監(jiān)測方法,該監(jiān)測方法包括步驟確定一位于任務棧末端區(qū)域的內存空間,將其設置為只讀屬性;監(jiān)聽操作系統(tǒng)的地址訪問異常中斷;當監(jiān)聽到地址訪問異常中斷時,判斷產(chǎn)生地址訪問異常中斷的任務是否棧溢出。通過上述的方法,可以實時監(jiān)測到任務棧的溢出,并防止由于任務棧溢出而對其它任務造成破壞。
      文檔編號G06F11/34GK101154180SQ20061011353
      公開日2008年4月2日 申請日期2006年9月29日 優(yōu)先權日2006年9月29日
      發(fā)明者劍 陳 申請人:大唐移動通信設備有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1