class_create函数跟踪:

/* This is a #define to keep the compiler from merging different
 * instances of the __key variable */
#define class_create(owner, name) \
({ \
static struct lock_class_key __key;\
__class_create(owner, name, &__key);\
})

/**
 * class_create - create a struct class structure
 * @owner: pointer to the module that is to "own" this struct class
 * @name: pointer to a string for the name of this class.
 * @key: the lock_class_key for this class; used by mutex lock debugging
 *
 * This is used to create a struct class pointer that can then be used
 * in calls to device_create().
 *
 * Returns &struct class pointer on success, or ERR_PTR() on error.
 *
 * Note, the pointer created here is to be destroyed when finished by
 * making a call to class_destroy().
 */
struct class *__class_create(struct module *owner, const char *name,
    struct lock_class_key *key)
{
struct class *cls;
int retval;

cls = kzalloc(sizeof(*cls), GFP_KERNEL);
if (!cls) {
retval = -ENOMEM;
goto error;
}

cls->name = name;
cls->owner = owner;
cls->class_release = class_create_release;

retval = __class_register(cls, key);
if (retval)
goto error;

return cls;

error:
kfree(cls);
return ERR_PTR(retval);
}
EXPORT_SYMBOL_GPL(__class_create);

static void class_create_release(struct class *cls)
{
pr_debug("%s called for %s\n", __func__, cls->name);
kfree(cls);
}

int __class_register(struct class *cls, struct lock_class_key *key)
{
struct subsys_private *cp;
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);
INIT_LIST_HEAD(&cp->interfaces);
kset_init(&cp->glue_dirs);
__mutex_init(&cp->mutex, "subsys mutex", key);
error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name);
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)
cp->subsys.kobj.kset = class_kset;
#else
cp->subsys.kobj.kset = class_kset;
#endif
cp->subsys.kobj.ktype = &class_ktype;
cp->class = cls;
cls->p = cp;

error = kset_register(&cp->subsys);
if (error) {
kfree(cp);
return error;
}
error = add_class_attrs(class_get(cls));
class_put(cls);
return error;
}
EXPORT_SYMBOL_GPL(__class_register);

先跟踪3层,不能再多了。

class_create相关推荐

  1. 基于linux-2.6.35的class_create(),device_create解析

    从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.提醒一点,udev是应用层的,不要试图在内核的配置选项里找到它;加入对udev的支持很简单,以作者所写的一个字符 ...

  2. class_create()函数

    内核中定义了struct class结构体,一个struct class 结构体类型变量对应一个类,内核同时提供了class_create()函数,可以用它来创建一个类,这个类存放于sysfs下面,一 ...

  3. class_create和class_device_create

    //主要是在/sys/class/ 下创建一个 "name"的文件夹 !从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.相比devfs,ud ...

  4. 驱动编程class_create说明

    从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代.提醒一点,udev是应用层的,不要试图在内核的配置选项里找到它;加入对udev的支持很简单,以作者所写的一个字符 ...

  5. linux驱动21:内核创建类class_create

    利用mknod命令手动创建设备节点不方便,Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点. #include <lin ...

  6. class_create函数源码分析

    宏class_create()用于动态创建设备的逻辑类,并完成部分字段的初始化,然后将其添加进Linux内核系统中.此函数的执行效果就是在/sys/class/目录下创建一个新的文件夹,此文件夹的名字 ...

  7. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  8. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  9. ()shi linux字符设备,Linux字符设备驱动基础(三)

    Linux字符设备驱动基础(三) 6 创建设备节点 6.1 手动创建设备节点 查看申请的设备名及主设备号: cat /proc/devices # cat /proc/devices Characte ...

最新文章

  1. 关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法
  2. SqlSugar ORM 入门到精通【一】入门篇
  3. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程
  4. SAP ABAP STOP,EXIT,CHECK,RETURN
  5. Hotstar赛事直播编码组合优化
  6. redis live 如何安装
  7. Google:推荐几款好用的Chrome浏览器插件
  8. 可以这样给DataGrid加个序号列。
  9. 第2章线性表的基本使用及其cpp示例(第二章汇总,线性表都在这里)
  10. RxSwift学习插曲--Timer补充内容
  11. python下载谷歌地图瓦片_python获取bing地图发布自己的TMS服务(一)下载瓦片
  12. what is loop switch
  13. 从零开始的立绘拆包教程
  14. pano2vr怎么制作漫游_Pano2VR如何制作全景图?全景图如何添加热点?
  15. 谷歌浏览器无法上网问题解决
  16. UVA 3713 Astronauts
  17. 【面试】如何设计一个高并发系统
  18. 华芯微特SWM220R8T7-LQ64-22100最小系统板测试版开发板面包板
  19. 用Html+js自己写了一个小游戏
  20. 鸿蒙 华为watch gt3手表hello world

热门文章

  1. Docker使用Link在容器之间建立连接
  2. 【Scratch】青少年蓝桥杯_每日一题_5.25_排序
  3. 【Python】青少年蓝桥杯_每日一题_3.05_排列组合
  4. 第九届蓝桥杯java B组—第六题递增三元组(详细介绍)
  5. java 字节缓冲_Java字节缓冲流原理与用法详解
  6. 超级计算数据中心设计要求(征求意见稿)
  7. “双碳”目标下新型数据中心的方向
  8. 注意2018年数据中心的这5大发展趋势
  9. vFORUM十大“最”看点,带你“撩”会议
  10. dcdc模块降额设计_模块电源应用设计的可靠性和注意事项