|
UT4412BV03开发板学习linux设备驱动模型(一)
设备驱动模型概述:
设备驱动模型比较复杂,linux系统将设备和驱动归结到设备驱动模型中来管理,设备驱动模型的提出解决了以前编写驱动时没有统一的方法的局面,设备驱动模型给各种驱动程序提供了很多辅助性的函数,这些函数经过严格测试,可以很大程度上提高驱动开发人员的工作效率。
设备驱动模型中用到的几个核心的数据结构,分别是kobjeck,kset,subsystem,这些结构体使设备驱动模型组成了一个层次结构,该层次结构将驱动,设备,总线等联系起来,形成了一个完整的设备驱动。
kobject结构体提供了一个最基本的设备对象管理能力,每一个在内核中注册的kobject对象都对应于sysfs文件中的一个目录。
对应头文件:#include<linux/kobject.h>
对应源文件:kobjeck.c
1.kobject结构体
struct kobject {
const char *name; //kobject结构体的名字,作为一个目录显示在sysfs文件系统中
struct list_head entry; //链接下一个kobject结构体
struct kobject *parent; //指向本结构体的指针
struct kset *kset; //指向kset结构体的指针
struct kobj_type *ktype; //指向kobj_type结构体的指针,设备属性结构体
struct sysfs_dirent *sd; //
struct kref kref; //表示该对象的引用计数,
内核提供增加和减少引用计数的kobject_get();kobject_put();当计数为0时,该对象的所有资源被释放
unsigned int state_initialized:1; //表示kobject结构体是否初始化过,1表示初始化过,0表示未初始化过。
unsigned int state_in_sysfs:1; //表示kobject结构体是否已注册到sysfs文件系统中
unsigned int state_add_uevent_sent:1; //
unsigned int state_remove_uevent_sent:1; //
unsigned int uevent_suppress:1
};
Kobject通过kset组织成层次化的结构,kset中包含了kobject集合,像驱动程序一样放在/sys/driver目录下,目录driver是一个kset对象,包含系统中的驱动程序对应的目录,驱动程序的目录由kobject表示。Kset结构体的定义如下:
用到的头文件#include <linux/kobject.h>
struct kset {
struct list_head list; //链接所包含的的kobject对象的链表的首部
spinlock_t list_lock; //维护list链表的自旋锁
struct kobject kobj; //内嵌的kobject结构体,说明kset本身也是一个目录
struct kset_uevent_ops *uevent_ops; //热插拔事件
};
每一个kobject对象都有一些属性,这些属性由kobj_type结构体表示,最开始,内核开发者考虑将包含在kobject结构体中,后来考虑到同类设备会具有相同的属性,所以将属性隔离开来。由kobj_type表示。
用到的头文件#include <linux/kobject.h>
struct kobj_type {
void (*release)(struct kobject *kobj); //释放kobject结构体占用的资源,该函数用驱动开发者去实现
struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};
用到的头文件#include <linux/sysfs.h>
struct attribute {
const char *name;
struct module *owner;
mode_t mode;
};
struct sysfs_ops {
ssize_t (*show)(struct kobject *, struct attribute *,char *); //写属性操作函数 show函数用于读取一个属性到用户空间,读取成功返回读取到的字节数
ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); //写属性操作函数, store函数用于将属性写入内核
};
用到的头文件#include <linux/sysfs.h>
struct sysfs_dirent {
atomic_t s_count;
atomic_t s_active;
struct sysfs_dirent *s_parent;
struct sysfs_dirent *s_sibling;
const char *s_name;
union {
struct sysfs_elem_dir s_dir;
struct sysfs_elem_symlink s_symlink;
struct sysfs_elem_attr s_attr;
struct sysfs_elem_bin_attr s_bin_attr;
};
unsigned int s_flags;
ino_t s_ino;
umode_t s_mode;
struct iattr *s_iattr;
};
二. 操作kobject结构体用的函数
![]() 路过 |
![]() 鸡蛋 |
![]() 鲜花 |
![]() 握手 |
![]() 雷人 |