[笔记分享] [OS] Linux设备模型之基础概念
2017-08-24 16:44
676 查看
Platform: msm8x60
Kernel: 2.6
要想理解设备模型,首先需要知道它由哪些基本数据构成。包含有kobject、kset、device、device_driver、 bus、class、subsystem。下面分别介绍。
![](https://img-blog.csdn.net/20170824164004025?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
主要函数:
void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
int kobject_add(struct kobject *kobj, struct kobject *parent,
const char *fmt, …)
void kobject_put(struct kobject *kobj)
struct kobject *kobject_get(struct kobject *kobj)
它是设备模型中的基本结构,通常被嵌入到其他的结构中。每种kobject都关联到ktype,由kobj_type表示,如下:
![](https://img-blog.csdn.net/20170824164019935?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Ktype是为了描述kobject所具有的普遍特性。因此不需要每次kobject都分别定义,而是将这些特性在ktype中一次定义。
![](https://img-blog.csdn.net/20170824164027561?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
主要函数:
void kset_init(struct kset *k)
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
int kset_register(struct kset *k)
static inline struct kset *kset_get(struct kset *k)
static inline void kset_put(struct kset *k)
一个kset是相同类型的kobject的一个集合。类型是kobj_type类型来描述的。Kset一定会在sysfs里显示出来,而kobject不一定。可认为kset是kobject的容器,在kset内部,包含了自己的kobject。上面一些对kset的处理函数其实都是调用kobject的相关函数来实现的。Kset也可以包含在另一个kset里,和kobject一样。下图是kset和kobject的关系。
![](https://img-blog.csdn.net/20170824164044519?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
struct kset kset;
struct rw_semaphore rwsem;
};
Subsystem是一个或者多个kset的集,它只指向一个kset,或许有人有疑惑那如何找kset,但是多个ksets可以通过其subsys指针指向一个subsystem。
所有的kset都必须属于subsystem,因为他们使用该读写信号量去访问同步访问他们的内部数据。
![](https://img-blog.csdn.net/20170824164058603?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
设备模型中最重要的结构。对于基于总线的设备,会在device基础上衍生出很多类,如platform_device。
![](https://img-blog.csdn.net/20170824164107535?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注册过后的设备在/sys/devices下可以看到。下面是与设备属性相关的内容。
![](https://img-blog.csdn.net/20170824164118003?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170824164136748?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
相关函数:
int driver_register(struct device_driver *drv)
int __must_check driver_attach(struct device_driver *drv);
它也是个比较重要的结构体。一般是嵌入到其他结构体来进行注册的。如我们所使用的platform_driver,如下:
![](https://img-blog.csdn.net/20170824164148477?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注册的时候通过bus来和devices进行匹配。一个driver可以对应多个devices。
![](https://img-blog.csdn.net/20170824164206423?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
相关函数:
int bus_register(struct bus_type *bus)
设备模型里,所有的devices都通过bus相连,模型里还有虚拟的bus。如platform总线。总线之间可以互相插入。每个总线都有自己的子系统,另外包括两个kset,分别是devcie和drvier,所以会在/sys/bus/platform下看到device和driver目录。而klist_devices和klist_drivers是总线支持的设备及驱动链表,用于遍历总线上的驱动和设备。
![](https://img-blog.csdn.net/20170824164213249?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Jpc19mZWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
相关函数:
int __init classes_init(void)
类是一个设备的高层视图,它抽象出了底层的实现细节。比如驱动程序看到的是SCSI磁盘和ATA磁盘,但是在类的层次上,它们都是磁盘而已。类允许用户空间使用设备所能提供的功能,而不关心设备是如何连接的,以及它们是如何工作的。
Kernel: 2.6
要想理解设备模型,首先需要知道它由哪些基本数据构成。包含有kobject、kset、device、device_driver、 bus、class、subsystem。下面分别介绍。
kobject
主要函数:
void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
int kobject_add(struct kobject *kobj, struct kobject *parent,
const char *fmt, …)
void kobject_put(struct kobject *kobj)
struct kobject *kobject_get(struct kobject *kobj)
它是设备模型中的基本结构,通常被嵌入到其他的结构中。每种kobject都关联到ktype,由kobj_type表示,如下:
Ktype是为了描述kobject所具有的普遍特性。因此不需要每次kobject都分别定义,而是将这些特性在ktype中一次定义。
kset
主要函数:
void kset_init(struct kset *k)
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
int kset_register(struct kset *k)
static inline struct kset *kset_get(struct kset *k)
static inline void kset_put(struct kset *k)
一个kset是相同类型的kobject的一个集合。类型是kobj_type类型来描述的。Kset一定会在sysfs里显示出来,而kobject不一定。可认为kset是kobject的容器,在kset内部,包含了自己的kobject。上面一些对kset的处理函数其实都是调用kobject的相关函数来实现的。Kset也可以包含在另一个kset里,和kobject一样。下图是kset和kobject的关系。
subsystem
struct subsystem{struct kset kset;
struct rw_semaphore rwsem;
};
Subsystem是一个或者多个kset的集,它只指向一个kset,或许有人有疑惑那如何找kset,但是多个ksets可以通过其subsys指针指向一个subsystem。
所有的kset都必须属于subsystem,因为他们使用该读写信号量去访问同步访问他们的内部数据。
device
设备模型中最重要的结构。对于基于总线的设备,会在device基础上衍生出很多类,如platform_device。
注册过后的设备在/sys/devices下可以看到。下面是与设备属性相关的内容。
device_driver
相关函数:
int driver_register(struct device_driver *drv)
int __must_check driver_attach(struct device_driver *drv);
它也是个比较重要的结构体。一般是嵌入到其他结构体来进行注册的。如我们所使用的platform_driver,如下:
注册的时候通过bus来和devices进行匹配。一个driver可以对应多个devices。
bus
相关函数:
int bus_register(struct bus_type *bus)
设备模型里,所有的devices都通过bus相连,模型里还有虚拟的bus。如platform总线。总线之间可以互相插入。每个总线都有自己的子系统,另外包括两个kset,分别是devcie和drvier,所以会在/sys/bus/platform下看到device和driver目录。而klist_devices和klist_drivers是总线支持的设备及驱动链表,用于遍历总线上的驱动和设备。
class
相关函数:
int __init classes_init(void)
类是一个设备的高层视图,它抽象出了底层的实现细节。比如驱动程序看到的是SCSI磁盘和ATA磁盘,但是在类的层次上,它们都是磁盘而已。类允许用户空间使用设备所能提供的功能,而不关心设备是如何连接的,以及它们是如何工作的。
相关文章推荐
- [笔记分享] [OS] Linux设备模型之驱动注册
- [笔记分享] [OS] Linux设备模型之设备注册
- 2.linux驱动基础开发1——linux 设备驱动基本概念
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- 【加入自己的部分内容】Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- linux面试题[答案自己修订了下](网络,文件系统,OS,基础概念)
- Linux设备驱动模型学习之基础中的基础篇
- linux驱动基础开发1——linux 设备驱动基本概念
- Linux设备模型中三个很重要的概念: 总线,设备,驱动.即bus,device,driver
- Linux设备模型(1)_基本概念
- linux驱动基础开发1——linux 设备驱动基本概念
- linux设备树笔记__dts基本概念及语法
- 慢慢学Linux驱动开发,第五篇,初探设备模型概念
- Linux程序设计学习笔记----多线程编程基础概念与基本操作
- linux设备模型 kobject/kset/kobjset概念
- Linux设备模型学习笔记——结构体描述
- Linux设备模型基础---操作函数
- Linux设备模型(1)_基本概念
- linux学习笔记2--diver初始化及设备模型
- Linux 程序设计学习笔记----终端及串口编程基础之概念详解