【发布时间】:2012-06-16 09:18:27
【问题描述】:
背景信息
我刚刚开始学习有关驱动程序和 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 个。然后我有了想法,为什么不解析这些函数和它们的 cmets并将它们写在跟踪文件中的函数后面?像这样:
[...]
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 函数和 cmets,我必须定义并实现递归匹配语法:(
2。问题
有些函数只是包装器,没有 cmets。例如do_brk() 包裹__do_brk() 并且评论仅在__do_brk() 上方
所以我想,cmets 可能还有其他来源。也许是文档?也有可能,这个使用 python 的“文档生成”已经有人实现了。
或者我理解系统read()write()的方式很不智能?你能给我提示我应该如何深入挖掘吗?
非常感谢您的阅读,
费边
【问题讨论】:
-
感谢您的反对,没有评论我可以在我的问题中改进什么。感谢您的反馈...:/
-
你签出LXR了吗?
标签: python c linux kernel ftrace