1,file结构体
驱动程序中经常使用如下类似的代码检测用户打开文件的读写方式
if (file->mode & FMODE_WRITE) //用户要求可写
{
}
if (file->mode & FMODE_READ) //用户要求可读
{
}
下面的代码用于判断以阻塞还是非阻塞方式打开设备文件
if (file->f_flags & O_NONBLOCK) //非阻塞
pr_debug("open: non-blocking\n");
else //阻塞
pr_debug("open: blocking\n");
2,inode结构体
包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。他是linux管理文件系统的最基本单位。
下列操作用于从一个inode中获得主设备号和次设备号:
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
查看/proc/devices文件可以获得系统中注册设备的主次设备号。
cat /proc/devices 第一列为主设备号,第二列为次设备号。
3,devfs设备文件系统在2.6中已经被抛弃,由udev代替。udev只有检测到设备时才会为它创建对应的设备节点。
sysfs文件系统可以产生一个包括所有系统硬件的层级视图。
4,内核借助kobject, kset, subsystem, bus_type, device, device_driver, class, class_device, class_interface等重量级数据结构完成设备模型的架构。
kobject结构式所有设备在底层都具有的统一接口,提供了基本的对象管理能力。每个在内核中组侧的kobject对象都对应于sysfs文件系统中的一个目录。
通过kobject_get(), kobject_put()分别增加和减少kobject的引用计数。当引用计数为0时,该对象所使用的资源将被释放。
kobject的ktype成员是一个指向kobj_type结构的指针,表示该对象的类型。包括三个成员:释放资源的release()函数,指向sysfs操作的sysfs_ops指针和sysfs文件系统默认属性列表。
其中的sysfs_ops包括store()和show()两个成员函数,用于实现属性的读写。
属性在sysfs中呈现为一个文件,而kobject则呈现为sysfs中的目录。
kset是kobject的集合,通过双向链表将kobject组织起来。
subsystem是一系列kset的集合,它描述系统中某一类设备子系统。所有挂接到同一subsystem的kset共享同一个互斥访问信号量rwsem。
5,系统中的任一设备在设备模型中都由一个device对象描述。它用于描述设备相关的信息设备之间的层次关系,以及设备与总线、驱动的关系。但通常device结构不单独使用,而是包含在更大的结构体中。
系统中的每个驱动程序由一个device_driver对象描述。
系统中总线由bus_type描述。每个bus_type对象都对应/sys/bus目录下的一个子目录,每个这样的目录下都存在两个子目录:devices和drivers。
设备类 class
阅读(1425) | 评论(1) | 转发(2) |