闯江湖zjp.blog.chinaunix.net
lin606
全部博文(107)
2013年(2)
2012年(31)
2011年(18)
2010年(12)
2009年(44)
xyson
dylancao
ui56
美丽的时
格伯纳
浪花小雨
zhjiado
ddup_201
wfugv
Buddy_Zh
zhanghom
分类: LINUX
2009-10-11 11:15:47
http://hi.baidu.com/csdeny/blog文章出处:2007-04-29 10:243. 内核对象机制主要相关函数针对内核对象不同层次的数据结构,linux 2.6内核定义了一系列操作函数,定义于lib/kobject.c文件中。3.1 kobject相关函数void kobject_init(struct kobject * kobj);kobject初始化函数。设置kobject引用计数为1,entry域指向自身,其所属kset引用计数加1。int kobject_set_name(struct kobject *kobj, const char *format, ...);设置指定kobject的名称。void kobject_cleanup(struct kobject * kobj)和void kobject_release(struct kref *kref);kobject清除函数。当其引用计数为0时,释放对象占用的资源。struct kobject *kobject_get(struct kobject *kobj);将kobj 对象的引用计数加1,同时返回该对象的指针。void kobject_put(struct kobject * kobj);将kobj对象的引用计数减1,如果引用计数降为0,则调用kobject_release()释放该kobject对象。int kobject_add(struct kobject * kobj);将kobj对象加入Linux设备层次。挂接该kobject对象到kset的list链中,增加父目录各级kobject的引用计数,在其parent指向的目录下创建文件节点,并启动该类型内核对象的hotplug函数。int kobject_register(struct kobject * kobj);kobject注册函数。通过调用kobject_init()初始化kobj,再调用kobject_add()完成该内核对象的注册。void kobject_del(struct kobject * kobj);从Linux设备层次(hierarchy)中删除kobj对象。void kobject_unregister(struct kobject * kobj);kobject注销函数。与kobject_register()相反,它首先调用kobject_del从设备层次中删除该对象,再调用kobject_put()减少该对象的引用计数,如果引用计数降为0,则释放该kobject对象。3.2 kset相关函数与kobject 相似,kset_init()完成指定kset的初始化,kset_get()和kset_put()分别增加和减少kset对象的引用计数。 Kset_add()和kset_del()函数分别实现将指定keset对象加入设备层次和从其中删除;kset_register()函数完成 kset的注册而kset_unregister()函数则完成kset的注销。3.3 subsystem相关函数subsystem有一组完成类似的函数,分别是:void subsystem_init(struct subsystem *subsys);int subsystem_register(struct subsystem *subsys);void subsystem_unregister(struct subsystem *subsys);struct subsystem *subsys_get(struct subsystem *subsys)void subsys_put(struct subsystem *subsys);4. 设备模型组件在上述内核对象机制的基础上,Linux的设备模型建立在几个关键组件的基础上,下面我们详细阐述这些组件。4.1 devices系统中的任一设备在设备模型中都由一个device对象描述,其对应的数据结构struct device定义为:struct device {struct list_head g_list; struct list_head node;struct list_head bus_list;struct list_head driver_list;struct list_head children;struct device *parent;struct kobject kobj;char bus_id[BUS_ID_SIZE];struct bus_type *bus;struct device_driver *driver;void *driver_data;/* Several fields omitted */};g_list 将该device对象挂接到全局设备链表中,所有的device对象都包含在devices_subsys中,并组织成层次结构。Node域将该对象挂接 到其兄弟对象的链表中,而bus_list则用于将连接到相同总线上的设备组织成链表,driver_list则将同一驱动程序管理的所有设备组织为链 表。此外,children域指向该device对象子对象链表头,parent域则指向父对象。Device对象还内嵌一个kobject对象,用于引 用计数管理并通过它实现设备层次结构。Driver域指向管理该设备的驱动程序对象,而driver_data则是提供给驱动程序的数据。Bus域描述设 备所连接的总线类型。内核提供了相应的函数用于操作device对象。其中Device_register()函数将一个新的device对象插 入设备模型,并自动在/sys/devices下创建一个对应的目录。Device_unregister()完成相反的操作,注销设备对象。 Get_device()和put_device()分别增加与减少设备对象的引用计数。通常device结构不单独使用,而是包含在更大的结构中作为一 个子结构使用,比如描述PCI设备的struct pci_dev,其中的dev域就是一个device对象。4.2 drivers系统中的每个驱动程序由一个device_driver对象描述,对应的数据结构定义为:struct device_driver {char *name; 设备驱动程序的名称struct bus_type *bus; 该驱动所管理的设备挂接的总线类型struct kobject kobj; 内嵌kobject对象struct list_head devices; 该驱动所管理的设备链表头int (*probe)(struct device *dev); 指向设备探测函数,用于探测设备是否可以被该驱动程序管理int (*remove)(struct device *dev); 用于删除设备的函数/* some fields omitted*/};与device 结构类似,device_driver对象依靠内嵌的kobject对象实现引用计数管理和层次结构组织。内核提供类似的函数用于操作 device_driver对象,如get_driver()增加引用计数,driver_register()用于向设备模型插入新的driver对 象,同时在sysfs文件系统中创建对应的目录。Device_driver()结构还包括几个函数,用于处理热拔插、即插即用和电源管理事件。4.3 buses系统中总线由struct bus_type描述,定义为:struct bus_type { char * name; 总线类型的名称struct subsystem subsys; 与该总线相关的subsystemstruct kset drivers; 所有与该总线相关的驱动程序集合struct kset devices; 所有挂接在该总线上的设备集合struct bus_attribute * bus_attrs; 总线属性struct device_attribute * dev_attrs; 设备属性struct driver_attribute * drv_attrs; 驱动程序属性int (*match)(struct device * dev, struct device_driver * drv);int (*hotplug) (struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size); int (*suspend)(struct device * dev, u32 state);int (*resume)(struct device * dev);};每 个bus_type对象都内嵌一个subsystem对象,bus_subsys对象管理系统中所有总线类型的subsystem对象。每个 bus_type对象都对应/sys/bus目录下的一个子目录,如PCI总线类型对应于/sys/bus/pci。在每个这样的目录下都存在两个子目 录:devices和drivers(分别对应于bus_type结构中的devices和drivers域)。其中devices子目录描述连接在该总 线上的所有设备,而drivers目录则描述与该总线关联的所有驱动程序。与device_driver对象类似,bus_type结构还包含几个函数 (match()、hotplug()等)处理相应的热插拔、即插即拔和电源管理事件。4.4 classes系统中的设备类由 struct class描述,表示某一类设备。所有的class对象都属于class_subsys子系统,对应于sysfs文件系统中的/sys/class目录。 每个class对象包括一个class_device链表,每个class_device对象表示一个逻辑设备,并通过struct class_device中的dev域(一个指向struct device的指针)关联一个物理设备。这样,一个逻辑设备总是对应于一个物理设备,但是一个物理设备却可能对应于多个逻辑设备。此外,class结构中 还包括用于处理热插拔、即插即拔和电源管理事件的函数,这与device对象和driver对象相似。
上一篇:Socket编程知识必学
下一篇:linux设备模型详解1
登录 注册