Linux kernel 调试Linux调度程序

Linux kernel 调试Linux调度程序,linux-kernel,operating-system,kernel,Linux Kernel,Operating System,Kernel,我正在尝试实现一个新的内核调度器作为我的学术项目。我知道这可能会降低系统速度,但出于调试目的,我正在上下文切换和调度函数中编写printk语句,以便在dmesg输出中看到事件。但我在dmesg文件中没有得到任何输出。我试图在不同的地方插入printk语句,但没有得到任何输出。我在做一些事情吗?有没有更好的工具或技术来调试这种任务?学习linux内核的ftrace如何?使用它的方式稍微依赖于内核版本。只需阅读文件/sys/kernel/debug/tracing/README了解详细信息 如果上述

我正在尝试实现一个新的内核调度器作为我的学术项目。我知道这可能会降低系统速度,但出于调试目的,我正在上下文切换和调度函数中编写printk语句,以便在dmesg输出中看到事件。但我在dmesg文件中没有得到任何输出。我试图在不同的地方插入printk语句,但没有得到任何输出。我在做一些事情吗?有没有更好的工具或技术来调试这种任务?

学习linux内核的ftrace如何?使用它的方式稍微依赖于内核版本。只需阅读文件/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
注意事项:

a。Linux内核调度是在内核源代码的kernel/sched目录中实现的。一个例子是fair.c中的CFQ

b。阅读这些文件并查找API,我们知道调度中涉及的相关API以“irq_u”和“sched_u”开头,因此我们将其编码到上面的shell脚本中

c。在我的系统上,上面的shell脚本的输出位于下面(它是gzip,大约21K行,在大量截断“open”相关函数之后):

基本上,您可以看到哪个内核函数涉及哪个进程上下文。从内核函数的名称中,您可以通过读取源代码继续跟踪

您可以通过谷歌进一步搜索更多详细信息,例如:


您可能需要提高内核
日志级别。读取当前设置的级别:

cat /proc/sys/kernel/printk
此条目应大于
kernel/printk.c

您可以通过以下方式将其更改为其他值,例如
2

echo 2 > /proc/sys/kernel/printk
如果您不想更改
DEFAULT\u MESSAGE\u LOGLEVEL
,那么您可以在调用
printk
时给予较高的优先级
标志
,例如:

printk(KERN_ERR "Hello world"); //or any higher priority flag 
欲了解更多信息