通常,dmesg 条目前面会加上向缓冲区发送消息的驱动程序的名称。这样可以轻松追踪错误来源以及如何修复它。就我而言,以下消息没有关于它的元信息:
[12208.948242] Pin 28 not available for GPIO
这个字符串(或相关子字符串)似乎没有出现在 Linux 内核源中,因此一定存在驱动程序或某些东西。
除了搜索我能找到的在这台机器上运行的所有源代码之外,还有什么办法可以找出WHO发送此消息以便我可以进一步诊断为什么发生了这个特定错误?
笔记这个问题不一定是关于这个特定的消息,而是一个关于如何回溯并找到违规司机的一般问题
答案1
那么,查找内核源代码正是找出答案的最佳方法:
bericote [~/src/linux] % git grep -F "not available for GPIO"
drivers/gpio/gpio-thunderx.c: WARN_RATELIMIT(!rv, "Pin %d not available for GPIO\n", line);
所以答案似乎是gpio-thunderx
模块,但我怀疑这并不能回答你真正想问的问题。
您真正想知道的是什么原因导致了它,但发出它的代码是一个通用检查,由尝试访问 GPIO 引脚的各种例程调用,而您可能真正想知道的是谁调用了该例程 - 换句话说,内核的哪个部分正在尝试将非 GPIO 的东西作为 GPIO 进行访问。
答案2
司机似乎是gpio-thunderx
(见这里)
dmesg
更一般地说,如果驱动程序本身没有在其名称前添加前缀,我认为您无法推断哪个驱动程序写了特定的行。您需要检查源代码。