前言
首先看一下这个题目,确实有点蹭业界经典著作(深入理解XXX/Understanding XXX)热度的嫌疑。不过自认为水平不及大佬的千分之一,所以不敢用理解,仅仅用分析,表明这是一个努力学习试图理解的过程。不过既然是深入,就不能仅仅停留在概念和原理层面,文中所有描述内容都具体到实际的代码级别。FUSE文件系统在早期的Android版本里面就支持了,不过由于性能较差在Android O开始SDCARDFS取代了FUSE,不过在Android 11 FUSE文件系统又王者归来,此时已经是脱胎换骨了。本文参考的代码就是Android 11的高通865代码,内核版本是4.19。
FUSE文件系统的概念和原理比较简单,不过具体到代码层面还是十分复杂,真正想完全搞懂是一个宏大工程,加之本人能力有限,文中不可避免会有这样那样的错误,欢迎大家的指正,也希望大家能共同完成学习文件系统的万里长征。
导读
在阅读和调试代码的同时我也参考了很多网上的文章,有些问题参考文章已经描述的很好了,我也就没有再做额外的摘录,只是把参考链接附在了每一章的后面,因此读者在阅读本文过程中如有不明之处,建议阅读每章所附的参考文章。
本文的前四章是对FUSE文件系统的一个整体机制的描述,从用户态和内核态对整个调用流程进行了分析,通过阅读前四章,读者应该可以对Android 11的FUSE文件系统有一个基本的认知。
从第五章开始则是针对若干具体问题点进行展开描述,描述的问题点就来源于实际工作中碰到的问题和遇到的需求,因此每章之间没有什么联系,读者可以根据兴趣选择性阅读。根据工作中遇到的问题本文也将持续更新,打哪指哪。
第一章是对FUSE文件系统的基本介绍,包括整体框图,发展历史以及Android 11里面和SDCARDFS的关系。
第二章分析了FUSE文件系统的用户态守护进程FuseDaemon,FuseDaemon实现了多线程并行处理,大大的提升了FUSE文件系统的整体性能,这是和早期Android版本的一个重大差异。
第三章分析了FUSE文件系统的开机挂载过程,mount是一个文件系统的初始化过程,文件系统出问题很多情况下都表现为挂载失败,了解整个挂载流程对定位挂载失败问题有很大帮助。
第四章分析了FUSE文件系统内核处理部分,包括FUSE驱动的初始化过程,以及FUSE请求的处理,并通例子讲述了用户态和内核态的函数调用关系和文件系统切换流程。
深入分析Android 11 FUSE文件系统(五) ---扩展属性
第五章分析了如何在FUSE文件系统里面支持扩展属性(xattr)。
深入分析Android 11 FUSE文件系统(六) ---多用户
第六章分析了FUSE文件系统对Android系统的多用户机制的支持,并对应用双开的案例进行了简要的分析。
(未完待续)