linux sysfs(6)

来源:互联网 发布:孙策玉玺换兵马 知乎 编辑:程序博客网 时间:2024/05/01 13:00
好了,我们按照我们的思路来一点一点分析吧,假设你是美国人,现在公司派你来中国开拓市场,你将怎么办?(这辈子做不成美国人的屌丝,期待为了做美国人的老爸吧!有了儿子再移民)
1)从哪里来?从来处来
2)到哪里去?直到公司关门歇业为止。
3)为啥?钱呗,扩大市场占有率。
好,公司已经决定了,公司赶紧建立一个紧急团队,来筹备中国公司的筹建。这个筹备工作就是所谓的bootloader或者bios完成。
怎么筹备?
筹备,就是建立好环境,包括硬件上的初始化,内存的初始化,cpu状态初始化,然后把操作系统从硬盘中,调到内存里面,然后把系统运行权限交给系统自己运行。
和公司比较,就是让你找以前三五个同事,分配一个人做总经理,一个人做行政人力,一个人做技术,几个人做市场,然后把钱的使用和签字权限交给你(总经理),筹备工作就结束了。
当你(总经理)接手运作开始,先制定公司搭建计划,投资多少,制定财务规则流程,组好场地,人力资源部开始招聘,研发销售也开始运作下去。
这段流程对应--的工作。
然后,人力资源部开始工作,首先梳理现有流程,还有几个人,工作怎么分类,流程怎么走,上下级关系怎么样?
首先,理清devices下面所有设备,看看公司当时给你的投入了,如果投入大,你可能得到一个缩微组织,各个部分全部齐活的。如果公司不大,可能就你市场研发人力资源。假设你带的家底子还不错。各个部门基本上都有人。
于是人力资源开始设计人力架构和分工
谁负责销售,谁负责研发,研发下面,谁又负责结构,谁负责软件,谁负责硬件。等等。这个结构就是device下面的一个结构。
由于你们公司是新成立的公司,所以上头意外开恩,结果,给你们那边一些部门配置相应的辅导员,辅导员虽然在美国,你可以通过专有渠道和他沟通任何业务问题(这个就是所谓的驱动程序),那么那些部门需要驱动呢?一般而言一些通用业务部门,也就是总线上的东西,大家会遵守同一种操作方法。其实也是对中国人的歧视,因为他们可以控制你的一切。
然后,公司一些对外业务都是共同的,已经有了一些固定传动方式,所以,你新的公司内部所有适合的部门必须专门提出来,给他们在公司业务窗口上建立统一的窗口。这就是class,是一个纯粹虚拟的东西。

首先办公场地和工厂选择,不管要不要工厂,我觉得第一步,还是要建立一个办公室,所以这里分成两步,第一个建立rootfs,第二步建立sysfs。
首先在那个文件/kernel/init/main.c中非著名函数start_kernel里面,要开始调用vfs_caches_init(),这个文件定义在/kernel/fs/dcache.c中间,这个函数中间有定义了一个函数mnt_init, 定义在、/kernel/fs/namespace.c。
void __init mnt_init(void)
{
  ......      
  sysfs_init();

  init_rootfs();       

  init_mount_tree();

}
我觉得根目录这个名字叫的比根文件夹这个名字要好,特别是Microsoft提出文件夹的概念之后,总会给别人理解上带来很多错误。因为文件夹有一个包含的概念,而目录则纯粹是索引和导引的概念。其实我们就是可以这样理解rootfs,在内存中间开辟一段区域,然后把这个区域的地址告诉内核,这个区域最好能够做成我们要求样子的总部办公室。其实可以理解为他就一一件小小的办公室,就像国内很多企业在国内的工厂,在香港的办公室就是这个意思,还美其名曰香港公司。
注册的概念。
“.”的作用就是给结构体变量赋初值
    static struct file_system_type rootfs_fs_type = {  
        .name       = "rootfs",  
        .get_sb     = rootfs_get_sb,  
        .kill_sb    = kill_litter_super,  
    };  
