欢迎来到天天文库
浏览记录
ID:21766277
大小:46.00 KB
页数:9页
时间:2018-10-24
《linux设备模型详解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、linux设备模型详解1.背景随着设备拓扑结构越来越复杂,需要为内核建立一个统一的设备模型,对系统结构做一般性的抽象描述。有了该抽象结构,可支持多种不同的任务:-电源管理完成电源管理工作需要对系统结构的理解,且有严格的顺序,如:一个USB宿主适配器,在处理完所有与其相连接的设备面前是不能关闭的;-与用户空间通信由/sysfs虚拟文件系统展示设备的属性-热插拔设备-对象生命周期2.sysfs虚拟文件系统sysfs是一个特殊的文件系统,类似于/proc。sysfs不仅象/proc一样允许用户空间访问内核的数据,而且它以更结构化的方式向用户提供内核数据信息。sysfs的一个目的就是展示
2、设备驱动模型中各组件的层次关系。其顶级目录包括:-block-device-bus-drivers-class-power-firmware每个目录代表一个kobject对象,每个文件代表kobject的属性。3.Kobject、Kset和subsystemKobjectKobject是组成设备模型的基本结构。类似于C++中的基类,它嵌入于更大的对象的对象中--所谓的容器--用来描述设备模型的组件。如bus,devices,drivers都是典型的容器。容器有了kobject之后,允许内核:n保存对容器的引用计数n保存容器之间的层次关系n为每个容器的属性提供一个用户视图struc
3、tkobject{char*k_name;charname[20];structk_refkref;structlist_headentry;structkobject*parent;structkset*kset;structktype*ktype;structdentry*dentry;};structkobj_type{void(*release)(structkobject*);structsysfs_ops*sysfs_ops;structattribute**default_attrs;};Kset一个kset是嵌入相同类型结构的kobject集合。structkse
4、t{structsubsystem*subsys;structkobj_typektype;structlist_headlist;structkobjectkobj;structkset_hotplug_ops*hotplug_ops;};Subsystem一系列的kset就组成了subsystem.subsystem可以包括不同类型的kset,它只有两个成员structsubsystem{structksetkset;structrw_semaphorerwsem;};2.设备驱动模型的组件devicestructdevice{structlist_headnode;stru
5、ctlist_headbus_list;structlist_headdriver_list;structlist_headchildren;structdevice*parent;structkobjectkobj;char[]bus_id;structbus_type*bus;structdevice_driver*driver;void*driver_data;void*platform_data;.....void(*)(struct*device)release;};driverstructdevice_driver{char*name;structbus_type*b
6、us;structsemaphoreunload_sem;structkobjectkobj;structlist_headdevices;structmodule*owner;int(*probe)(structdevice*);int(*remove)(structdevice*);void(*shutdown)(structdevice*);int(*suspend)(structdevice*unsignedlong,unsignedlong);int(*resume)structdevice*,unsignedlong);};busstructbus_type{char
7、*name;structsubsystemsubsys;structksetdrivers;structksetdevices;structbus_attribute*bus_attrs;structdevice_attribute*dev_attrs;structdriver_attribute*drv_attrs;int(*match)(structdevice*,structdevice_driver*);int(*hotplug)(structdevice*,char**
此文档下载收益归作者所有