driver_register源码研究 device_driver结构体比起device的要简单很多,变量的作用大多都是望文生义了其中bool suppress_bind_attrs的作用是用于禁止在驱动目录下生成bind和unbind文件,这两个文件可以通过写入设备名称选择绑定或者解绑驱动与设备一般定义driver时候,只需要填写 bus owner name of_match_table probe remove这几个就够用了比如spi_driver中,就在driver的基础上进行了封装,同时注册的时候,其专用的注册函数spi_register_driver中帮忙补充了bus信息,owner信息driver_privatelinux中class,bus,driver等都将对外接口和私有的数据通过private指针进行了分割kobj代表driver在sysfs层级结构中的位置,也代表其在/sys/bus/什么总线/driver中的位置klist_devices: 通过device那边提供的knode,将当前驱动匹配成功的device串起来,能够线程安全的遍历和删除knode_bus: 作为bus的private数据中的klist_drivers的成员,让bus随便方便访问和遍历mkobj:指向对应/sys/module/中模块文件夹在sysfs的层级结构的kobjdriver:指回自己所属的driverdriver_register简单了解一下注册流程155行,可能会发出警告的原因是对于一些系统已经有的总线类型,系统会通过特定bus来调用特有的probe,而不是直接调用内嵌device_driver的probe比如下图的platform_driver,其probe就是在device_driver之外实现的这样的好处是总线统一调度,传入的参数直接就是该总线对应的特殊类型的device161行,判断一下有无同名驱动167行,是真正核心的添加驱动函数,后面详细展开讲170行,给/sys中驱动对应的文件夹添加属性文件175行,给用户空间发送一个kobj_add的通知事件,即/sys/bus/driver/driver名称 KOBJ_ADD事件主要的核心内容是167行的bus_add_driver,解析如下bus_add_driver第一段686行,给device_driver的私有数据申请空间694行,指定当前device_driver的私有数据的内嵌kobj属于当前bus私有数据内嵌的kset这里不直接指定kobj的父亲,但是对于没有父亲的kobj来说,695行执行kobj的add后,内部会自动选择父亲为其所属kset的kobj700行,挂载driver到bus的klist上701行,开启工作线程,进行驱动匹配加载的工作第二段712行,添加driver到自己的module中,module在sysfs中的层级位置对应/sys/module/模块名714行,创建driver属性文件到/sys/bus/xxxbus/driver/driver名的目录中719行,创建总线上driver共有的属性文件到driver的目录中727行,判断要不要添加bind和unbind允许用户手动绑定和解绑设备与驱动匹配的可写文件