Chinaunix首页 | 论坛 | 博客
  • 博客访问: 55452
  • 博文数量: 28
  • 博客积分: 31
  • 博客等级: 民兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 14:33
文章分类
文章存档

2012年(28)

我的朋友

分类:

2012-12-06 16:04:02

原文地址:linux驱动笔记二 作者:theman_lai

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
阅读(683) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~