Mientras busca técnicas para depurar un kernel de Linux, una de las formas es usar las funciones de la familia dev_*() .
Estas funciones se definen en el archivo /include/linux/device.h .
La lista de funciones es la siguiente:
`dev_emerge()`<br> `dev_alert()`<br> `dev_crit()`<br> `dev_err()`<br> `dev_warning()`<br> `dev_notice()`<br> `dev_info()`<br> Ya he experimentado con las funciones de la familia pr_*() [ pr_emerge() , pr_alert() , pr_crit() ...], que son similares a printk() de alguna manera.
Se realiza un experimento utilizando módulos de kernel simples donde estoy llamando a estas funciones. Además, también he revisado la prioridad de los mensajes que se muestran en syslog y dmesg (el búfer de anillo del kernel depende de la variable del kernel console_loglevel-a).
Pero no puedo entender el uso de la familia dev_*() . Quiero decir, ¿cómo lo uso en un programa para depurar la funcionalidad del kernel?
Las funciones pr_*() son las mismas que printk() simple, pero con el nivel de registro KERN_xxx ya incluido.
Las funciones dev_*() son las mismas que las funciones pr_*() , pero también imprimen información de identificación sobre el struct device .
Si su mensaje está relacionado con algún dispositivo (que normalmente es el caso de los controladores), debe usar dev_*() . Por ejemplo, en un controlador 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");o en un controlador PCI:
struct pci_dev *pci; dev_info(&pci->dev, "hello\n");Las funciones dev_* son similares a pr_* , pero también imprimen información sobre el dispositivo ( struct device ), que se les pasa como primer argumento. Esta información puede ayudar a filtrar el registro del sistema en busca de mensajes pertenecientes a un dispositivo concreto.
Por lo tanto, puede usar la función dev_* en lugar de pr_* siempre que el mensaje sea aplicable a un dispositivo concreto (y tenga un destripador).
Comprueba lo que imprime tú mismo con QEMU
Esto es lo que imprime para un dispositivo PCI:
<6>lkmc_pci 0000:00:04.0: pci_probeque es de formato:
<level><kernel-module> <pci-address>: <message> Entonces, como dijeron otros, brinda información adicional del dispositivo en comparación con un simple printk , a saber:
Lo probé con el dispositivo "edu" de QEMU, que es un dispositivo PCI educativo simple, para el cual escribí un módulo mínimo del kernel de Linux .
El código del módulo clave es:
static int pci_probe(struct pci_dev *dev, const struct pci_device_id *id) { dev_info(&(dev->dev), "pci_probe\n"); Aparentemente, los dispositivos de caracteres no exponen un struct device , por lo que no puede probarlo de esa manera: ¿Cómo se obtiene un dispositivo de estructura para un dispositivo de caracteres de Linux?