我正在尝试实现一个新的内核调度程序作为我的学术项目。我知道这可能会减慢系统速度,但出于调试目的,我在上下文切换和调度函数中编写了一个 printk 语句,以便我可以在 dmesg 输出中看到该事件。但是我在 dmesg 文件中没有得到任何输出。我试图在不同的地方插入 printk 语句,但没有得到任何输出。我在做某事吗?有没有更好的工具或技术来调试这种任务?
请您参考如下方法:
学习 ftrace for linux kernel 怎么样?使用它的方式稍微依赖于内核版本。只需阅读文件/sys/kernel/debug/tracing/README 了解详细信息。
如果上面的目录不存在,那么你可能需要挂载它:
mount -t debugfs nodev /sys/kernel/debug
然后编写一个 bash shell 脚本来生成用户空间跟踪:
#!/bin/bash
echo 0 >/sys/kernel/debug/tracing/tracing_enabled
echo 'sched_*' 'irq_*' > /sys/kernel/debug/tracing/set_ftrace_filter
echo function >/sys/kernel/debug/tracing/current_tracer
echo 1 >/sys/kernel/debug/tracing/tracing_enabled
ls -al /tmp/ 1>/dev/null &
ls -al /tmp/ 1>/dev/null &
ls -al /tmp/ 1>/dev/null &
ls -al /tmp/ 1>/dev/null &
ls -al /tmp/ 1>/dev/null &
ls -al /tmp/ 1>/dev/null &
sleep 3
echo 0 >/sys/kernel/debug/tracing/tracing_enabled
cat /sys/kernel/debug/tracing/trace
注意事项:
一种。 Linux内核调度是在内核源代码的kernel/sched目录下实现的。一个例子是 fair.c 中的 CFQ。
湾看文件找API,我们知道调度涉及的相关API都是以“irq_”和“sched_”开头的,所以我们把它编码到上面的shell脚本中。
C。上面shell脚本在我的系统上的输出位于下面(它是gzipped,大约21K行,在大量截断“open”相关函数之后):
https://drive.google.com/file/d/0B1hg6_FvnEa8dDBMcl9tcEs2VEU/edit?usp=sharing
基本上你可以看到哪个内核函数涉及到哪个进程上下文。从内核函数的名称,你可以通过阅读源代码继续跟踪。
更多细节你可以进一步谷歌,例如:
http://tthtlc.wordpress.com/2013/11/19/using-ftrace-to-understanding-linux-kernel-api/