linux内核学习(18)设备模型之第一层sysfs关系图

原创 2011年01月10日 09:37:00

很就没跟大家聊天了,上次聊还是分析完内核启动全过程的事情。这几次发的都是我目前学习设备模型的心得,把它都总结了起来,然后放到博客中供大家学习与探讨。

如果你还记得当时分析到了driver_init()这个函数,那么太好了,因为下面的内容就是对这个函数进行简要分析的。如果你没关注过,那么也不用太那个什么,因为这个函数和内核启动全过程基本没什么联系,看看它在哪里就知道了。drivers/base/init.c文件中,看看目录就知道,我们开始进入设备模型这块内容了,而base/这个目录将设备模型的第一层和第二层,描述的非常细致。第一层和第二层这样的层是我自己分出来的。

第一层:kobject、kset。
第二层:device、bus_type、device_driver。

其实这个是显然的,很多书籍中都提到过第二层,第一层还比较少,不过第一层我基本分析处理完了,重要的东西我已经写在了文章中,这次将第一层里涉及的还有一点内容给说完,那么第一层也算是结束了。

看看driver_init()这个函数吧。

来自drivers/base/init.c:
void __init driver_init(void)
{
    /* These are the core pieces */
    devtmpfs_init();
    devices_init();
    buses_init();
    classes_init();
    firmware_init();
    hypervisor_init();

    /* These are also core pieces, but must come after the
     * core core pieces.
     */
    platform_bus_init();
    system_bus_init();
    cpu_dev_init();
    memory_dev_init();
}

好像不怎么多,就是调用几个其他的初始化函数。看看第一个devtmpfs_init()。

#ifdef CONFIG_DEVTMPFS
extern int devtmpfs_init(void);
#else
static inline int devtmpfs_init(void) { return 0; }
#endif

设备临时文件,现在我们不要关心,等用到了在回过来分析即可。devices_init(),比较重要。

int __init devices_init(void)
{
    devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
    if (!devices_kset)
        return -ENOMEM;
    dev_kobj = kobject_create_and_add("dev", NULL);
    if (!dev_kobj)
        goto dev_kobj_err;
    sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
    if (!sysfs_dev_block_kobj)
        goto block_kobj_err;
    sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
    if (!sysfs_dev_char_kobj)
        goto char_kobj_err;

    return 0;

 char_kobj_err:
    kobject_put(sysfs_dev_block_kobj);
 block_kobj_err:
    kobject_put(dev_kobj);
 dev_kobj_err:
    kset_unregister(devices_kset);
    return -ENOMEM;
}

创建了几个kobject、kset第一层的对象。注意这些xxx_create_and_add()函数在我之前的文章里都有总结,但没做过多的分析,只需知道内核对象和sysfs文件系统有着关系即可,在sys/目录里存放着这些实实在在的内核对象。对于sysfs我们其实无需担心,因为它接口函数都可以顾名思义,由于sysfs在目前来说不是很重要,因此,我就没去具体分析它了,等用到了具体细节在分析也不迟。同理下面的几个函数完成的功能都差不多。

int __init buses_init(void)
{
    bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
    if (!bus_kset)
        return -ENOMEM;
    return 0;
}

int __init classes_init(void)
{
    class_kset = kset_create_and_add("class", NULL, NULL);
    if (!class_kset)
        return -ENOMEM;
    return 0;
}

int __init firmware_init(void)
{
    firmware_kobj = kobject_create_and_add("firmware", NULL);
    if (!firmware_kobj)
        return -ENOMEM;
    return 0;
}

int __init hypervisor_init(void)
{
    hypervisor_kobj = kobject_create_and_add("hypervisor", NULL);
    if (!hypervisor_kobj)
        return -ENOMEM;
    return 0;
}

