设备驱动 --- device_driver

本文深入探讨了驱动程序的定义、注册与注销过程,以及如何通过系统属性结构实现驱动程序的配置与管理。详细解释了`device_driver`结构体、`driver_register`与`driver_unregister`函数的作用,并介绍了驱动程序属性的声明与创建方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 驱动程序device_driver定义:
    struct device_driver {
        const char        *name;                  //驱动程序名
        struct bus_type        *bus;               //驱动程序所操作的总线类型
        struct module        *owner;
        const char        *mod_name;    /* used for built-in modules */
        bool suppress_bind_attrs;    /* disables bind/unbind via sysfs */
    #if defined(CONFIG_OF)
        const struct of_device_id    *of_match_table;
    #endif
        int (*probe) (struct device *dev);        //probe函数用来查询特定设备是否存在。
        int (*remove) (struct device *dev);      
        void (*shutdown) (struct device *dev);
        int (*suspend) (struct device *dev, pm_message_t state);
        int (*resume) (struct device *dev);
        const struct attribute_group **groups;
        const struct dev_pm_ops *pm;
        struct driver_private *p;
    };
2. device_driver的注册和注销,driver_register()/ driver_unregister():

    /**
     * driver_register - register driver with bus
     * @drv: driver to register
     *
     * We pass off most of the work to the bus_add_driver() call,
     * since most of the things we have to do deal with the bus
     * structures.
     */
    int driver_register(struct device_driver *drv)
    {
        int ret;
        struct device_driver *other;
        BUG_ON(!drv->bus->p);
        if ((drv->bus->probe && drv->probe) ||
         (drv->bus->remove && drv->remove) ||
         (drv->bus->shutdown && drv->shutdown))
            printk(KERN_WARNING "Driver '%s' needs updating - please use "
                "bus_type methods\n", drv->name);
        other = driver_find(drv->name, drv->bus);
        if (other) {
            put_driver(other);
            printk(KERN_ERR "Error: Driver '%s' is already registered, "
                "aborting...\n", drv->name);
            return -EBUSY;
        }
        ret = bus_add_driver(drv);    //把driver添加到bus去。
        if (ret)
            return ret;
        ret = driver_add_groups(drv, drv->groups);    //加进组里
        if (ret)
            bus_remove_driver(drv);
        return ret;
    }
    EXPORT_SYMBOL_GPL(driver_register);
    /**
     * driver_unregister - remove driver from system.
     * @drv: driver.
     *
     * Again, we pass off most of the work to the bus-level call.
     */
    void driver_unregister(struct device_driver *drv)
    {
        if (!drv || !drv->p) {
            WARN(1, "Unexpected driver unregister!\n");
            return;
        }
        driver_remove_groups(drv, drv->groups);
        bus_remove_driver(drv);
    }
    EXPORT_SYMBOL_GPL(driver_unregister);

3. 驱动程序的属性结构,driver_attribute:

    struct driver_attribute {
        struct attribute attr;
        ssize_t (*show)(struct device_driver *driver, char *buf);
        ssize_t (*store)(struct device_driver *driver, const char *buf,
                 size_t count);
    };

a. 可用 DRIVER_ATTR 宏声明:

    #define DRIVER_ATTR(_name, _mode, _show, _store)    \
    struct driver_attribute driver_attr_##_name =        \
        __ATTR(_name, _mode, _show, _store)

b.也可用下面函数创建属性文件:

    /**
     * driver_create_file - create sysfs file for driver.
     * @drv: driver.
     * @attr: driver attribute descriptor.
     */
    int driver_create_file(struct device_driver *drv,
             const struct driver_attribute *attr)
    {
        int error;
        if (drv)
            error = sysfs_create_file(&drv->p->kobj, &attr->attr);
        else
            error = -EINVAL;
        return error;
    }
    EXPORT_SYMBOL_GPL(driver_create_file);
    /**
     * driver_remove_file - remove sysfs file for driver.
     * @drv: driver.
     * @attr: driver attribute descriptor.
     */
    void driver_remove_file(struct device_driver *drv,
                const struct driver_attribute *attr)
    {
        if (drv)
            sysfs_remove_file(&drv->p->kobj, &attr->attr);
    }
    EXPORT_SYMBOL_GPL(driver_remove_file);


