linux device model

设备管理已经成为现代项重要任务Linux每次内核新版本的发布会伴随着一批设备驱动进入内核Linux驱动程序的代码量占有了相当大的比重图是我在网络上搜索到的一幅内核代码量的统计图2.6.29可以很明Linux驱动程序的比例已

  核最初个设备模型设备。在物理上,外是有一系的,比如把一U笔记本上,这个是接在一USB Hub上,USB 2.0 Host Controller (EHCI)上,最EHCI又是一PCI Bus上的里的一系是:状态,首先要逐设进入休眠模式,然后整才可以休眠。因此,需要有一结构可以把所有的外Linux

  Linux不止如此。建立了一设备树状结构,用过这棵树去遍设备,建立驱动程序之系,根据对设备进这样就可以更这颗枝繁叶茂的大Linux设备共有的一些操作抽象出少了重子的可能。同Linux助的机制,比如引用让开发者可以安全高效的成了以上之后,我非常方便的副就是个虚拟的文件系sysfs提供了一访问内这个在硬真实的文件系统启动之后才这个命令可以sysfs的大致

这个命令的信息量非常大,我就不了,如果有可以看看

  我

这里有个子目录并不是说这个目录代表了种完全不同的设备类型看看目devices的所有这里是一个大杂烩这里还是以盘为例UU真得很难办到这个盘在系统里的设备文件名sdb),

  透block很容易就可以找到U号链devices

  到们总结一下下各的作用。来组织设备统总线这个角度里的实际总线比如总线,也可以是完全总线比如总线把看角提高到了PCIUSBdev角是devices里是所有包含了一些比的子系ACPIfs支持的所有文件系kernel核的配置modules核模核模设备对应关系的,通录顺藤摸瓜找到过来都是可以做到的;存放的是系据,用过它来查询目前的状态,甚至可以直接模式。sysfs正是用的一座过这个桥梁我从内核中核里

  在形化的工GNOME下基于Device ManagerKDE下基于KInfoCenter的方式它们的提供的信息全面,而且

  如果具体到某一设备有一些PCIpciutils,面向设备SCSIlsscsi等。Linux来说,有

  另外,我程序sysfs,可以使用来实现访问设备,一般很少libsysfs下可以使用比libudev总结一下,本文主要设备模型的基本虚拟文件系sysfs。接下和大家讨设备模型在的一些

 

上一篇文章设备模型绍了设备模型在用户空间的接口本文Linux

  在核里,设备模型的基对应面向来说设备对象的基象的kobject结构体里里的其他kobject的派生KobjectLinux计数,接口抽象,父子计数krefkref考我之前的文章《核里的

  另外,设备模型重要的结构Kset本身也是一kobject,所以sysfs里同现为,但kobject的不同之kset可以看作是一Kset之所以能作使用,其嵌了一struct list_head表示kset系。的篇幅里我这个关核里是如何建立的。本文的示例代从这里下两个实作都在里。KobjectKobject核里的定

Linux核里的是以组织的,在里比层节点的父sysfs里就是上和下系,在kobject们实现这种父子kobject的定name表示的是sysfs中的名字;指parentkobject的父Kref大家熟悉了,过它来实现引用Kset指向kobjectkset,下文详细描述应该是用kobjectKtype的定

release使用的0sysfs_opsattribute么用的呢kobjectsysfs个目录录下的文件就是由来实现的attribute义了sysfs_ops来定义读写这个文件的方法里的是默另外也可以使用更加本文的重点default attribute个实作。在个内结构struct my_kobj {
 int val;
 struct kobject kobj;
};

  的目的是在对应录关系是:mykobj1/
|-- mykobj2
| |-- name
| `-- val
|-- name
`-- val

  module_init

 obj1 = kzalloc(sizeof(struct my_kobj), GFP_KERNEL);
 if (!obj1) {
  return -ENOMEM;
 }
 obj1->val = 1;

 my_type.release = obj_release;
 my_type.default_attrs = my_attrs;
 my_type.sysfs_ops = &my_sysfsops;

 return 0;
}

