kobject 、kobj_type和kset等
定义在linux/kobject.h中
kobject
(1)各种对象(类、设备、总线、驱动等)最基本单元,提供一些公用型服务如:对象引用计数(kref)、维护对象链表、对象上锁(kset)、对用户空间的表示(kobj_type)
(2)设备驱动模型中的各种对象(每种对象都对应一个结构)其内部都会包含一个kobject
(3)地位相当于面向对象体系架构中的总基类
kobj_type
(1)很多书中简称为ktype,每一个kobject都需要绑定一个ktype来提供相应功能
(2)关键点1:sysfs_ops,提供该对象在sysfs中的操作方法:show(当我们执行cat的时候就是利用这种方法)和store(当我们执行echo的时候就是利用这种方法)
(2)关键点2:attribute,提供在sysfs中以文件形式存在的属性,其实就是应用接口
kset
(1)kset的主要作用是做顶层kobject的容器类
(2)kset的主要目的是将各个kobject(代表着各个对象)组织出目录层次架构
(3)可以认为kset就是为了在sysfs中弄出目录,从而让设备驱动模型中的多个对象能够有层次有逻辑性的组织在一起
总线式设备驱动组织方式
总线
(1)驱动框架中的总线式设计
(2)bus_type结构体,在include/linux/device.h中定义,其中的name为总线的名字,使用该结构体注册的总线在根文件系统中的sys/bus目录下可以看到,例如随便I2C,进去后发现里面有drivers目录(里面便是该总线下所有注册的驱动)、devices目录(里面便是该总线下所有注册的设备,这些设备和驱动是一对一或一对多的匹配的)、以及一些属性信息文件等。dev_pm_ops是一个函数指针集,里面的函数都是和电源管理有关的(所以例如想让某一总线上的所有设备休眠,便可以调用这个函数)。
在bus_type结构体中关键函数是match函数(做设备和驱动的匹配的)和uevent函数
设备(1)struct device是硬件设备在内核驱动框架中的抽象(include/linux/device.h),每一个该结构体类型的变量就定义了一个设备,即所有硬件设备的信息都封装在这个结构里了。
(2)device_register用于向内核驱动框架注册一个设备
(3)通常device结构不会单独使用,而是被包含在一个具体设备结构体中,如struct usb_device(include/linux/usb.h)
驱动
(1)struct device_driver是驱动程序在内核驱动框架中的抽象(include/linux/device.h)
(2)关键元素1:name,驱动程序的名字,很重要,经常被用来作为驱动和设备的匹配依据
(3)关键元素2:probe,驱动程序的探测函数,用来检测一个设备是否可以被该驱动所管理
类
(1)相关结构体:struct class 和 struct class_device
(2)udev的使用离不开class
(3)class的真正意义在于作为同属于一个class的多个设备的容器。也就是说,class是一种人造概念,目的就是为了对各种设备进行分类管理。当然,class在分类的同时还对每个类贴上了一些“标签”,这也是设备驱动模型为我们写驱动提供的基础设施。
从以上可以看出设备(sys/devices)是既从属于类(sys/class),又从属于总线(sys/bus)的
总结
(1)模型思想很重要,其实就是面向对象的思想。
(2)全是结构体套结构体,对基本功(语言功底等)要求很高。