2010-11-12 95 views
8

我正在做一個linux內核項目,我想知道這個checkstack.pl做什麼?我從來沒有學過perl,所以不能理解這個程序。如果我能從概念上理解程序,如果不是逐行的話,那將是非常棒的。 任何努力讚賞。Perl:linux源碼中的checkstack.pl做了什麼?

來源: link text

假設我想要寫我自己的調整了一下代碼,我可以把它寫在C程序。我的主要問題是:爲什麼這個代碼被寫入或應該用Perl編寫?

+1

頂部的註釋看起來不言自明:「檢查函數的堆棧使用情況」。 – Ether 2010-11-12 21:27:38

+2

我懷疑這是用Perl編寫的唯一原因是由於需要很多正則表達式。代碼當然不是Perlish。 (例如,它使用一個大的if/elsif樹將體系結構名稱映射到正則表達式,其中散列會更容易。) – friedo 2010-11-12 23:56:06

回答

11

它創建了內核中每個函數所使用的堆棧幀的大小(即每個函數對局部變量和什麼都使用的局部暫存空間的總量)的列表。

它這樣做的方式是通過反彙編內核並尋找2件事:調整堆棧的函數名稱和指令。它通過查找匹配$funcreqr/^$x* <(.*)>:$/)的行來查找函數名稱,並且它會查找與$re$dre匹配的堆棧調整指令;後兩者高度依賴內核編譯的體系結構,這是if/else語句正在檢查的第一個大塊。 $re搜索將堆棧調整爲固定量(絕大多數函數)的函數,並且搜索以可變量(罕見)調整堆棧的函數。

objdumpbinutils的一部分; objdump -d是反彙編目標文件的命令。此腳本的用法是反彙編內核(objdump -d vmlinux)並將輸出傳送到腳本中。腳本的輸出是內核中所有功能的列表,按最大堆棧幀大小排序。我認爲腳本的目的是爲了讓內核維護者能夠避免堆棧溢出,通過痛苦地確保所有內容的堆棧儘可能小,並且這個腳本允許他們驗證這一點。

2

正如上面已經解釋的那樣,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 
} 

的函數的返回應該給你的運行時堆棧使用情況,我沒有編譯代碼,所以請忽略它是否會產生編譯錯誤,但邏輯應該工作。