Perl:linux源代码中的checkstack.pl做了什么?

时间:2010-11-12 21:17:45

标签: linux perl stack linux-kernel

我正在linux内核中做一个项目,我想知道这个checkstack.pl做了什么?我从未学习过perl,因此无法理解该程序。如果我能从概念上理解程序,如果不是逐行理解,那将是很棒的。 任何努力都赞赏。

来源: link text

假设我想编写一些我自己的调整代码,可以在C程序中编写。我的主要问题是:为什么编写这段代码或者应该用perl编写?

2 个答案:

答案 0 :(得分:11)

它创建了内核中每个函数使用的堆栈框架大小的列表(即每个函数对局部变量使用的局部临时空间总量等等)。

这样做的方法是通过内核的反汇编并查找两件事:函数名称和调整堆栈的指令。它通过查找与$funcreqr/^$x* <(.*)>:$/)匹配的行来查找函数名称,并查找与$re$dre匹配的堆栈调整指令;后两者高度依赖于内核编译的体系结构,这是if / else语句检查时的第一个大块。 $re搜索以固定数量(绝大多数函数)调整堆栈的函数,$dre搜索以可变数量调整堆栈的函数(罕见)。

objdumpbinutils的一部分; objdump -d是反汇编目标文件的命令。此脚本的用法是反汇编内核(objdump -d vmlinux)并将输出通过管道传输到脚本中。脚本的输出是内核中所有函数的列表,按最大堆栈帧大小排序。我假设脚本的目的是让内核维护者能够通过痛苦地确保所有内容的堆栈帧尽可能小来避免堆栈溢出,并且这个脚本允许他们验证这一点。

答案 1 :(得分:2)

如上所述,Perl脚本用于查找内核代码的堆栈使用情况,我认为使用Perl是因为解析objdump -d的输出不会那么容易通过C代码。

您可以通过获取第一个参数的地址和最后一个局部变量的地址来查找运行时的堆栈使用情况,然后减去它们,如:

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
}

函数的返回应该给你运行时堆栈的使用,我还没有编译代码,所以如果它给出编译错误请忽略,但是逻辑应该可以工作。