注册系统linux sysfs(6)
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正
好了,我们按照我们的路思来一点一点析分吧,设假你是美国人,在现公司派你来中国开拓市场,你将怎么办?(这辈子做不成美国人的屌丝,待期为了做美国人的老爸吧!有了儿子再移民)
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这个指针。
--------其实面前说没有任何货色也是不对的,为什么呢?----------------因为没有找到办公室之前,我们都是在自己家里办公的(临时的)
------待续----
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”