bts patch想法和實現
目的:不重啟bts(系統是vxworks on powerpc)動態呼叫乙個新函式,替換原來的舊函式,以達到patch的功能。如能實現至少能在debug的時候起作用,不用編譯整個應用程式,不用重新啟動系統,節省時間。
(在nortel交換機上有該功能,現想在基站、即bts上實現)
原理:在舊函式,即想被替換的函式的開始位址插入乙個jump指令,無條件跳轉到新的函式起始位置,執行新函式,從而達到patch的功能。
limitation:
static變數將會被重置為0。
實現:首先要啟用已經放棄多年的xdm ftp模組,實現把新函式(編譯好的.o檔案)上傳到bts的功能,並把.o檔案存放在bts的flash儲存器裡面。
由於新函式可能要用到原來應用程式裡有的函式或者變數,所以在本機上編譯了.o檔案以後,其應該被外加乙個檔案頭,裡面存有該新函式要用到的另外的symbol的位址(用nmppc工具在.o檔案和.corefile檔案裡提取)。
.o檔案上傳以後應被與檔案頭分離,程式把檔案頭里的symbol加入vxworks裡的系統符號表裡,如此以後在執行新函式的時候就能正確得知這些symbol的位置。
分離了檔案頭以後可以呼叫vxworks的api,loadmodule(),把新函式動態連線進記憶體。
如果連線成功,就可以改動舊函式的**段,插入乙個jump指令,讓其跳轉到新函式,完成。
已解決的未預想到的問題:
1。flash儲存的寫入問題。
2。新函式不能正確找到所需symbol的位址。
3。把新symbol加入到系統符號表的問題。
問題:1。**段記憶體寫保護,稍有改動就重啟,現並沒有解決辦法。
2。新函式儲存位址比較遠,普通24位offset的jump指令並不能正確定址。
問題:1. vxworks**段記憶體保護,不能隨意改動舊函式的**段。這意味著不能加入jump指令跳轉到新函式。
2. jump指令。powerpc沒有長跳轉的指令,如果要跳轉到乙個遠位址必須把位址放入某特殊暫存器,然後跳轉。
3. 如果舊函式正在被某程序執行,而需要插入的指令大於一條。如不作判斷便更改**段將出現嚴重問題。
解決:1. 經過檢視vxworks作業系統**,發現乙個可用的內部函式「memprotectstateset()」,可以將某個記憶體段的保護狀態修改,不需要重啟板子。執行這個函式後便可指定某個**段可寫。
2. 只能採用多條指令實現跳轉。並研究其指令二進位制格式,把指令手工轉換成word32寫入**段。
3. demo裡決定不解決該問題。暫時想法是搜尋所有程序,如有正在執行該**段將等待,如果超時則返回打補丁失敗。
HUSTOJ實現的相關想法
這兩天通過讀 hustoj 的原始碼,是我對oj系統有了初步的了解,對整個系統的構架有了淺薄的認識。拿hustoj來講,hustoj的結構是典型的lamp伺服器,就是linux apache mysql php,以及用c c寫的評測機核心。hustoj有兩種資料互動的模式,兩種的不同點在於,是評測機...
大數加法 C實現想法
大數加法實現採用陣列來完成,網上常見的 在定義變數的時候常採用這種形式 int in1 n in2 n ans n int in1 size,in2 size,ans size int i,j,k 如這位兄台的c語言大數加法 我在實現時使用結構體將三個陣列重新做封裝,size指向陣列的實際有效位數,...
nodejs實現同步操作想法實現
需要執行的函式 var func1 function req,res,callback 13000 var func2 function req,res,callback 5000 var func3 function req,res,callback 1000 可以看出在func1,func2和f...