在搜索调试Linux内核的技术时,其中一种方法是使用 dev _ *()系列函数。
这些功能在/include/linux/device.h
文件中定义。
功能列表如下:
`dev_emerge()`<br>
`dev_alert()`<br>
`dev_crit()`<br>
`dev_err()`<br>
`dev_warning()`<br>
`dev_notice()`<br>
`dev_info()`<br>
我已经尝试过 pr _ *() [pr_emerge()
,pr_alert()
,pr_crit()
...]系列函数,它们类似于< 以某种方式强化> printk()。
使用简单的内核模块进行实验,我将调用这些函数。此外,我还经历了syslog
和dmesg
中显示的消息的优先级(内核环缓冲区取决于console_loglevel-内核变量)。
但我无法理解 dev _ *()系列的用法。我的意思是,我如何在程序中使用它来调试内核功能?
答案 0 :(得分:6)
pr_*()
函数与普通printk()
相同,但已包含KERN_xxx
日志级别。
dev_*()
功能与相应的pr_*()
功能相同,但也会打印有关struct device
的识别信息。
如果您的消息与某些设备相关(通常在驱动程序中就是这种情况),则应使用dev_*()
。
例如,在USB驱动程序中:
struct usb_device *usb_dev;
dev_info(&usb_dev->dev, "hello\n");
struct usb_interface *usb_intf;
dev_info(&usb_intf->dev, "hello\n");
或在PCI驱动程序中:
struct pci_dev *pci;
dev_info(&pci->dev, "hello\n");
答案 1 :(得分:1)
dev_*
函数类似于pr_*
,但也会打印一些有关设备(struct device
)的信息,并将其作为第一个参数传递给它们。此信息可能有助于过滤属于具体设备的消息的系统日志。
因此,只要消息适用于具体设备,您就可以使用dev_*
函数而不是pr_*
。(并且您有它的描述符。)
答案 2 :(得分:1)
使用QEMU检查自己打印的内容
这是它为PCI设备打印的内容:
<6>lkmc_pci 0000:00:04.0: pci_probe
格式为:
<level><kernel-module> <pci-address>: <message>
正如其他人所说,与简单的printk
相比,它提供了额外的设备信息,即:
我用QEMU的“edu”设备测试了这个设备,这是一种简单的教育PCI设备,我写了a minimal Linux kernel module。
关键模块代码是:
static int pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
dev_info(&(dev->dev), "pci_probe\n");
字符设备显然不会显示struct device
,因此您无法以这种方式进行测试:How do you get a struct device for a Linux character device