我正在做一個linux內核項目,我想知道這個checkstack.pl做什麼?我從來沒有學過perl,所以不能理解這個程序。如果我能從概念上理解程序,如果不是逐行的話,那將是非常棒的。 任何努力讚賞。Perl:linux源碼中的checkstack.pl做了什麼?
來源: link text
假設我想要寫我自己的調整了一下代碼,我可以把它寫在C程序。我的主要問題是:爲什麼這個代碼被寫入或應該用Perl編寫?
我正在做一個linux內核項目,我想知道這個checkstack.pl做什麼?我從來沒有學過perl,所以不能理解這個程序。如果我能從概念上理解程序,如果不是逐行的話,那將是非常棒的。 任何努力讚賞。Perl:linux源碼中的checkstack.pl做了什麼?
來源: link text
假設我想要寫我自己的調整了一下代碼,我可以把它寫在C程序。我的主要問題是:爲什麼這個代碼被寫入或應該用Perl編寫?
它創建了內核中每個函數所使用的堆棧幀的大小(即每個函數對局部變量和什麼都使用的局部暫存空間的總量)的列表。
它這樣做的方式是通過反彙編內核並尋找2件事:調整堆棧的函數名稱和指令。它通過查找匹配$funcre
(qr/^$x* <(.*)>:$/
)的行來查找函數名稱,並且它會查找與$re
或$dre
匹配的堆棧調整指令;後兩者高度依賴內核編譯的體系結構,這是if/else語句正在檢查的第一個大塊。 $re
搜索將堆棧調整爲固定量(絕大多數函數)的函數,並且搜索以可變量(罕見)調整堆棧的函數。
objdump
是binutils的一部分; objdump -d
是反彙編目標文件的命令。此腳本的用法是反彙編內核(objdump -d vmlinux
)並將輸出傳送到腳本中。腳本的輸出是內核中所有功能的列表,按最大堆棧幀大小排序。我認爲腳本的目的是爲了讓內核維護者能夠避免堆棧溢出,通過痛苦地確保所有內容的堆棧儘可能小,並且這個腳本允許他們驗證這一點。
正如上面已經解釋的那樣,Perl腳本用於查找內核代碼的堆棧使用情況,我認爲使用Perl是因爲如果通過C代碼完成解析objdump -d
的輸出將不會那麼容易。
您可以通過採取第一個參數,最後一個局部變量的地址的地址找到運行時的堆棧使用,然後減去他們,是這樣的:
int stack_usage_func(char i)
{
int j,k,l;
char buf[256];
char m;
unsigned long stack_use = &i - &m;
//do all processing
return stack_use
}
的函數的返回應該給你的運行時堆棧使用情況,我沒有編譯代碼,所以請忽略它是否會產生編譯錯誤,但邏輯應該工作。
頂部的註釋看起來不言自明:「檢查函數的堆棧使用情況」。 – Ether 2010-11-12 21:27:38
我懷疑這是用Perl編寫的唯一原因是由於需要很多正則表達式。代碼當然不是Perlish。 (例如,它使用一個大的if/elsif樹將體系結構名稱映射到正則表達式,其中散列會更容易。) – friedo 2010-11-12 23:56:06