一種處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法及系統(tǒng)的制作方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及Linux內(nèi)核異常處理
技術(shù)領(lǐng)域:
,具體來講是一種處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]Linux系統(tǒng)是一種基于POSIX(PortableOperatingSystemInterfaceofUnix,可移植操作系統(tǒng)Unix)和Unix的多用戶、多任務、多線程和多CPU的操作系統(tǒng)。如今,已經(jīng)有許多硬件設備安裝了完整版本或裁減版本的Linux系統(tǒng),例如家庭網(wǎng)關(guān),手機,平板電腦,計算機,大型服務器等。[0003]基于Linux的家庭網(wǎng)關(guān)作為一款三網(wǎng)融合的用戶側(cè)終端產(chǎn)品,應用越來越廣泛,需求也越來越多。開發(fā)者在進行驅(qū)動開發(fā)或用戶在應用產(chǎn)品時,時常會碰到一些內(nèi)核崩潰(KernelPanic)的現(xiàn)象。所謂的內(nèi)核崩潰,是指操作系統(tǒng)監(jiān)測到內(nèi)部的致命錯誤,并無法安全處理此錯誤時采取的動作。這個概念主要被限定在Unix以及類Unix系統(tǒng)中,對于MicrosoftWindows系統(tǒng),等同的概念通常被稱為藍屏死機。[0004]目前,當家庭網(wǎng)關(guān)出現(xiàn)內(nèi)核崩潰現(xiàn)象時,Linux內(nèi)核會立即將一些異常打印信息(oops信息)通過串口輸出到控制臺或者屏幕,完成輸出后,家庭網(wǎng)關(guān)的串口輸入輸出功能即會失效(因為系統(tǒng)已經(jīng)崩潰)。此時,開發(fā)者(或用戶)就只能通過控制臺或者屏幕上的異常打印信息進行內(nèi)核崩潰信息的捕獲及問題調(diào)試。但是,上述處理方法在解決實際問題時,還是存在以下缺陷:[0005](I)該處理方法必須基于出現(xiàn)內(nèi)核崩潰前就已經(jīng)接上有效串口。若內(nèi)核崩潰前未及時接上串口或串口故障,因為系統(tǒng)已經(jīng)崩潰無法進行任何有效輸入輸出,所以系統(tǒng)根本無法將OOPS信息進行有效輸出,開發(fā)者(或用戶)無法在沒有OOPS信息的基礎(chǔ)上進行內(nèi)核崩潰?目息的捕獲,進而無法準確定位冋題所在。[0006](2)該處理方法中,oops信息僅能一次性輸出到控制臺或者屏幕上,關(guān)掉電源后無法進行再次查看,開發(fā)者(或用戶)只能通過手抄或者拍照的方式來記錄,操作比較困難;與此同時,由于屏幕只能顯示一頁Oops信息(因為無法通過輸入輸出來調(diào)整顯示的信息),因此當Oops信息過多時,根本無法顯示完整的內(nèi)容,缺少完整的oops信息也就無法進一步進行處理。[0007]綜上所述,設計一種不依賴串口來處理內(nèi)核崩潰的方法,是目前基于Linux的家庭網(wǎng)關(guān)亟待解決的技術(shù)問題?!?br/>發(fā)明內(nèi)容】[0008]本發(fā)明的目的是為了克服上述【
背景技術(shù):
】的不足,提供一種處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法及系統(tǒng),能在不依賴串口的情況下,完整地捕獲內(nèi)核崩潰信息,處理過程高效、便捷,且復用性高。[0009]為達到以上目的,本發(fā)明提供一種處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法,包括以下步驟:[0010]A、在系統(tǒng)內(nèi)核崩潰后出現(xiàn)異常的CPU寄存器內(nèi),查找并記錄與當前系統(tǒng)對應的所有堆棧的寄存器指針變量,轉(zhuǎn)到步驟B;[0011]B、讀取每個寄存器指針變量中的內(nèi)核崩潰信息,內(nèi)核崩潰信息的讀取順序依次為異常地址信息、最后返回的地址信息、CPU寄存器狀態(tài)值和CPU寄存器調(diào)用過的內(nèi)核函數(shù)的信息;將所有寄存器指針變量中的內(nèi)核崩潰信息均保存至全局緩沖區(qū),轉(zhuǎn)到步驟C;[0012]C、將全局緩沖區(qū)中所有的內(nèi)核崩潰信息寫入到Flash存儲器的指定文件夾,轉(zhuǎn)到步驟D;[0013]D、根據(jù)系統(tǒng)的內(nèi)核崩潰狀態(tài)打印異常提示信息至系統(tǒng)終端;用戶根據(jù)異常提示信息及Flash存儲器內(nèi)的內(nèi)核崩潰信息進行調(diào)試,結(jié)束。[0014]在上述技術(shù)方案的基礎(chǔ)上,步驟A之前包括以下步驟:初始化一個用于禁止本地中斷、禁止內(nèi)核搶占的自旋鎖;步驟C與D之間包括以下步驟:將自旋鎖進行釋放。[0015]在上述技術(shù)方案的基礎(chǔ)上,步驟C具體包括以下步驟:在Flash存儲器中指定需要寫入文件夾的名稱和路徑;根據(jù)內(nèi)核崩潰信息的起始地址、字節(jié)數(shù)大小,將全局緩沖區(qū)中所有的內(nèi)核崩潰信息寫入到指定文件夾中。[0016]在上述技術(shù)方案的基礎(chǔ)上,步驟D所述根據(jù)系統(tǒng)的內(nèi)核崩潰狀態(tài)打印異常提示信息至系統(tǒng)終端,具體包括以下步驟:讀取CPU的狀態(tài),判斷當前CPU是否處于中斷條件,若是,打印中斷異常提示信息至系統(tǒng)終端;否則,休眠3?8秒,打印非中斷異常提示信息至系統(tǒng)終端。[0017]在上述技術(shù)方案的基礎(chǔ)上,步驟B中,讀取CPU寄存器調(diào)用過的內(nèi)核函數(shù)的信息的具體步驟包括:利用寄存器指針變量查詢當前CPU任務的內(nèi)存地址;以該內(nèi)存地址為索引,在存放所有內(nèi)核函數(shù)的內(nèi)核符號表中進行查找,獲取調(diào)用過的內(nèi)核函數(shù)的名字、內(nèi)核函數(shù)的大小,調(diào)用到內(nèi)核函數(shù)中的配置地址。[0018]在上述技術(shù)方案的基礎(chǔ)上,步驟A具體包括以下步驟:在當前系統(tǒng)正在運行的堆棧中記錄寄存器指針變量;根據(jù)所述堆棧中存儲的上一級調(diào)用函數(shù)的棧指針回溯至上一級堆棧,記錄上一級堆棧內(nèi)的寄存器指針變量;依次回溯,直至記錄所有堆棧的寄存器指針變量,轉(zhuǎn)到步驟B。[0019]在上述技術(shù)方案的基礎(chǔ)上,步驟B中所述將所有寄存器指針變量中的內(nèi)核崩潰信息均保存至全局緩沖區(qū)的具體步驟為:將所有寄存器指針變量中的內(nèi)核崩潰信息均保存至全局緩沖區(qū)的最后。[0020]本發(fā)明還提供一種實現(xiàn)上述方法的處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的系統(tǒng),包括寄存器指針變量記錄模塊、內(nèi)核崩潰信息捕獲模塊、內(nèi)核崩潰信息寫入模塊和提示信息打印模塊;[0021]所述寄存器指針變量記錄模塊用于:在系統(tǒng)內(nèi)核崩潰后出現(xiàn)異常的CPU寄存器內(nèi),查找并記錄與當前系統(tǒng)對應的所有堆棧的寄存器指針變量;向內(nèi)核崩潰信息捕獲模塊發(fā)送捕獲信號;[0022]所述內(nèi)核崩潰信息捕獲模塊用于:收到捕獲信號后,讀取每個寄存器指針變量中的內(nèi)核崩潰信息,內(nèi)核崩潰信息的讀取順序依次為異常地址信息、最后返回的地址信息、CPU寄存器狀態(tài)值和CPU寄存器調(diào)用過的內(nèi)核函數(shù)的信息;將所有寄存器指針變量中的內(nèi)核崩潰信息均保存至全局緩沖區(qū);向內(nèi)核崩潰信息寫入模塊發(fā)送寫入信號;[0023]所述內(nèi)核崩潰信息寫入模塊用于:收到寫入信號后,將全局緩沖區(qū)中所有的內(nèi)核崩潰信息寫入到Flash存儲器的指定文件夾;向提示信息打印模塊發(fā)送打印信號;[0024]所述提示信息打印模塊用于:收到打印信號后,根據(jù)系統(tǒng)的內(nèi)核崩潰狀態(tài)打印異常提示信息至系統(tǒng)終端。[0025]在上述技術(shù)方案的基礎(chǔ)上,所述提示信息打印模塊包括處理模塊和打印模塊;[0026]所述處理模塊用于:讀取CPU的狀態(tài),判斷當前CPU是否處于中斷條件下,若是,發(fā)送中斷異常打印信號;否則,發(fā)送非中斷異常打印信號;[0027]所述打印模塊用于:收到中斷異常打印信號后,打印中斷異常提示信息至系統(tǒng)終端;收到非中斷異常打印信號后,休眠3?8秒,打印非中斷異常提示信息至系統(tǒng)終端。[0028]在上述技術(shù)方案的基礎(chǔ)上,該系統(tǒng)還包括自旋鎖控制模塊,所述自旋鎖控制模塊用于:在寄存器指針變量記錄模塊開始記錄前,初始化一個用于禁止本地中斷、禁止內(nèi)核搶占的自旋鎖;在內(nèi)核崩潰信息寫入后、異常提示信息打印前,釋放自旋鎖。[0029]本發(fā)明的有益效果在于:[0030](I)本發(fā)明中,在家庭網(wǎng)關(guān)系統(tǒng)出現(xiàn)內(nèi)核崩潰時,是將所捕獲到的完整的內(nèi)核崩潰信息寫入到Flash存儲器的指定文件夾中,而不是按照傳統(tǒng)的方式將信息通過串口輸出到控制臺或者屏幕。與現(xiàn)有技術(shù)中只能依賴串口進行內(nèi)核崩潰信息的輸出相比,本發(fā)明能夠在不使用串口的情況下對內(nèi)核崩潰信息進行完整的保存,并能在關(guān)掉電源后(或重啟后)通過Flash存儲器的指定文件夾進行反復查看,復用性高,不僅方便開發(fā)者(或用戶)快速解決內(nèi)核崩潰問題,而且能夠降低家庭網(wǎng)關(guān)設備的制造成本及維護成本。[0031](2)本發(fā)明對內(nèi)核崩潰信息進行捕獲時,會在出現(xiàn)異常的CPU寄存器內(nèi),通過回溯的方式記錄下所有堆棧的寄存器指針變量,利用寄存器指針變量中的異常地址信息(epc信息)、最后返回的地址信息(ra信息)、CPU寄存器狀態(tài)值以及CPU寄存器調(diào)用過的內(nèi)核函數(shù)的信息,從而捕獲到所有的內(nèi)核崩潰信息,整個處理過程高效、便捷。[0032](3)本發(fā)明中,在進行內(nèi)核崩潰信息的捕獲之前,會初始化一個用于禁止本地中斷、禁止內(nèi)核搶占的自旋鎖,該自旋鎖使得所要獲取的內(nèi)核崩潰信息是在一個系統(tǒng)資源穩(wěn)定狀態(tài)下獲取的,從而保證了所獲取的內(nèi)核崩潰信息的準確性、可靠性。[0033](4)本發(fā)明中,在完成捕獲、保存內(nèi)核崩潰信息后,會對CPU的狀態(tài)進行判斷,從而區(qū)分內(nèi)核崩潰是發(fā)生在CPU中斷條件下還是非中斷條件下,并通過打印相應的提示信息給開發(fā)者(或用戶)以提示,能有助于開發(fā)者(或用戶)對問題進行更好的分析與判斷。[0034](5)本發(fā)明的適用性廣,適用于大多數(shù)安裝了完整版本或裁減版本的Linux系統(tǒng)的硬件設備?!靖綀D說明】[0035]圖1是本發(fā)明實施例中處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法的流程圖?!揪唧w實施方式】[0036]下面結(jié)合附圖及具體實施例對本發(fā)明作進一步的詳細描述。[0037]本實施例的實施環(huán)境為基于Linux操作系統(tǒng),內(nèi)核版本為Linux2.6.18且CPU為MIPS架構(gòu)的家庭網(wǎng)關(guān)設備。[0038]參見圖1所示,本發(fā)明實施例提供一種處理家庭網(wǎng)關(guān)系統(tǒng)內(nèi)核崩潰的方法,包括以下步驟:[0039]S1:初始化一個用于禁止本地中斷、禁止內(nèi)核搶占的自旋鎖,使將要獲取的內(nèi)核崩潰信息均是準確、可靠的信息,轉(zhuǎn)到步驟S2。[0040]S2:在系統(tǒng)內(nèi)核崩潰后出現(xiàn)異常的CPU寄存器內(nèi),查找并記錄與當前系統(tǒng)對應的所有堆棧的寄存器指針變量,轉(zhuǎn)到步驟S3。[0041]步驟S2具體包括以下步驟:在當前系統(tǒng)正在運行的堆棧中記錄寄存器指針變量;根據(jù)所述堆棧中存儲的上一級調(diào)用函數(shù)的棧指針回溯至上一級堆棧,記錄上一級堆棧內(nèi)的寄存器指針變量;依次回溯,直至記錄所有堆棧的寄存器當前第1頁1 2