第一部分是分配并赋值kobj_typemy_type调用kobject也就是上文中提到的这个函数也可以分两步完成

void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
int kobject_add(struct kobject *kobj, struct kobject *parent,
  const char *fmt, ...);

  初始化结构设备模型之中。在obj1作,参数里,赋为obj1象,反映到my_kobj1的目obj2的父obj1,那my_kobj2的目

  前面提到,计数的功能,上是利用使用。struct kobject *kobject_get(struct kobject *kobj);

kobject_init_and_add这两个用后,计数会初始化1,所以在kobject_put计数再回到ktype。代my_attrs的:struct attribute name_attr = {
 .name = "name",
 .mode = 0444,
};

 .name" 0666="" style="TEXT-ALIGN: left; LINE-HEIGHT: 21.6pt; MARGIN: 7.5pt 0cm; TEXT-AUTOSPACE: ideograph-numeric; WORD-BREAK: keep-all; mso-pagination: widow-orphan" class="MsoNormal" align="left" color="#333333" face="">struct attribute *my_attrs[] = {
 &name_attr,
 &val_attr,
 NULL,
};

  struct attribute里的量用mode指定文件的里需要着重指出的是,my_attrs的最后一赋为则会造成oopssysfs_ops的代

" style="TEXT-ALIGN: left; LINE-HEIGHT: 21.6pt; MARGIN: 7.5pt 0cm; TEXT-AUTOSPACE: ideograph-numeric; WORD-BREAK: keep-all; mso-pagination: widow-orphan" class="MsoNormal" align="left" color="#333333" face=""> if (strcmp(attr->name, "name") == 0) {
  count = sprintf(buffer, "%s/n", kobject_name(kobj));
 } else if (strcmp(attr->name, "val") == 0) {
  count = sprintf(buffer, "%d/n", obj->val);
 }

ssize_t my_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size)
{
 struct my_kobj *obj = container_of(kobj, struct my_kobj, kobj);

 return size;
}

 .show" my_show="" my_store="" style="TEXT-ALIGN: left; LINE-HEIGHT: 21.6pt; MARGIN: 7.5pt 0cm; TEXT-AUTOSPACE: ideograph-numeric; WORD-BREAK: keep-all; mso-pagination: widow-orphan" class="MsoNormal" align="left" color="#333333" face="">读文件会调用写文件会调用

  最后是

 kobject_del(&obj2->kobj);
 kobject_put(&obj2->kobj);
 
 kobject_del(&obj1->kobj);
 kobject_put(&obj1->kobj);

kobject_del的作用是把从设备模型的那的目会删除。放的应该是先子象。因kobject_init_and_add这两个kobject_get象的引用kobject_del需要kobject_put象的引用来释kobject_del(&obj2->kobj)现内

  在建立了obj1obj1象,如果推广obj1可以有更多的子Linux这种实并设备模型最初的目的是源管理,上到下的遍这种无法象。只在于可以kobject如何使用。通常情kobject只需要在叶ksetKsetKset的定

Ksetkobj表明list来组织它所有的子

  我个实作。在们将构建如下的架

  sysfs里的目

这个实作和前一个差别很小简略的引用一些代码static int __init mykset_init(void)
{
 printk(KERN_INFO "mykset_init/n");

 // Allocate obj1 and obj2
 // ...

 // Init my_type
 // ...

 return 0;
}

 // Release obj1 and obj2
 // ...

 return;
}

  在首先kset_create_and_addmy_kset,接下my_ksetobj1添加obj2kobject_init_and_addparent都是这种obj1象由结构里的针决定,在my_kset。在们还需要来释放之前my_ksetLinux Device Model一章中的有印象,我在核就抛弃了subsystemkset的一它对设备模型

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值