天天看点

[笔记分享] [OS] Linux设备模型之基础概念

Platform: msm8x60

Kernel: 2.6

要想理解设备模型,首先需要知道它由哪些基本数据构成。包含有kobject、kset、device、device_driver、 bus、class、subsystem。下面分别介绍。

kobject

[笔记分享] [OS] Linux设备模型之基础概念

主要函数:

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表示,如下:

[笔记分享] [OS] Linux设备模型之基础概念

Ktype是为了描述kobject所具有的普遍特性。因此不需要每次kobject都分别定义,而是将这些特性在ktype中一次定义。

kset

[笔记分享] [OS] Linux设备模型之基础概念

主要函数:

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的关系。

[笔记分享] [OS] Linux设备模型之基础概念

subsystem

struct subsystem{

struct kset kset;

struct rw_semaphore rwsem;

};

Subsystem是一个或者多个kset的集,它只指向一个kset,或许有人有疑惑那如何找kset,但是多个ksets可以通过其subsys指针指向一个subsystem。

所有的kset都必须属于subsystem,因为他们使用该读写信号量去访问同步访问他们的内部数据。

device

[笔记分享] [OS] Linux设备模型之基础概念

设备模型中最重要的结构。对于基于总线的设备,会在device基础上衍生出很多类,如platform_device。

[笔记分享] [OS] Linux设备模型之基础概念

注册过后的设备在/sys/devices下可以看到。下面是与设备属性相关的内容。

[笔记分享] [OS] Linux设备模型之基础概念

device_driver

[笔记分享] [OS] Linux设备模型之基础概念

相关函数:

int driver_register(struct device_driver *drv)

int __must_check driver_attach(struct device_driver *drv);

它也是个比较重要的结构体。一般是嵌入到其他结构体来进行注册的。如我们所使用的platform_driver,如下:

[笔记分享] [OS] Linux设备模型之基础概念

注册的时候通过bus来和devices进行匹配。一个driver可以对应多个devices。

bus

[笔记分享] [OS] Linux设备模型之基础概念

相关函数:

int bus_register(struct bus_type *bus)

设备模型里,所有的devices都通过bus相连,模型里还有虚拟的bus。如platform总线。总线之间可以互相插入。每个总线都有自己的子系统,另外包括两个kset,分别是devcie和drvier,所以会在/sys/bus/platform下看到device和driver目录。而klist_devices和klist_drivers是总线支持的设备及驱动链表,用于遍历总线上的驱动和设备。

class

[笔记分享] [OS] Linux设备模型之基础概念

相关函数:

int __init classes_init(void)

类是一个设备的高层视图,它抽象出了底层的实现细节。比如驱动程序看到的是SCSI磁盘和ATA磁盘,但是在类的层次上,它们都是磁盘而已。类允许用户空间使用设备所能提供的功能,而不关心设备是如何连接的,以及它们是如何工作的。

继续阅读