我正在做一个在Linux内核的项目,我想知道这个checkstack.pl做什么? 我从来没有学过perl,所以不能理解这个程序。 如果我不能逐线理解程序,那将是非常棒的。 任何努力的赞赏。
来源: 链接文本
假设我想写我自己的代码调整了一下,我可以写在一个C程序。 我的主要问题是:为什么这个代码被写入或应该用Perl编写?
它创建了内核中每个函数使用的堆栈框架的大小列表(即每个函数对局部变量使用的局部暂存空间的总量以及什么)。
这样做的方式是通过反汇编内核,并寻找2件事:函数名称和指令,调整堆栈。 它通过查找匹配$funcre
( qr/^$x* <(.*)>:$/
)的行来查找函数名,并且查找匹配$re
或$dre
堆栈调整指令; 后两者高度依赖内核编译的体系结构,这是if / else语句正在检查的第一个大块。 $re
搜索调整堆栈的函数(绝大多数函数), $dre
搜索函数调整堆栈的可变量(罕见)。
objdump
是binutils的一部分; objdump -d
是反汇编对象文件的命令。 此脚本的用法是反汇编内核( objdump -d vmlinux
)并将输出传送到脚本中。 脚本的输出是内核中所有功能的列表,按最大的堆栈帧大小排序。 我认为脚本的目的是为了让内核维护者能够避免堆栈溢出,通过痛苦地确保所有的堆栈帧尽可能小,并且这个脚本允许他们验证这一点。
正如前面已经解释的那样,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 }
该函数的返回应该给你运行时的堆栈使用,我没有编译代码,所以请忽略它是否给编译错误,但逻辑应该工作。