我正在尝试实现我自己的新schedule()。我想调试我的代码。
我可以在sched.c中使用printk函数吗?
我使用了printk,但它不起作用。我错过了什么?
发布于 2013-01-12 06:30:16
你知道schedule()多久被调用一次吗?它的调用速度可能比您的计算机将打印缓冲区刷新到日志的速度还要快。我建议使用另一种调试方法。例如,在QEMU中运行内核,并通过加载kernel.syms文件作为符号表并设置断点来使用远程GDB。其他虚拟化软件也提供类似的功能。或者手动操作并遍历您的代码。在中断处理程序中使用printk通常不是一个好主意(除非您要陷入恐慌或停顿)。
如果您看到的错误没有发生,那么通常可以考虑使用BUG()或BUG_ON(cond)。它们会生成条件错误消息,不应该像非条件printk那样频繁出现
编辑schedule()函数本身通常不是一个好主意(除非你想支持多个运行队列等等)。相反,修改调度器类要好得多,也更容易。看看CFS调度器的代码就可以做到这一点。如果你想完成其他事情,我可以给你更好的建议。
发布于 2013-03-29 01:47:26
在持有运行队列锁的同时调用printk是不安全的。为了在持有运行队列锁(https://lkml.org/lkml/2012/3/13/13)时使用printk_sched,引入了一个特殊的函数printk。不幸的是,它只能在一个节拍内打印一条消息(并且在持有运行队列锁时不能有多个节拍,因为中断是禁用的)。这是因为使用内部缓冲区来保存消息。
您可以使用lttng2将日志记录到用户空间,也可以对printk_sched的实现打补丁,以使用可在一个节拍内使用的静态分配的缓冲池。
发布于 2014-02-24 10:28:04
试试trace_printk()。printk()的开销太大,在前面的printk()调用完成之前,会再次调用schedule()。这将创建一个活动锁。这里有一篇关于它的好文章:https://lwn.net/Articles/365835/
https://stackoverflow.com/questions/14287687
复制相似问题