2015-07-13 156 views
4

搜索調試Linux內核的技術時,其中一種方法是使用dev _ *()家族函數。這些功能在/include/linux/device.h文件中定義。
功能列表如下:
dev_emerge()
dev_alert()
dev_crit()
dev_err()
dev_warning()
dev_notice()
dev_info()
在調試內核時,dev _ *()系列函數如何有用?

我已經與PR _ *() [pr_emerge(),試驗,pr_crit() ...]家庭功能,它們以某種方式與printk()相似。使用簡單的內核模塊來完成實驗,我將這些函數調用。此外,我還優先處理了在syslogdmesg(內核環緩衝區取決於console_loglevel - 內核變量)中顯示的消息。

但我無法理解使用dev _ *()家庭。我的意思是如何在程序中使用它來調試內核功能。
任何人都可以幫助我嗎?

回答

5

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"); 
+0

是它,對內核推動信息一起Ring Buffer,它也會把一些信息放在設備特定的日誌裏,dev _ *()函數如果是這樣,那麼在哪裏設置特定的日誌? – Novice

+0

該信息只是以實際消息爲前綴。 –

1

dev_*功能類似pr_*,但也打印一些關於設備的信息(struct device),作爲第一個參數傳遞給它們。該信息可能有助於過濾屬於具體設備的消息的系統日誌。

因此,只要消息適用於具體設備(並且您具有destriptor),則可以使用dev_*函數代替pr_*

1

檢查什麼它打印自己與QEMU

這是它打印一個PCI設備:

<6>lkmc_pci 0000:00:04.0: pci_probe 

這是墊:

<level><kernel-module> <pci-address>: <message> 

所以當有人說,它比作一個簡單的printk,即提供額外設備的信息:

  • 內核模塊名稱
  • PCI地址

我測試了一下與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