DriverStudio 3.2是迄今为止最完备的驱动开发工具套件,它所提供的工具覆盖了 驱动开发的方方面面。DriverStudio套件中的所有工具都与Visual Studio IDE环 境集成在一起。开发人员可以在Visual Studio .NET 2002和2003环境中编写并测 试驱动程序,并且通过使用Microsoft C++编译器与Microsoft DDK完全保持兼容。 在这个版本中,所有工具的功能都得到了加强并且让开发人员可以更容易的开发优 质的驱动程序,这个版本的DriverStudio包括下列工具: DriverWorks DriverNetworks Visual SoftICE SoftICE BoundsChecker Driver Edition TrueTime Driver Edition TrueCoverage Driver Edition DriverWorks和DriverNetworks是DriverStudio的两个主要框架工具,可以提高开发 驱动程序的速度。DriverWorks简化了开发NT和WDM驱动程序的工作;DriverNetworks 则帮助开发人员毫不费力的创建和定制网络驱动程序。目前的版本可以让驱动程序 开发人员来回切换开发工具而无需改变开发环境。 DriverWorks和DriverNetworks还都提供了全新的DriverWizard,可以用C语言来创建 Windows设备驱动程序。另外,DriverWorks和DriverNetworks还为Visual Studio .NET 提供了全新的菜单和工具条,让开发人员可以使用Windows DDK编译器和链接器来build 驱动程序。 DriverWorks的类库和实例现在已经支持开发虚拟COM端口的驱动程序了。 Visual SoftICE是一个双机的系统级调试器,提供了多窗口,可配置的图形化用户界面 来帮助开发人员调试核心级的驱动程序,应用程序甚至于整个操作系统。 Visual SoftICE的最新版本在性能,功能以及用户界面上都有很大提高,其他新特性还 包括: 完全支持AMD 64位的Opteron和Athlon64处理器所提供的10个新命令: SYMLINK, DEVMGR, DP, TDIR, TMKDIR, TMOVE, TRENAME, TRMDIR, TRMFILE和TVOL。 SoftICE支持单机,用串行线连接的双机或是通过TCP/IP连接的远程计算机上的核心 级和用户级的调试。在DriverStudio 3.1版本中,SoftICE可以: 支持VMware 4.0 在"DriverStudio Config"中提供了一个新的反编译选项页 符号加载器提供了改进后的新界面 BoundsChecker Driver Edition是一个错误侦测工具,可以实施分析和侦测设备驱动 程序的错误。开发人员可以马上发现并修正这些错误,不用像以前那样要在数小时后 才能完成。新增的改进还有: 开发人员修改程序设置之后无需重启计算机 让开发人员可以记录驱动程序中的user-written函数。开发人员可以清楚地看到开发 中驱动程序在运行时的情况 可以查看DriverWorkbench内置的事件页汇总信息,包括记录了多少错误和泄漏问题 提供SoftICE事件命令的新开关参数,用来标示BoundsChecker当前监视的驱动程序 改进的自旋锁(spinlock)错误侦测 TrueTime Driver Edition可以用来改善驱动程序的性能问题,它可以准确地指出导致 速度变慢的代码和性能瓶颈。在DriverStudio 3.1版本中,用户可以将两个或多个测试 数据文件合并为一个,用来比较不同条件下改变代码所带来的性能提高情况。新增的改 进还有: 从系统性能计数器中收集数据 全新的"Custom Chart"为所有的函数,IRP和性能数据提供了集成可定制的显示方式 在文件系统可用之前即可开始收集性能数据 显示的数据可以导出为以逗号分割的文本文件,以备后续处理 TrueCoverage Driver Edition是一个代码辅助工具,它可以在没有源代码和符号文件的 情况下收集代码的辅助信息。驱动开发人员可以以图形化的方式查看代码结构,另外: 同时支持NMS和PDB符号文件 可以获取以下辅助数据:每个线程的基本信息,符合条件的辅助信息和部分执行的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值