我,子牙老师,一个手写过操作系统、编程语言、Java虚拟机、docker、Ubuntu系统,玩透Windows内核、Linux内核的…硬核男人
前两周好累呀!干啥去了?跟好基友自驾去新疆玩了一趟,来回7000km+,猛不猛?不过我没开多少,我才开了2000km+,我基友喜欢开我的小米su7 ultra,我就全让他开了。U1S1,自驾游遇上喜欢开车的朋友,真是一件无比幸福的事情
玩的太久,我都有负罪感了,要努力把前面落下的进度赶上来!这不,马上开整!在做课程《手写编程语言》之前,基于Linux内核写一个文件系统都写完了,没去整理,今天开始整理,顺便写成文章
如果你对Linux内核、文件系统、vfs、namespace、进程、容器之间的关系及各自的底层实现原理感兴趣,可以关注我的公众号**【硬核子牙】**,看该系列硬核文章,让你彻底玩明白
本篇文章借着给Linux内核写一个文件系统,让你搞明白Linux内核、文件系统之间的关系。代码获取方式:关注公众号**【硬核子牙】
国际惯例,先上证据,我为Linux内核写了个文件系统:aayafs

aayafs是nodev形式,即内存文件系统,后面有空再写一个基于设备的文件系统
具体是怎么做到的呢?以下,enjoy
Linux内核与文件系统
Linux内核在设计的时候,是如何设计接入文件系统的呢?注册机制!核心函数是register_filesystem

注册到哪去呢?注册到全局变量file_systems单向链表中

还有一把锁,用于控制并发,防止注册时有文件系统没注册上
全局变量file_systems是一维指针,如何存储很多个文件系统呢?前面提到了,单向链表!在file_system_type中有个属性next,指向下一个注册的文件系统

综上,Linux内核与文件系统的关系,用图表示长这样

还是挺简单的哦,你应该悟了吧,接下来开写
注册文件系统
注册文件系统,核心函数是register_filesystem,它只需要一个参数:file_system_type结构体指针,这个结构体有很多参数,我们应该填充哪些呢?
填充这五个,前四个是必须,第五个是建议

owner表示拥有该文件系统的模块,一般设置为THIS_MODULE即可。name是文件系统的名称,必须。mount是该文件系统对应的挂载函数,必须。kill_sb是该文件系统对应的卸载函数,必须
fs_flags配置文件系统支持的行为,比如是否需要设备、是否支持用户态挂载,值就是在结构体中定义的6个宏

这6个宏的详细用途

到这里,所有基础已搞定:Linux内核与文件系统的关系、如何给Linux内核注册文件系统、Linux内核如何存储注册的文件系统……接下来写代码实战
代码实战
代码我就不贴了,需要的关注公众号**【硬核子牙】
这里面涉及到很多数据结构:inode、super_block、super_operations……下篇文章给大家答案

被折叠的 条评论
为什么被折叠?



