问题标签 [printk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
233 浏览

c - copy_to_user() 不断打印消息

我正在学习“Linux 设备驱动程序”。我创建了一个名为char_device. 当我从设备读取数据时,它会不断将消息打印到终端,使机器无限崩溃。

驱动中读操作的源码:

用于读取设备的用户空间命令:

驱动程序不断打印“来自内核世界的你好!” 向终端发送消息。

0 投票
2 回答
431 浏览

linux - Linux 进程/线程可以在不通过 do_exit() 的情况下终止吗?

为了验证我想使用的第三方二进制分布式软件的行为,我正在实现一个内核模块,其目标是跟踪该软件产生和终止的每个子节点。

目标二进制文件是 Golang 生成的二进制文件,它是多线程的。我编写的内核模块在内核函数_do_fork()do_exit()上安装了钩子,以跟踪该二进制文件产生和终止的每个进程/线程。

LKM 或多或少有效。

然而,在某些情况下,我有一个我无法解释的场景。似乎一个进程/线程可以在不通过do_exit()的情况下终止。

我通过printk()收集的证据显示了进程的创建,但并不表示进程的终止。

我知道printk()可能会很慢,而且我也知道在这种情况下消息可能会丢失。

为了防止由于控制台速度慢而导致消息丢失(对于这个特定的应用程序,使用串行 tty 115200),我尝试实现一个更快的控制台,并且使用netconsole收集了消息。

所描述的设置似乎证实了一个进程可以在不通过do_exit()函数的情况下终止。

但是因为我不确定我的消息不会在printk()基础架构上丢失,所以我决定重复相同的测试,但将printk()替换为ftrace_printk(),这应该是printk()的更精简的替代方案。

还是一样的结果,偶尔我看到进程没有通过do_exit(),并且验证PID当前是否正在运行,我不得不面对它没有运行的事实。

另请注意,我将钩子放在do_exit()内核函数中作为第一条指令,以确保函数流不会在被调用函数内终止。

我的问题如下:

Linux 进程可以在其流程不通过do_exit()函数的情况下终止吗?

如果是这样,有人可以告诉我这种情况可能是什么吗?

0 投票
0 回答
51 浏览

c - 在 tracepoint 中使用 printk 会导致系统死机

我在学习Linux的tracepoint相关知识,自己写了一个模块,如下图。

当我在命令行输入 insmod 命令并回车时,系统没有响应。经过多次实验,发现这个问题是在probe函数(sys_enter_probe)中写count或者使用printk的时候出现的。我对内核中的各种机制了解不多,希望有人能告诉我我的代码违反了哪些规则,以及我在哪里可以学习这些规则。

0 投票
0 回答
38 浏览

linux-kernel - 无论引导参数 console= 的值如何,如何让我的模块中的 printk 在串行控制台上显示消息

我正在工作的电路板有一个串行控制台(ttyS0),我想让我的内核模块向这个串行控制台显示任何错误。我知道一种可能性是使用console=ttyS0参数来打印串行上出现的消息,但是,就我而言,具体而言,我无法设置此参数(例如,我的引导加载程序不允许设置console=...)并且我的模块消息最终会丢失。另外,我知道可以在 dmesg/syslog 中检索这些内核消息,但这不是我想要的。

console=...不管内核参数定义了什么,有没有办法让我的模块写入串行控制台(例如 ttyS0) ?

0 投票
1 回答
76 浏览

linux-kernel - RPi4:设备驱动程序 - 带有浮点数的 pr_info 导致构建错误

我正在为Raspberry Pi 4中的传感器开发设备驱动程序。在传感器的内核设备驱动程序中,我使用以下代码打印结果距离

pr_info( "Distance (cm) : %.2f \n", cm );

在哪里cm被宣布为,float cm = 0.0;

在制作文件时,我收到以下错误

当我注释掉上述代码行时pr_info( "Distance (cm) : %.2f \n", cm );,驱动程序的制作是成功的

Makefile 的内容

我找不到解决方案。我们不能打印浮动值吗? 上面提到的代码我用来pr_info()打印一个没有给出任何错误的整数。

0 投票
0 回答
163 浏览

logging - 如何将日志从内核空间写入特定文件?

我有一个使用 printk() 进行调试的内核模块。printk() 记录到 /var/log/messages。/var/log/messages 也包含其他模块的信息。我正在尝试为我的模块实现动态跟踪。我的计划是使用 ioctl 调用来设置不同的日志记录/跟踪级别,然后将模块中的信息记录到不同的路径 (my_module.log)。

我没有获得有关如何将日志从内核空间(内核模块内部)写入特定文件的信息?我已经检查了 rsyslog,但如果它可以在内核模块中使用,则找不到任何信息。

我看到一个类似的问题,但它没有帮助。 Linux内核:记录到特定文件

你能建议任何线索吗?

0 投票
0 回答
21 浏览

openvswitch - OpenvSwitch搭建、安装和测试问题

我正在尝试在 Ubuntu 18.04 上安装 OpenvSwitch。我有两个内核版本,分别是 5.11.0-27-generic 和 5.4.0-42-generic。我将 ./configure 设置为构建 5.4.0-42-generic 版本。然后我使用命令'make modules_install',我收到以下消息

/sbin/depmod sed -n 's/#define UTS_RELEASE "\([^"]*\)"/\1/p' /lib/modules/5.4.0-42-generic/build/include/generated/utsrelease.h"

结果似乎成功了。但是,我使用 mininet 来设置一个拓扑,其中三个 eth 连接到一个交换机。'mn --topo=single,3 --controller=none --mac' 接下来我添加一个流,即 'ovs-ofctl add-flow s1 action=normal' 和 'pingall' Wireshark 获取所有 icmp 数据包。我提前在 vport.c 中添加了一个代码。代码是 'printk(KERN_ERR "\r\n!!!print1 !!!\r\n)"' 但是,dmesg 不显示 printk。我发现 'insmod' 命令会显示以下错误 'insmod: ERROR: could not insert module openvswitch.ko: Invalid module format' 我的构建和安装过程有什么问题吗?如何在 dmesg 中显示 printk 消息?

0 投票
0 回答
53 浏览

c - 如何知道状态机转换期间的控制流?

我一直在研究基于意大利面条的状态机,这意味着它是由一堆if-else散布在各处的语句组成的,最近在大型内核模块中,以便将该模块移植到其他平台

为了理解控制流如何在每个状态之间进行,我printk()首先使用打印每个行号,以便我可以在运行时查看程序行为的每个细节。但是,太多printk()会增加太多的处理负载并导致错误的行为。

之后,我尝试printk_once()减少printk_ratelimited()行数。但是这种方式会导致另一个问题,尤其是在过渡期间。

让我解释一下原因:

假设有四个状态ABCD,并且每个状态的控制流彼此部分重叠。此外,还有两个事件e1e2我可以通过插入/拔出硬件来触发。

此外,我们将状态定义stable state为稳定状态,这意味着该状态的控制流路径在事件发生之前不会改变;我们还将状态定义unstable state为不稳定状态,这意味着该状态只是其他状态的过渡状态。

如果我使用printk_once(),我将无法获得整个控制流的所有路径AC因为它的某些部分是相同的,并且已经被打印出来。

如果我使用printk_ratelimited(),则不能保证捕获从A到转换的控制流路径,C因为跨度太短而无法捕获。

我想要的是一个控制流,它清楚地显示程序如何从一个状态A逐步B然后再到C,这样我就可以完全理解每个状态之间发生了什么。

而已。

我想知道人们是如何处理这个问题的。谢谢!