ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

使用python从C代码中提取函数名称及其注释(了解Linux内核)

2019-12-01 07:52:10  阅读:614  来源: 互联网

标签:kernel ftrace c-3 linux python


背景信息

我刚刚开始学习有关驱动程序和linux内核的知识.我想了解用户write()和read()的工作方式.因此,我开始使用ftrace来查看函数的运行路径.
但是像下面这样的单个程序的跟踪结果是“巨大的”.

int main() {
    int w;
    char buffer[] = "test string mit 512 byte";
    int fd = open("/dev/sdd",O_DIRECT | O_RDWR | O_SYNC);
    w = write(fd,buffer,sizeof(buffer));
}

我也不知道可以过滤哪些功能,因为我不了解Linux内核,也不想丢掉一些重要的东西.

因此,我开始研究function_graph跟踪.这是一个片段.

 [...]
 12)   0.468 us    |            .down_write();
 12)   0.548 us    |            .do_brk();
 12)   0.472 us    |            .up_write();
 12)   0.762 us    |            .kfree();
 12)   0.472 us    |            .fput();
 [...]

我看到了这些.down_write()和.up_write(),我认为,这正是我要搜索的内容.所以我查了一下. down_write() sourcecode

 /*
 * lock for writing
 */
 void __sched down_write(struct rw_semaphore *sem)
 {
       might_sleep();
       rwsem_acquire(&sem->dep_map, 0, 0, _RET_IP_);

       LOCK_CONTENDED(sem, __down_write_trylock, __down_write);
 }

但是事实证明,这只是为了锁定和释放锁.
然后,我开始为我写一个小参考,所以我不必总是去查找这些东西,因为它的数量可能超过9000.然后我有了一个主意,为什么不解析这些函数及其注释呢?并将它们写在跟踪文件中的函数后面?像这样:

 [...]
 12)   0.468 us    |            .down_write(); lock for writing
 12)   0.548 us    |            .do_brk(); 
 12)   0.472 us    |            .up_write(); release a write lock
 12)   0.762 us    |            .kfree();
 12)   0.472 us    |            .fput();
 [...]

主要问题

因此,我开始考虑如何实现这一目标.我想用python来做,因为我觉得最舒服.

1.问题
为了匹配C函数和注释,我必须定义和实现一个递归匹配语法:(

2.问题
有些功能只是包装器,没有注释.例如do_brk()包装__do_brk(),并且注释仅在__do_brk()上

所以我认为,也许还有其他评论来源.也许是文档?还有可能,这种使用python的“文档生成”已经实现了.

还是我理解系统read()write()的方式非常不智能?你能给我小费我应该如何更深入地挖掘吗?

非常感谢您的阅读,
法比安

解决方法:

在实践中解析注释非常困难.解析内核代码并不是特别容易.

首先,您应该准确了解linux kernel中的system call,以及应用程序如何使用它们. Linux Assembly HowTo有很好的解释.

然后,您应该了解Linux内核的组织.我强烈建议您阅读一些不错的书.

使用自动工具探索内核源代码需要大量的工作(几个月而不是几天).您可能考虑使用coccinelle工具(用于所谓的“语义补丁”).您也可以考虑使用插件或更好的自定义GCC编译器(扩展为MELT)

(MELT是扩展GCC的高级领域特定语言;我是它的主要设计者和实现者).

如果使用GCC,您将在中端获得GCC内部表示和处理的所有功能(但在此阶段,注释会丢失).

您尝试做的可能比您最初想的要雄心勃勃.另请参见Alexandre Lissy的作品,例如model-checking the linux kernel和他将在Linux Symposium 2012(2012年7月)上发表的论文

标签:kernel,ftrace,c-3,linux,python
来源: https://codeday.me/bug/20191201/2079076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有