2010-11-12 14 views
8

Estoy haciendo un proyecto en Linux Kernel y quería saber qué hace checkstack.pl? Nunca estudié Perl, así que no puedo entender el programa. Sería genial si pudiera entender el programa conceptualmente si no línea por línea. Cualquier esfuerzo apreciado.Perl: ¿qué hace checkstack.pl en la fuente de Linux?

Fuente: link text

Supongamos que yo quiero escribir el código de mi propia ajustar un poco, puedo escribir en un programa C. Mi Q principal es: ¿por qué este código está escrito o debería escribirse en perl?

+1

El comentario en la parte superior parece bastante autoexplicativo: "Compruebe el uso de las funciones de la pila". – Ether

+2

Sospecho que la única razón por la que esto fue escrito en Perl se debe a las muchas expresiones regulares requeridas. El código ciertamente no es muy perlish. (Por ejemplo, utiliza un gran árbol if/elsif para asignar el nombre de la arquitectura a regex, donde un hash sería mucho más fácil). – friedo

Respuesta

11

Crea un listado del tamaño del marco de pila utilizado por cada función en el kernel (es decir, la cantidad total de espacio cero utilizado por cada función para las variables locales y otras cosas).

La forma en que lo hace es mediante el desmontaje del núcleo y buscando 2 cosas: nombres de funciones e instrucciones que ajustan la pila. Busca nombres de funciones buscando líneas que coincidan con $funcre (qr/^$x* <(.*)>:$/) y busca instrucciones de ajuste de pila que coincidan con $re o $dre; los últimos dos dependen en gran medida de la arquitectura para la que se compiló el kernel, que es lo que el primer bloque grande if if/else está buscando. $re busca funciones que ajustan la pila en una cantidad fija (la gran mayoría de las funciones), y $dre busca funciones que ajustan la pila en una cantidad variable (raro).

objdumpes parte de binutils; objdump -d es el comando para desmontar un archivo de objeto. El uso de este script consiste en desensamblar el núcleo (objdump -d vmlinux) y canalizar el resultado en el script. La salida de la secuencia de comandos es una lista de todas las funciones en el núcleo, ordenadas por el tamaño de la estructura de la pila más grande. Asumo que el propósito del guión es que los mantenedores del kernel puedan evitar los desbordamientos de pila al asegurarse de que los marcos de la pila de todo sean lo más pequeños posible, y este guión les permite verificarlo.

2

Como ya se explicó anteriormente que el script Perl se usa para averiguar el uso de la pila del código del kernel, creo que Perl se usa debido a que analizar la salida de objdump -d no será tan fácil si se hace a través del código C .

Usted puede encontrar el uso de pila en el tiempo de ejecución, tomando la dirección del primer argumento y la dirección de la última variable local, luego restar ellos, algo así como:

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 
} 

El retorno de la función debe dar En el uso de la pila en tiempo de ejecución, no he compilado el código, por lo que ignoro si proporciona errores de compilación, pero la lógica debería funcionar.