Linux 内核启动信息的打印 --- dev_driver_string函数/dev_name函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hpu11/article/details/80688565

内核启动时,常会打印出一些信息:开头是 "驱动模块的名字: + 具体的信息"

如:在运行的linux系统设备上,插入鼠标,就会打印出鼠标的相关信息;

[  402.134068] input: USB Optical Mouse as /devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0/usb1/1-1/1-1:1.0/0003:0461:4D81.0003/input/input3
[  402.149618] hid-generic 0003:0461:4D81.0003: input: USB HID v1.11 Mouse [USB Optical Mouse] on usb-ci_hdrc.0-1/input0

红色标注的 "input: " 是鼠标插入式,内核检测到,鼠标是输入设备,于是就把将鼠标与输入模块的驱动。

红色标注的"hid-generic 0003:0461:4D81.0003" 是鼠标匹配的驱动是输入模块的hid-generic驱动。

这样的信息输出通常都是有 dev_info/dev_err/dev_notice/...., 具体可参考:linux/include/linux/device.h文件中这些函数的定义。

这些函数的定义格式都是相同的,只是输出等级不同,即print_level不同。

dev_info(dev, “%s[%d] \n”, __func__, __LINE__);

这是第一个参数不同,后两个就是printk的参数相同,格式也相同。

第一个参数dev: 就是将这个设备的模块的名字等信息相同, 最终还是调用printk打印出来.

通常,dev第一个参数的打信息,是用两个函数从dev中获取信息。

const char *dev_driver_string(const struct device *dev)
{
        struct device_driver *drv;


        /* dev->driver can change to NULL underneath us because of unbinding,
         * so be careful about accessing it.  dev->bus and dev->class should
         * never change once they are set, so they don't need special care.
         */
        drv = ACCESS_ONCE(dev->driver);
        return drv ? drv->name :
                        (dev->bus ? dev->bus->name :
                        (dev->class ? dev->class->name : ""));

}

调用这个函数可以输出 "hid-generic"

static inline const char *dev_name(const struct device *dev)
{
        /* Use the init name until the kobject becomes available */
        if (dev->init_name)
                return dev->init_name;


        return kobject_name(&dev->kobj);

}

调用这个函数,可以输出" 0003: ......"

dev_driver_string() / dev_name() 是内核调试打印信息中常用的输出函数

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页