我正在学习嵌入式系统
我需要在用户空间守护程序和内核空间的控制台上打印调试信息,我使用printf作为用户空间,使用printk(KERN_CRIT)作为内核空间。
然而,输出混合成乱并且乱序。我猜KERN_CRIT非常快,有没有干净的方法来做这个工作? 非常感谢
答案 0 :(得分:2)
ftrace可以解决您的问题。
在linux内核中,您可以使用“trace_printk”而不是“printk”来记录信息,同时在用户空间中可以将日志写入文件“trace_marker”。
对于内核空间:
#include/linux/kernel.h
...
trace_printk("Hello, kernel trace printk !\n");
...
对于用户空间
...
trace_fd = open("trace_marker", WR_ONLY);
void trace_write(const char *fmt, ...)
{
va_list ap;
char buf[256];
int n;
if (trace_fd < 0)
return;
va_start(ap, fmt);
n = vsnprintf(buf, 256, fmt, ap);
va_end(ap);
write(trace_fd, buf, n);
}
...
trace_write("Hello, trace in user space \n");
...
您可以在linux内核源代码中找到有关ftrace的详细信息,路径为Documentation / trace / ftrace.txt。
关于ftraces有一些介绍,请关注trace_printk和trace marker。 Debugging the kernel using Ftrace - part 1 Debugging the kernel using Ftrace - part 2
答案 1 :(得分:0)
这似乎是用户和内核空间之间同步的问题。想到两种解决方案。
首先,创建一个debugfs或sysfs接口,它只包含一个表示二进制信号量的值。在打印之前,用户程序和内核每个都将首先&#34; down&#34; debugfs或sysfs文件中的值。打印后,它会&#34; up&#34;它。这可以通过包装函数或宏来实现。
其次,创建一个debugfs接口。内核将始终将其日志发送到该接口而不是printk它们。用户空间守护程序可以不断检查debugfs文件。想要打印的用户程序也会将其日志发送到用户空间守护程序。守护程序可以使用适当的同步机制,如互斥锁,以确保日志永远不会重叠。