具体如何实现的,要看编译器如何处理了。
第二个就是static的使用,我们知道一个运行中的程序,可能分成好几个段的,分段的思想,最初我认为是从x86上面来的,后来,变成程序不同初始化区域的数据分配了。所以,static定义的成员,在编译器处理器,保证其目标代码运行时连接的初始值是满足我们要求的。
就像以前,单位给你分房子,对于高级干部不但分房子,连老婆家具都分了,你写程序的时候,只要提出你的要求就ok,你不必去管系统是怎么满足你的初始条件的。
当然我们一定要注意,很多内存空间必须申请才能使用的,例如,你说有三套房子,一个房子放大老婆,一个房子放二老婆,一个房子放三老婆,那么,要么但是一开始就给你分了三套房子,要不,你就要自己再掏钱买房子,如果不掏钱的话,随便乱进别人房间会被当作流氓被抓的。
好了,这个房子已经准备好了,你可以认为总公司已经给你准备好了。这个房子就是在静态空间中定义好了的。
房子结构如下:
    struct file_system_type {  
        const char *name;  
        int fs_flags;  
        int (*get_sb) (struct file_system_type *, int,  
                   const char *, void *, struct vfsmount *);  
        void (*kill_sb) (struct super_block *);  
        struct module *owner;  
        struct file_system_type * next;  
        struct list_head fs_supers;  
      
        struct lock_class_key s_lock_key;  
        struct lock_class_key s_umount_key;  
      
        struct lock_class_key i_lock_key;  
        struct lock_class_key i_mutex_key;  
        struct lock_class_key i_mutex_dir_key;  
        struct lock_class_key i_alloc_sem_key;  
    };  
配备家具警卫老婆如下:

    static struct file_system_type rootfs_fs_type = {
        .name    = "rootfs",
        .mount    = rootfs_mount,
        .kill_sb= kill_little_super,
        }
这个东西有啥用?
其实说实话,这里根本没有多少要求,有个房子,子机打扫打扫,收拾收拾就开张,想当初,老子的队伍才开张,总共才有十几个人七八条枪,就别提那么多要求了。
首先系统中有一个出发点,就是一个指针,指向一个叫做file_system_type的块。这个是基本指针,于是,我们要做的就是查一下看看,系统中间是否已经有这个东西了,废话这时候是刚刚建立的,当然没有。
于是一系列的操作之后,就把这个指针指向了rootfs_fs_type,然后简单打扫打扫就可以办公了。

    int register_filesystem(struct file_system_type * fs)  
    {  
        int res = 0;  
        struct file_system_type ** p;  
      
        BUG_ON(strchr(fs->name, '.'));  
        if (fs->next)  
            return -EBUSY;       //1  
        INIT_LIST_HEAD(&fs->fs_supers);      //2  
        write_lock(&file_systems_lock);  
        p = find_filesystem(fs->name, strlen(fs->name));   //3  
        if (*p)  
            res = -EBUSY;  
        else  
            *p = fs;  
        write_unlock(&file_systems_lock);  
        return res;  
    }  

           1、如果文件系统已经注册了,那么无法在注册了。每种类型的文件系统只能注册一次,但是可以有多种设备使用同一个类型的文件系统,也可以将同一类型的文件系统              挂载在不同的路径下。

           2、初始化fs->fs_supers;

           3、将即将注册的文件系统放在链表的尾部:

           find_filesystem函数如下:

    static struct file_system_type **find_filesystem(const char *name, unsigned len)  
    {  
        struct file_system_type **p;  
        for (p=&file_systems; *p; p=&(*p)->next)  
            if (strlen((*p)->name) == len &&  
                strncmp((*p)->name, name, len) == 0)  
                break;  
        return p;  
    }  
在linux内核中间,我们经常听到的一个词,就是register,翻译成中文就是登记,注册的意思。其本质含义是什么?回顾我们生活中,有几种情况需要注册
1)结婚
2)生子
3)上学
4)工作
5)开房
我理解,所有的注册都是为了在统一的结构里面,把我们已有的数据结构链接到系统当中,是的系统能否管理,确认我们信息的过程就是注册。
也就是内核中一定有某个钩子勾住我们,只要勾住了以后,就可以管理我们了。如果对比这个特点,唯一不叫注册就是上面第五种情况了,那个是为了OOXX,只能叫check-in.
如果我们看我们rootfs的初始化,那么这个钩子就是file_systems这个指针。

--------其实前面说没有任何东西也是不对的,为什么呢?----------------因为没有找到办公室之前,我们都是在自己家里办公的(临时的)

------待续----




原创粉丝点击