你说上面的内核对象具体用来干什么,其实我也不是很清楚,如果清楚了还分析个毛啊!现存着,放在大脑里或者笔记里,等到时候自然需要我们去分析,而且还得必须搞得非常清楚不可。先说到这里,下面的函数是第二层了。我们将第一层出现的常量和关系给总结一下,想了一下,还是用图形的方式表现的更清楚。

可以自己到/sys/目录看看,有没有这些文件,当然的使用的是2.6.36的内核才行,不然可能有些文件没有,呵呵,我用的2.6.22的就没有上面两个文件。好了,上面的东西可能说的有些不具体,我希望有些问题还得自己去分析出来,我只是一个简单总结而已,没有深入。

Linux内核学习设备模型第一层

设备模型第一层:   一、重要结构体概述:   1、kobject对象: struct kobject { const char *name; //名字 struct list_head...
  • xb741314
  • xb741314
  • 2012年04月18日 22:57
  • 331

linux内核学习(16)设备模型第一层

设备模型第一层: 一、重要结构体概述: 1、kobject对象:struct kobject { const char *name; //名字struct list_head entry; //作为父...
  • cug_fish_2009
  • cug_fish_2009
  • 2011年01月09日 17:06
  • 1242

Linux 设备模型(上)之底层模型

以《LDD3》的说法:Linux设备模型这部分内容可以认为是高级教材,对于多数程序作者来说是不必要的。但是我个人认为:对于一个嵌入式Linux的底层程序员来说,这部分内容是很重要的。以我学习的ARM9...
  • xy010902100449
  • xy010902100449
  • 2015年06月15日 21:15
  • 1172

图解Linux设备模型

udev实现了用户空间动态的方法管理/dev目录。/dev目录是设备目录,里面的文件就是设备文件。udev文件系统在用户空间工作,它可以根据sysfs文件系统导出的信息(设备号(dev)等),动态建立...
  • seek_0380
  • seek_0380
  • 2013年10月25日 13:47
  • 1386

linux设备模型之 kobject原理与实例分析

1、Sysfs文件系统            "sysfsis a ram-based filesystem initially based on ramfs. It provides ameans...
  • u014379540
  • u014379540
  • 2016年09月07日 17:22
  • 168

设备模型3之sysfs

sysfs单独提出来说比较难,因为它离不开kobject。如果遇到kobject的话,我会笼统的解释一下。 这编涉及源代码,版本为linux-3.2 sysfs刚开始是为了方便电源管理而提供的一种设备...
  • xxxxxlllllxl
  • xxxxxlllllxl
  • 2013年07月05日 22:11
  • 1064

Linux那些事儿之我是Sysfs(12)举例三:sysfs读入文件夹内容

上回我们说到,如何创建文件夹和文件。我们发现,在sysfs中,inode并不那么重要。这是因为我们所要读写的信息已经就在内存中,并且已经形成了层次结构。我们只需有dentry,就可以dentry->f...
  • fudan_abc
  • fudan_abc
  • 2007年09月13日 16:24
  • 7301

设备模型-sysfs

前言在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录。从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面...
  • qq_27087571
  • qq_27087571
  • 2017年02月19日 21:48
  • 113

Linux设备模型-1-主要概念

随着计算机的周边外设越来越丰富,设备管理已经成为现代操作系统的一项重要任务,这对于Linux来说也是同样的情况。每次Linux内核新版本的发布,都会伴随着一批设备驱动进入内核。在Linux内核里,驱动...
  • shenwanjiang111
  • shenwanjiang111
  • 2016年08月31日 09:19
  • 693

linux设备模型之sysfs使用

前面几篇文章已经相对详细的描述了linux设备模型,linux设备模型本质上是把设备安装虚拟的总线、设备、驱动、类这些“概念性”的东西模型化了一下,使对设备和驱动的管理有了面向对象的感觉;对这一切的底...
  • u010246947
  • u010246947
  • 2013年05月20日 11:47
  • 1369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核学习(18)设备模型之第一层sysfs关系图
举报原因:
原因补充:

(最多只允许输入30个字)