2010-11-12 7 views
8

Robię projekt w jądrze Linux i chciałem wiedzieć, co robi ten checkstack.pl? Nigdy nie uczyłem się perla, więc nie mogę zrozumieć programu. Będzie świetnie, gdybym mógł zrozumieć program koncepcyjnie, gdyby nie linia po linii. Każdy wysiłek doceniony.Perl: co robi checkstack.pl w źródle linux?

Źródło: link text

Załóżmy, że chcesz napisać kod własne szczypanie trochę, mogę napisać go w programie C. Moje główne pytanie brzmi: dlaczego ten kod został napisany lub powinien być napisany w perlu?

+1

Komentarz na górze wydaje się dość oczywisty: "Sprawdź użycie stosu funkcji". – Ether

+2

Podejrzewam, że jedynym powodem, dla którego został napisany w Perlu, jest wiele wymaganych wyrażeń regularnych. Kod z pewnością nie jest bardzo Perlish. (Np. Używa dużego drzewa if/elsif do odwzorowania nazwy architektury na wyrażenie regularne, gdzie mieszanie byłoby o wiele łatwiejsze). – friedo

Odpowiedz

11

Tworzy listę wielkości stosu klatek używanych przez każdą funkcję jądra (tj. Całkowitą ilość lokalnej przestrzeni zarysowania używanej przez każdą funkcję dla zmiennych lokalnych i cokolwiek).

Sposób, w jaki to robi, polega na przechodzeniu przez demontaż jądra i szukaniu 2 rzeczy: nazw funkcji i instrukcji, które dostosowują stos. Szuka nazw funkcji, szukając linii pasujących do $funcre (qr/^$x* <(.*)>:$/) i szuka instrukcji dopasowania stosu, które pasują do $re lub $dre; te dwa ostatnie zależą w dużej mierze od tego, do jakiej architektury skompilowano jądro, a więc do tego, co sprawdza pierwszy duży blok, jeśli instrukcje else/else. $re wyszukuje funkcje, które dostosowują stos do ustalonej ilości (zdecydowana większość funkcji), a $dre wyszukuje funkcje, które dostosowują stos do zmiennej ilości (rzadko).

objdump jest częścią binutils; objdump -d to polecenie deasemblowania pliku obiektu. Użycie tego skryptu polega na dezasemblacji jądra (objdump -d vmlinux) i wyprowadzeniu danych wyjściowych do skryptu. Dane wyjściowe skryptu są listą wszystkich funkcji w jądrze, posortowanych według największego rozmiaru klatki stosu. Zakładam, że celem skryptu jest, aby opiekunowie jądra byli w stanie uniknąć przepełnienia stosu, boleśnie upewniając się, że stosy wszystkich elementów są tak małe, jak to tylko możliwe, a skrypt pozwala im to zweryfikować.

2

Jak już wyjaśniono powyżej, skrypt Perla służy do ustalenia użycia stosu kodu jądra, myślę, że Perl jest używany ze względu na to, że parsowanie wyniku objdump -d nie będzie tak łatwe, jeśli zostanie wykonane za pomocą kodu C .

można znaleźć wykorzystanie stosu w czasie wykonywania przez poświęcenie adres pierwszego argumentu oraz adres ostatniego zmiennej lokalnej, a następnie odjąć im coś takiego:

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 
} 

powrót funkcji powinno dać ty stosu środowiska wykonawczego, nie skompilowałem kodu, więc zignoruj, jeśli spowoduje błędy kompilacji, ale logika powinna działać.