博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struct device 结构
阅读量:4048 次
发布时间:2019-05-25

本文共 4929 字,大约阅读时间需要 16 分钟。

一、定义:
linux/include/linux/device.h
struct  {
struct ; struct ; /* node in sibling list */ struct ; struct ; struct *; struct ; char []; /* position on parent bus */ struct *; unsigned :1; unsigned :1; struct ; /* semaphore to synchronize calls to * its driver. */ struct * ; /* type of bus device is on */ struct *; /* which driver has allocated this device */ void *; /* data private to the driver */ void *; /* Platform specific data, device core doesn't touch it */ struct ; #ifdef int ; /* NUMA node this device is close to */ #endif *; /* dma mask (if dma'able device) */ ;/* Like dma_mask, but for alloc_coherent mappings as not all hardware supports 64 bit addresses for consistent allocations such descriptors. */ struct ; /* dma pools (if dma'ble) */ struct *; /* internal for coherent mem override */ /* arch specific additions */ struct ; ; struct ; /* class_device migration path */ struct ; struct *; ; /* dev_t, creates the sysfs "dev" */ struct **; /* optional groups */ void (*)(struct * ); };
二、作用:
用于描述设备相关的信息设备之间的层次关系,以及设备与总线、驱动的关系。
三、详解:
1、struct klist            klist_children;
struct klist被定义在linux/include/linux/klist.h中,原型是:
struct  {
; struct ; void (*)(struct *); void (*)(struct *); };
可见它是对struct list_head的扩展,在此它的作用是连接设备列表中的孩子列表。
2、struct klist_node       knode_parent; /* node in sibling list */
struct klist_node被定义在linux/include/linux/klist.h,原型是:
struct  {
struct * ; struct ; struct ; struct ; };
在此它的作用是表示它的兄弟节点。
3、struct klist_node       knode_driver;
表示它的驱动节点。
4、struct klist_node       knode_bus;
表示总线节点。
5、struct device           *parent;
指向其父设备。
6、struct kobject kobj;
这里
有对kobject的解释,此处它是内嵌的一个kobject对象。
7、char    bus_id[BUS_ID_SIZE];
bus_id表示其在父总线上的位置。BUS_ID_SIZE被定义为:
#define KOBJ_NAME_LEN 20 /*linux/include/linux/kobject.h*/
#define BUS_ID_SIZE KOBJ_NAME_LEN /*linux/include/linux/device.h*/
所以表示位置的字符串长度不能超过20。
8、struct device_type      *type;
被定义在/linux/include/linux/device.h中,原型是:
struct  {
const char *; struct **; int (*)(struct *, char **, int , char *, int ); void (*)(struct *); int (*)(struct * , ); int (*)(struct * ); };
device_type结构表示设备的类型。一个设备类或者总线可以包含不同类型的设备,例如“分区”和“磁盘” , “鼠标”和“事件” 。device_type就可以标识某个设备类型和该设备的特有信息,它就等同于kobject结构中的kobj_type一样。如果name数据成员被指定,那么uevent成员函数就会把它包含在DEVTYPE变量中。
9、unsigned is_registered:1;
标识该设备是否已经被注册过。is_registered:1这样的形式表示is_registered这个变量只有一位。在32位linux系统下,unsigned是4字节32位,而经过is_registered:1这样的限制后,变量is_registered只有一位,其取值只能是1或者0,相当于声明了一个boolean类型的变量。在此种用法中,后面指定数据宽度的值只能大于0且小于本身的数据宽度。
10、struct bus_type * bus;
指向所连接总线的指针。
11、struct device_driver *driver;
指向被分配到该设备的设备驱动。
12、u64 *dma_mask;    /*指向设备DMA屏蔽字。*/
u64 coherent_dma_mask;/*设备一致性DMA的屏蔽字。*/
struct list_head dma_pools; /*聚集的DMA缓冲池。*/
struct dma_coherent_mem *dma_mem; /*指向设备所使用的一致性DMA存储器描述符的指针*/
13、spinlock_t devres_lock;
定义一个设备自旋锁,用于互斥访问设备。关于自旋锁的详细讲解参考:
14、void    (*release)(struct device * dev);
释放设备描述符的回调函数。
四、操作:
linux内核系统了一系列完整的对device操作的函数。
1、其中device_register()函数用来将一个新的device对象插入设备模型。它在linux/drivers/base/core.c中被实现:
int (struct  *) {
(); return (); }
该函数首先是调用device_initialize()初始化device结构,具体是初始化嵌入的kobject结构dev->kobj,初始化列表中的孩子列表kobj->klist_children,初始化DMA缓冲池dev->dma_pools,初始化自旋锁dev->devres_lock等。接下来device_add()函数才真正将该device对象dev插入设备模型中。device_add()函数首先是通过kboject_add()函数将它添加到kobject层次,再把它添加都全局和兄弟链表中,最后添加到其他相关的子系统的驱动程序模型,完成device对象的注册。
2、device_unregister()完成相反的过程:/linux/drivers/base/core.c
void (struct  * ) {
("DEV: Unregistering device. ID = '%s'/n", ->); (); (); }
它会先以KERN_DEBUG级别打印注销设备的信息,然后才真正删除设备,减少设备对象的引用计数。
3、get_device()和put_device()分别是增加和减少设备对象的引用计数。这两个函数都定义在:/linux/drivers/base/core.c中。具体是应用在注册device对象时,device_add()函数会调用get_device()增加对该device对象的引用计数。在注销设备对象时,device_unregister()函数直接调用put_device()函数减少对该device对象的引用计数。

 

转载地址:http://rskci.baihongyu.com/

你可能感兴趣的文章
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
教育数字智能化能为现有体系带来新的起点
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret 1.1 正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>