【问题标题】:Perl: what does checkstack.pl in linux source do?Perl:linux 源代码中的 checkstack.pl 有什么作用?
【发布时间】:2011-05-09 07:41:04
【问题描述】:

我在 linux 内核中做一个项目,我想知道这个 checkstack.pl 有什么作用?我从来没有学过perl,所以不能理解这个程序。如果我不能逐行理解程序,那就太好了。 任何努力都值得赞赏。

来源: link text

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

【问题讨论】:

  • 顶部的评论似乎很不言自明:“检查函数的堆栈使用情况”。
  • 我怀疑这是用 Perl 编写的唯一原因是由于需要许多正则表达式。代码当然不是很 Perlish。 (例如,它使用大 if/elsif 树将架构名称映射到正则表达式,其中哈希会更容易。)

标签: linux perl stack linux-kernel


【解决方案1】:

它创建内核中每个函数使用的堆栈帧大小的列表(即每个函数用于局部变量等的局部暂存空间总量)。

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

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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2023-01-29
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多