看/sys目录经常看到bus device driver class. 这也是网上大量说的驱动驱动模型。这些的关系得熟悉得明白吧。是的。今天我先不整他们的关系。先逐个击破,然后再统一来理清楚他们之间的关系。
那今天我们来看看class.c这个文件。
class刚接触的时候好迷糊,class是关键字,是类型,不是,是一类事物,以一种归类。是把相同类型的device归到一起的一个对象。那我们来看看class是如何注册的。不管怎么说。class也是形成一个环。

一个双向闭环链表。同样,class之间也是通过kset  honeywell 臧春杰 kobject关联起来的。那我们具体看看
int __class_register(struct class *cls, struct lock_class_key *key)
{
struct subsys_private *cp; // subsys_private用的是和bus 一样的结构体。看来是共用了这个类型。为什么要共用呢? bus是关联了device driver. 那看来class也是关联了device driver. 嗯
有点道理。只是class不关心driver.他只是把相同类的device关联起来了。如何关联呢?看下文

int error;

pr_debug("device class '%s': registering\n", cls->name);

cp = kzalloc(sizeof(*cp), GFP_KERNEL); // 分配空间
if (!cp)
return -ENOMEM;
klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put); //初始化

honeywell 臧春杰
INIT_LIST_HEAD(&cp->class_interfaces);
kset_init(&cp->glue_dirs);
__mutex_init(&cp->class_mutex, "struct class mutex", key);
error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name); //设置kobject的名字。这个名honeywell 臧春杰字也同时也sysfs目录的名字。
if (error) {
kfree(cp);
return error;
}

/* set the default /sys/dev directory for devices of this class */
if (!cls->dev_kobj)
cls->dev_kobj = sysfs_dev_char_kobj;

#if defined(CONFIG_BLOCK)
/* let the block class directory show up in the root of sysfs */
if (!sysfs_deprecated || cls != &block_class)

honeywell 臧春杰
cp->subsys.kobj.kset = class_kset;
#else
cp->subsys.kobj.kset = class_kset; //这里就是开始指定kobj的kset类。位下一步add打基础了。
#endif
cp->subsys.kobj.ktype = &class_ktype;
cp->class = cls;
cls->p = cp;

error = kset_register(&cp->subsys); //这里就是开始真正的add了。这里有个简单的常识需要分享下。
我们经常看到kobje_****_add 也经常看到kset_register这有什么关系吗? 肯定不难,无非就是kobj和kset的关系。 其他是的功能是一样的。但是有点差别。在注册子系统subsystem的时候用
kset_register. 那什么是子系统呢? 就是别的对象能挂载在honeywell 臧春杰他下面的就叫子系统。就像class. 各个具体class可以挂在各个具体的device. 各个具体的bus可以挂载各个device和 driver。这些我们可以
称之为subsystem.

if (error) {
kfree(cp);
return error;
}
error = honeywell 臧春杰add_class_attrs(class_get(cls)); //创建了sysfs节点。
class_put(cls);
return error;
}

嗯,就这样,通过这个东西就把各个具体的class关联起来,围城双向闭环链表了。

linux 驱动入门6的更多相关文章

  1. linux 驱动入门1

    世事艰难,人生不易. 夜深人静时候,回顾过去,往事历历在目.创南京,混苏州,下上海.都付出了巨大的努力.多少个不眠的夜晚,在冥思苦想.天生愚钝.又不是学计算机的.一直没较为深刻的理解 编程什么东西,一 ...

  2. linux 驱动入门4

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境.http://www.cnblogs.com/nan-jing/articles/5806399.html上文提到了如何创建proc节 ...

  3. linux 驱动入门3

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境. http://www.cnblogs.com/nan-jing/articles/5806399.html 上文提到.可以自动创建了 ...

  4. linux 驱动入门2

    不吃苦中苦,难为人上人.努力,给老婆孩子提供个良好的生活居住环境. http://www.cnblogs.com/nan-jing/articles/5775038.html 这里提到.有这么多牛人. ...

  5. linux 驱动入门5

    慢慢的开始转驱动,目前比较有时间,一定要把驱动学会.哎.人生慢慢路,一回头.已经工作了八九年了.努力.在买套房.改退休了.学驱动.个人认为首先要熟悉驱动框架.慢慢来.心急吃不了热豆腐. 看网上都说的设 ...

  6. Linux驱动入门——构建和运行模块

    Hello world模块 本文介绍如何向内核中添加一个hello模块.该模块的功能是在模块加载时,向系统日志输出"hello world\n" 在模块卸载时输出"Goo ...

  7. Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

    Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门 转载请在文首保留原文出处:EMC中文支持论坛 - https://community.emc.com/go/chines ...

  8. IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)

    IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天 ...

  9. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

随机推荐

  1. URL特殊字符需转义

    URL特殊字符需转义 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%)制定特殊字符 5.#号指定书签 6.&号分隔参数 转义字符的原因 ...

  2. MySQL 常用基础命令

    一.启动与关闭 1.1 Linux下启动mysql 的命令: a. rpm包安装:service mysqld start b. 源码包安装:/usr/local/mysql/bin/mysqld_s ...

  3. jquery 仿购物车的加减数量

    <p>单价:3.95</p> <input id="min" name="" type="button" va ...

  4. POJ 3292 Semi-prime H-numbers (素数筛法变形)

    题意:题目比较容易混淆,要搞清楚一点,这里面所有的定义都是在4×k+1(k>=0)这个封闭的集合而言的,不要跟我们常用的自然数集混淆. 题目要求我们计算 H-semi-primes, H-sem ...

  5. 学习笔记——状态模式State

    状态模式,主要是用于存在大量case判断的操作执行,同时这些case依赖于对象的状态,那么就可以将大量的case判断封装为独立的类. Context: -state,当前状态对象. ChangeSta ...

  6. R语言——基本绘图函数

    通过一个综合的例子测试绘图函数 学习的内容是tigerfish老师的教程. 第一节:基本知识 用seq函数产生100位学生的学号. > num = seq(,) > num [] [] [ ...

  7. NPOI 2.0 教程(二):编辑既存的EXCEL文件

    NPOI 2.0 教程(二):编辑既存的EXCEL文件 分类: C#技术 2014-03-11 15:40 993人阅读 评论(3) 收藏 举报 c#excelNPOI 转载请注明出处 http:// ...

  8. Git 分支 - 分支的衍合

    分支的衍合 把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase(译注:rebase 的翻译暂定为“衍合”,大家知道就可以了.).在本章我们会学习什么是衍合,如何使用衍合,为什 ...

  9. Java的SSH框架

    SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架.   1.业务流程  集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据 ...

  10. 转:Windows下用sftp自动下载文件

    远程服务器是Linux操作系统,没有ftp服务,可以ssh,数据库每天2:00会自动创建一个备份文件,本地计算机是windows操作系统,希望用sftp每天3:00下载远程服务器上的备份文件.本地系统 ...