Linux/Android文件系统架构深度剖析
文章目录一、preface1、资料快车2、概述3、专业术语二、Linux文件系统架构1、文件系统框架图2、文件系统之块设备字符设备框架3、内核如何读取文件4、文件系统类型1持久文件系统1、本地文件系统2、网络文件系统2运行时文件系统3根文件系统4设备文件系统5小结1、不同阶段使用的文件系统2、文件系统的选用策略3、文件系统数据流5、文件系统应用程序1常用工具命令2文件系统应用工具一、preface1、资料快车1BSP/驱动开发者如何学习 Linux文件系统https://mp.weixin.qq.com/s/8DyBd6_0CodmbrI4nY9QSg2文件系统、分区、格式化与挂载实践https://blog.csdn.net/D2005_10_25/article/details/1497466683Linux 文件系统Linux FS详解从基础到实践https://geek-blogs.com/blog/linux-fs/4Linux 文件系统挂载全解析从基础到进阶实践https://geek-blogs.com/blog/mount-filesystem-linux/2、概述1文件系统作为内核的五大模块之一1、Linux的运行离不开文件系统2、驱动开发更离不开文件系统这个框架 (用户态与内核态的交互的基础)2虽然文件系统实现极其庞大复杂但实际开发项目中很少去开发文件系统功能bring up阶段我们要做的是几类工作1、配置文件系统类型2、配置分区 - GPT、fstab1增加customer客制化的分区2制作烧录bin、升级固件3、裁剪内容 - 根据存储器件容量调整分区3文件系统本质是内核和用户空间交互的”中间件“4文件系统是Linux的一个内核模块fuse则实现用户态文件系统-用户态字符设备5文件系统特点是总体理解不难(无非读写文件)但很杂乱多种文件系统并存理清这些关系是难点6Linux与Android的文件系统体系差异Android作为Linux一个发行版本主要是在分区、文件系统应用管理有差异3、专业术语1. sb : superblock 2. acl : access control list二、Linux文件系统架构Linux文件系统指的是整一套机制它不只是 ”磁盘上的文件管理机制“它更是Linux 内核对“可访问对象”的统一抽象模型。1、文件系统框架图1文件系统与设备驱动之间的关系2应用程序、VFS与设备驱动3全景图1、从上图可以看出linux非常依赖VFS文件系统呼应linux下一切皆文件后续再从代码中体会“文件”2、看看一切皆文件的威力比如经常接触到在用户态使用以下命令cat /dev/ttyS0 --串口 cat /sys/class/power_supply/test_battery/capacity --电源 cat /proc/interrupts --中断它不存在于磁盘、没有物理 inode 表、没有扇区也不会真正落盘。只是内核在读取时动态生成的一段数据。 dd if/dev/mmcblk0p1 bs512 count1 --块设备这其中包括了字符设备、块设备、电源、CPU中断他们是完全不同种类的设备但却都可以在用户态通过访问文件的方式来访问。3、总的来说Linux 并不是把所有内容 “变成文件” 而是把用户访问内核各种对象的方式统一成“文件接口形式”。2、文件系统之块设备字符设备框架1从中可以看出内核部分做了层层封装需要经过一系列的过程才能真正到达驱动调用硬件2两个关键点1通过svc进入内核2设备驱动程序需要将方法挂接到VFS中去3、内核如何读取文件1内核读取文件依然依赖文件系统提供的API但不同于应用态API 2内核读取文件的场景 1、加载内核模块insmod 最终通过内核的 kernel_read_file_from_fd() 读取 .ko 文件。 2、读取固件firmware设备驱动请求固件时内核会在 /lib/firmware 下查找并读取文件。 3、挂载文件系统挂载时需要读取超级块、目录等但这是通过具体的文件系统驱动完成的并非通用“文件操作”。 4、读写 /proc 或 /sys 中的内核数据虽然这些是虚拟文件但实现时也会使用类似 seq_file 的机制。 5、内核崩溃转储kdump将 vmcore 写入文件。 3内核API 1.打开关闭文件 /android/common/common14-5.15/common/fs/open.c struct file *filp_open(const char *filename, int flags, umode_t mode) int filp_close(struct file *file, fl_owner_t id) 2.读取文件 1) 读取文件到内核缓冲区 ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos) 2) 从文件中读取数据到用户空间缓冲区 ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)4、文件系统类型1持久文件系统1、本地文件系统1常见的有ext4最常用、XFS高性能、Btrfs高级特性如快照、ext3ext4 的前身存在实体于FLASH/磁盘 2内核代码 linux/fs/ext4/file.c、dir.c 3Linux具备管理Flash/磁盘上的文件数据功能包括管理扇区、块、inode、超级块、io算法2、网络文件系统1NFSLinux/Unix 网络共享、CIFS/SMBWindows 网络共享。 2) 挂载命令 mount -t nfs 192.168.1.100:/data/nfs /mnt/nfs 3通信模型 主机1(VFS - NFS) - 网络 - 主机2(NFS - VFS)2运行时文件系统1、指的是Linux内核动态生成的文件没有在磁盘里存在的真实文件(而是内存数据)直接在RAM里面进行组织同样也对接VFS但不会存盘 2、切记一点就是临时的文件系统就是一堆新建的struct结构体ls查看时使用printk从串口打印出来 3、运行时文件系统由于读写都在RAM一般比较简单具备基本文件系统元素(VFS等的四大要素-superblokc/inode/file/dentry)但没有复杂的IO算法操作 2、常见的有devfs、tmpfs、devtmpfs 1tmpfs内存临时文件系统、sysfs系统设备信息、procfs进程信息。 2devfs是文件系统形式的device manager。tmpfs存在在内存和swap中因此只能保存临时文件。devtmpfs是改进的devfs也是存在内存中挂载点是/dev/3根文件系统1、根文件系统是持久文件系统和运行时文件系统的结合会存盘但在ram上直接运行2、Linux设备的rootfs一般作为过渡使用(切换到真正的文件系统之后不再使用)Android不仅用作启动还作为文件系统的顶层框架3、根文件系统的必要性-面对繁杂的嵌入式系统存储文件系统的设备种类非常多网络文件系统、磁盘、SD卡、EMMC等等Linux将文件系统拆分 根文件系统和用户文件系统这种分层设计大大提高系统组合灵活性4设备文件系统1、字符设备和块设备与其它文件系统稍微不同可以看做单独的特殊设备文件系统两部分组成chrdev(挂接file_ops) 和 tmpfs(创建文件 )组合完成Linux系统默认支持 2、 vfs_caches_init() ----bdev_cache_init(); ----chrdev_init() 3.设备文件系统-可以将字符设备块设备当做是是独立的文件系统VFS会调用到file记录的ops其它文件系统则跑new_sync_read /android/vendor/amlogic/common/kernel/common/fs/read_write.c ssize_t __vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { if (file-f_op-read) return file-f_op-read(file, buf, count, pos); else if (file-f_op-read_iter) return new_sync_read(file, buf, count, pos); else return -EINVAL; }5小结1、不同阶段使用的文件系统Linux文件系统种类多纷繁复杂Linux系统还在不同阶段设置不同的文件系统以Android为例1、系统启动阶段 - 使用rootfs2、系统启动完成 - 使用ext43、系统运行阶段 - tmpfs / procfs / sysfs - 服务于系统设备虽说文件系统有差异但主心骨是一样的2、文件系统的选用策略3、文件系统数据流1、串口看到的内容如何映射到RAM和FLASH串口把结构体数据打印出来2、永久文件系统负责组织FLASH的文件当然最终还是得读到内存而临时文件系统则仿照后半部工作在内存里直接组织3、为什么临时文件系统不存盘存盘耗时临时文件系统都是动态生成的变化频率存盘意义不大还会导致不必要的耗时5、文件系统应用程序1常用工具命令cat/ls/mkdir/touch2文件系统应用工具以Ext2为例 1.系统应用层文件管理 /android/system/core/fs_mgr 2.系统应用层ext2fs管理工具 /android/external/e2fsprogs/lib/ext2fs
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2494172.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!