2019-10-28 11:31:16 weixin_40608613 阅读数 1303

文件系统概述

操作系统中与管理文件有关的软件和数据
Linux文件系统采用的是树形结构
Linux支持多种文件系统
Linux文件系统提供丰富的文件和目录操作命令

Linux文件系统的特点

1.Linux文件系统采用树形结构,从根目录root(/)开始。
2.Linux的虚拟文件系统允许众多不同类型的文件系统共存,并支持跨文件系统的操作。
3.Linux的文件是无结构字符流式文件,不考虑文件内部的逻辑结构,只把文件简单地看作是一系列字符的序列。
4.Linux的文件可由文件拥有者或超级用户设置相应的访问权限而受到保护。
5.Linux把所有的外部设备都看作文件,可以使用与文件系统相同的系统调用和函数来读写外部设备。

Linux文件系统的组成

在这里插入图片描述

  • /home:用户主目录的基点目录,默认情况每个用户主目录都设在该目录下,如默认情况下用户 user01 的主目录是 /home/user01 ;
  • /lib:存放标准程序设计库目录,又叫动态链接共享库目录,目录中文件类似windows里的.dll文件;
  • /etc:存放系统管理和配置文件目录;
  • /dev:存放设备特殊文件目录,如声卡文件、磁盘文件等;
  • /usr:最庞大的目录,存放应用程序和文件目录;
  • /proc:虚拟目录,是系统内存的映射,可直接访问这个目录来获取系统信息;
  • /root:系统管理员的主目录;
  • /tmp:存放公用临时文件目录。
  • /sbin/usr/sbin:系统级的命令与工具目录;
  • /bin/usr/bin:用户级的命令与工具目录;
  • /usr/include:C语言,内核编译所需要的头文件存放目录;
  • /lib/usr/lib:库文件存放目录,其中有表态库和动态库;
  • /usr/src:Linux源代码目录,编译内核时使用;
  • /var:通常用来存放一些经常变化的内容,比如各种网络服务的工作目录都在这里;

Linux文件系统类型

EXT文件系统

  • Linux的第一个版本是基于Minix文件系统的。当Linux成熟时,引入了扩展文件系统(ext文件系统),ext是第一个专门为Linux设计的文件系统。但由于ext文件系统在稳定性,速度和兼容性方面存在不少缺陷,已经很少使用。
  • Linux在1994年引入了二级扩展文件系统(second extended file system,ext2),相当高效和稳定,是Linux系统默认使用的文件系统。ext2文件系统是非日志文件系统,这在关键行业的应用是一个致命的弱点。
  • ext2文件系统经过逐步改进形成了ext3文件系统,这个新的文件系统在设计时牢记了两点,一是成为一个日志文件系统,二是尽可能与原来的ext2文件系统兼容。

目前ext3文件系统非常稳定可靠,该文件系统具有如下特点:

  1. 高可用性
    Linux系统使用ext3文件系统后,即使非正常关机,系统也不需要检查文件系统。
  2. 数据的完整性
    ext3文件系统能够极大地提高文件系统的完整性,避免了意外关机对文件系统的破坏。
  3. 文件系统的速度
    ext3文件系统的日志功能对磁盘的驱动器读写头进行了优化。
  4. 数据转换
    由ext2文件系统转换成ext3文件系统非常容易。另外,ext3文件系统可以不经任何更改,直接加载成为ext2文件系统。
  5. 多种日志模式

ext3文件系统有三种日志模式EXT3三种日志模式:

  1. Journal模式:将所有数据和元数据的改变都记入日志,这种模式减少丢失每个文件所作修改的机会,但需要很多额外磁盘访问,是最安全和最慢的ext3日志模式;
  2. Ordered模式:只有对文件系统元数据的改变才记入日志,但保证数据在元数据之前被写入磁盘,是缺省的ext3日志模式;
  3. 写回(Writeback)模式:只有对文件系统元数据的改变才记入日志,数据和元数据被写入磁盘的顺序不保证,是在这三种日志模式中最快的模式。

其他文件系统

  • MS-DOS
    MS-DOS文件系统,DOS、Windows和OS/2操作系统上使用的文件系统。
  • UMSDOS
    扩展的MS-DOS文件系统。
  • VFAT
    Microsoft扩展的FAT文件系统,被Windows9x /2000 /XP使用。
  • Proc
    一种基于内存的伪文件系统,不占用磁盘空间,只是以文件的方式为访问Linux内核数据提供接口。
  • ISO9660
    一种针对ISO9660标准的CD-ROM文件系统。
  • SYSV
    System V/Coherent在 Linux 平台上的文件系统。
  • NFS
    Sun公司推出的网络文件系统。
  • SMB
    支持SMB协议的网络文件系统,可用于实现Linux与Windows的文件共享。
  • FAT
    它不是一个单独的文件系统,而是MS-DOS, umsdos 和vfat 文件系统的常用部分。
  • swap
    swap文件系统用于Linux的交换分区。
  • Reiserfs
    是Linux内核2.4.1以后支持的一种全新的日志文件系统。
  • NTFS
    Windows NT文件系统。
  • HPFS
    是Microsoft的LAN Manager中的文件系统,同时也是IBM的LAN Server和OS/2的文件系统,称为高性能文件系统。

 不同版本的Linux系统所支持的文件系统类型和种类都会有所不同。Linux 允许众多不同类型的文件系统共存,并支持跨文件系统的操作,这是由于虚拟文件系统(Virtual File System,简称VFS)的存在。
 虚拟文件系统是Linux内核中的一个软件层,用于给用户空间的程序提供文件系统接口;它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖VFS共存,而且也依靠VFS协同工作。
在这里插入图片描述

文件和目录的基本概念

文件

文件是指由创建者定义的,具有文件名的一组相关元素的集合,文件可以是文本文档、图片、程序等。
Linux系统下的文件名长度根据不同类型的文件系统有所不同,最多可到255个字符。Linux下为文件取名必须遵守以下规则:

  1. 除了“/”外,所有的字符都可以使用;
  2. 转义字符最好不用,这些字符在Linux系统下有特定的含义,如“?”(问号),“*”(星号),“ ”(空格),“$”(货币符),“&”等;
  3. 避免使用“+”、“-”或“.”作为普通文件名的第一个字符(在Linux下以“.”开头的文件是隐藏文件);
  4. Linux系统的文件名大小写敏感,文件Memo和文件memo是两个不同的文件。

Linux操作系统支持多种文件类型,下面介绍常见的几种。

  1. 普通文件
    普通文件也称为常规文件,是 Linux 中最一般格式的文件,包括系统文件、用户文件和库函数。
  2. 目录文件
    目录文件是由文件目录信息构成的特殊文件,目录文件的内容不是应用程序和数据,而是用来检索普通文件的目录信息。
  3. 设备文件
    在Linux中输入输出设备被看做特殊文件,称为设备文件。设备文件分两类,字符设备文件和块设备文件。设备文件存放在Linux的 /dev 目录
    在这里插入图片描述
    • 其中/dev/tty是表示终端设备的文件
    • 字符串“crw-rw-rw-”的第一个字符“c”表示是字符设备文件
    /dev/sda1表示USB移动存储设备的文件
    • 字符串“brw-rw----”的第一个字符是“b”,表示是块设备文件,
  4. 符号链接文件
    符号链接文件是一种特殊类型的文件,它的内容只是一个字符串,该字符串可能指向一个存在的文件也可能什么都不指向。

目录

目录是Linux文件系统中的一种特殊文件,文件系统利用目录完成按名存取及对文件信息的共享和保护。
工作目录与用户主目录

  • 工作目录
    工作目录是用户在登录到Linux系统后所处于的目录,也称为当前目录。
  • 用户主目录
    是系统管理员增加用户时创建的(以后也可以改变),每个用户都有自己的主目录。普通用户的主目录在/home下,root用户作为系统管理员,因为身份特殊所以有自己的主目录,在/root下。

用户刚登录到系统中时,其工作目录便是该用户主目录,通常与用户的登录名相同。如用户的登录名为user,其主目录通常为/home/user

路径

路径定义
路径是指从树型目录中的某个目录层次到某个文件的一条道路。
路径的构成要素
路径是由目录或目录和文件名构成的,中间用“/”分开。

路径分为绝对路径和相对路径两类:

  1. 绝对路径
    Linux系统中,绝对路径是从“/”(根目录)开始的,也称为完全路径,如/home/user01/usr/bin
  2. 相对路径
    Linux系统中,相对路径是从用户工作目录或用户主目录开始的路径,如 ./test../user1~/test。 其中 . 表示用户工作目录, .. 表示工作目录的上级目录, ~ 表示用户主目录。
2018-05-27 21:47:38 xietansheng 阅读数 1237

本文链接: https://mp.csdn.net/mdeditor/80044554

Linux 目录

linux_dir.png

  • /: 整个文件系统的唯一根目录。
  • /bin:Binary,存放常用的系统命令。
  • /sbin: System Binary,存放系统管理员 root 使用的命令。
  • /lib: Library,存放系统的函数库。
  • /home: 存放用户家目录的目录,每一个用户都在该目录下有一个家文件夹。
  • /usr: User,应用程序存放目录。
    • /usr/bin: 存放应用程序。
    • /usr/sbin: 存放系统管理员 root 使用的命令。
    • /usr/lib: 存放应用程序函数库。
    • /usr/local: 存放手动安装的软件。
      • /usr/local/bin: 存放用户自己创建的命令
      • /usr/local/sbin: 存放用户自己创建的系统管理员 root 使用的命令。
      • /usr/local/lib: 存放应用程序函数库。
      • /usr/local/share: 存放共享数据。
    • /usr/share: 存放共享数据。
      • /usr/share/doc: 存放系统说明文件。
      • /usr/share/man: 存放程序说明文件。
  • /root: 系统管理员 root 的家目录。
  • /boot: 放置系统启动时用到的一些文件。如 /boot/vmlinuz 为 linux 的内核文件。
  • /sys: System,存放系统信息。
  • /dev: Devices,所有设备都在该目录下,Linux 系统中所有设备都在该目录下映射为一个文件。
  • /etc: 系统所有的配置文件都在该目录下。
  • /proc: Process,此目录的数据在内存中,包含进程等信息,如系统核心,外部设备,网络状态等。
  • /media: 用于挂载各种媒体,如: 光盘、软盘等。
  • /mnt: Mount,用于挂载各种文件系统,如: U盘、SD卡等。
  • /tmp: Temp,存放临时文件。一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,不能存放重要的数据。
  • /lost+fount: 用于存放系统异常时丢失的文件,以便于恢复。
  • /opt: Option,用于存放安装的可选程序。
  • /srv: Server,服务启动后需要访问的目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
  • /var: Vraiable,用于存放那些在时间、大小、内容上会经常变化的文件。如: 日志文件。
2020-03-11 21:43:36 huanqingdong 阅读数 46

1. 文件系统是啥

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。

— 百度百科

百科解释有点太专业,实际上就是一个帮助操作系统完成文件存储、检索、管理等功能的软件。

2. 基本的Linux文件系统

2.1 ext文件系统

Linux系统中最早引入的文件系统叫扩展文件系统(extended filesystem,简称ext)。它使用虚拟目录来操作硬件设备(一切皆文件),在物理设备上用订场的块存储数据。
ext将磁盘分成两部分:

  • inode区(inode table)
    inode已节点号区分,存放文件属性信息,例如名称、大小、访问权限、指向数据区块的指针
  • 数据区
    按块存储文件数据

2.2 ext2文件系统

对ext进行提升

  • 单文件上限从2G提升至2T(后期版本32T)
  • inode中增加了文件创建时间,修改时间、最后访问时间
  • 按组分配磁盘块,减轻碎片化

ext2文件系统缺陷
由于采用先将文件写入数据区,再更新或添加inode信息,这两步并没有事务保证,因此会存在inode区和数据区会存在数据不一致的情况,导致文件系统崩溃。

3. 日志文件系统

日志文件系统先将文件的更改写入到临时文件(称作日志, journal)中。在数据成功写到存储设备和索引节点表之后,再删除对应的日志条目。如果系统在数据被写入存储设备之前崩溃或断电了,日志文件系统下次会读取日志文件并处理上次留下的未写入的数据。
Linux中有3种广泛使用的日志方法,每种的保护等级都不相同
数据模式
索引节点和文件都会被写入日志;丢失数据风险低,但性能差
有序模式
只有索引节点数据会被写入日志,但只有数据成功写入后才删除;在性能和安全性之间取得了良好的折中
回写模式
只有索引节点数据会被写入日志,但不控制文件数据何时写入;丢失数据风险高,但仍比不用日志好

3.1 ext3文件系统

2001年引入Linux内核中,较ext2提升为每个存储设备添加一个日志文件,默认采用有序模式的日志功能,模式可通过命令进行修改。

3.2 ext4文件系统

2008年受Linux官方内核支持
较ext3提升

  • 支持数据压缩和加密
  • 支持区段(extent)的特性
    区段在存储设备上按块分配空间,但在索引节点表中只保存起始块的位置。由于无需列出所有用来存储文件中数据的数据块,它可以在索引节点表中节省一些空间。
  • 引入了块预分配技术( block preallocation)

3.3 XFS文件系统

美国硅图公司( SGI)最初在1994年为其商业化的IRIX Unix系统开发了XFS。 2002年,它被发布到了适用于Linux环境的版本。
XFS文件系统采用回写模式的日志,在提供了高性能的同时也引入了一定的风险,因为实际数据并未存进日志文件。 XFS文件系统支持在线调整文件系统的大小,但只能扩大不能缩小

4.写时复制文件系统

写时复制(copy-on-write,COW)
COW利用快照兼顾了安全性和性能。如果要修改数据,会使用克隆或可写快照。修改过的数据并不会直接覆盖当前数据,而是被放入文件系统中的另一个位置上。即便是数据修改已经完成,之前的旧数据也不会被重写。

4.1 ZFS文件系统

ZFS是由Sun公司于2005年研发的,用于OpenSolaris操作系统,从2008年起开始向Linux移植,最终在2012年投入Linux产品的使用。
ZFS是一个稳定的文件系统,与Resier4、 Btrfs和ext4势均力敌。它最大的弱项就是没有使用GPL许可。自2013年发起的OpenZFS项目有可能改变这种局面。但是,在获得GPL许可之前, ZFS有可能终无法成为Linux默认的文件系统

4.2 Btrf文件系统

Btrfs文件系统是COW的新人,也被称为B树文件系统。它是由Oracle公司于2007年开始研发的。 Btrfs在Reiser4的诸多特性的基础上改进了可靠性。另一些开发人员最终也加入了开发过程,帮助Btrfs快速成为了最流行的文件系统。究其原因,则要归于它的稳定性、易用性以及能够动态调整已挂载文件系统的大小。 OpenSUSE Linux发行版最近将Btrfs作为其默认文件系统。除此之外,该文件系统也出现在了其他Linux发行版中(如RHEL),不过并不是作为默认文件系统。

2019-05-30 21:33:14 xlsj228 阅读数 480

本文1-6部分介绍文件系统,6-8部分介绍文件类型

1、文件系统

Linux采用了树状结构的文件系统,它由目录和目录下的文件一起构成。使用单一的根目录结构,所有的分区都挂载到单一的“/”目录上,其结构示意图如图所示。

“/”目录也称为根目录,位于Linux文件系统目录结构的顶层。

2、系统目录

/ Linux系统的根目录,包含Linux系统的所有目录和文件
/etc 有关系统设备与管理的配置文件
/sbin 存放系统启动时所需的运行程序
/bin 该目录中含有常用的命令文件,不能包含子目录
/boot 操作系统启动时的核心文件
/usr/local 存放用户后期安装的应用程序文件
/root 超级用户主目录
/dev 接口设备文件目录,保存外围设备代号
/mnt

设备文件的挂接点,默认有/mnt/cdrom和/mnt/floppy两个目录,分别用于挂载光驱和软驱

 

/home 用户的宿主目录,通常将其设置在独立的分区
   

 3、存储设备的命名

在Linux中,对于IDE磁盘,使用“hd”表示,并且在“hd”之后使用小写字母表示磁盘编号,磁盘编号之后是分区编号,使用阿拉伯数字表示。主分区的编号依次是1~4,而扩展分区上的逻辑分区编号从5开始。而SATA和SCSI磁盘共同使用“sd”表示。                常用存储设备的名称表示如左图所示。

4、分区管理

disk工具中常用的命令及含义如图所示:

  常用的磁盘分区管理工具有fdisk和parted,它们都可以进行创建分区、删除分区、查看分区信息等基本操作,此外parted还可以调整已有分区的尺寸。                                  我们以fdisk为例,启动fdisk:                                                                                        root# fdisk /dev/sda                  (/dev/sda是用户要进行分区的磁盘设备名)

5、文件系统的建立

要想在分区上存储数据,首先需要建立文件系统。常用的建立文件系统的命令有mkdosfs、mkfs.vfat和mkfs。

1) mkdosfs命令
该命令用于在磁盘或分区中建立dos文件系统,即FAT文件系统,其格式如下:
mkdosfs  [选项]  磁盘设备文件名

2) mkfs.vfat命令
该命令用于在磁盘或分区中建立FAT32文件系统,其基本使用格式如下:
mkfs.vfat [选项] 磁盘设备文件名

3)

3) mkfs命令
该命令允许根据用户的选择建立相应的文件系统,同mkdosfs、mkfs.vfat等命令类似,但功能更强大。其格式如下:
mkfs  [选项]  磁盘设备文件名 [块大小]

6、文件系统的挂载

Linux系统中,文件系统创建后,还需将其安装到Linux目录树的某个位置上才能使用,这个过程称为挂载,文件系统所挂载到的目录称为挂载点。文件系统使用完毕,还可对其进行卸载。

1)    挂载文件系统

文件系统的挂载,可以在系统引导过程中自动加载,也可以使用命令手工挂载。我们介绍使用命令手工挂载:
挂载文件系统的命令为mount,该命令语法如下:
mount  [选项]  [设备文件名]  [挂接点]

2) 卸载文件系统

如果系统已挂接的磁盘不再使用,为了节省系统资源,可以将该磁盘从系统中卸下。

卸载文件系统使用umount命令,其格式如下:
umount  [选项]  设备文件名或挂接目录

注意:umount通常不能卸载正在使用的文件系统。如果必须卸载可以使用-f参数,或重启系统。

7.Linux的文件类型

Linux系统中,文件的命名必须遵循如下的规则:

(1) 文件名最长可以达到256个字符,可由A~Z、a~z、0~9、.、-、_、等符号组成。
(2) 文件名区分大小写。
(3) 文件没有扩展名的概念。
(4) 使用“/”作为根目录和目录层之间的分隔符。
(5) 支持相对路径和绝对路径。

Linux系统中,文件的属性

在Linux操作系统中也必须区分文件类型,通过文件类型可以判断文件属于可执行文件、文本文件还是数据文件。在Linux系统中文件可以没有扩展名。
文件类型都是和应用程序相关联的,在打开某个文件时,操作系统会自动判断用那个应用程序打开,在Linux系统中,.txt文件由gedit程序打开,.doc文件由OpenOffice.org Writer应用程序打开。在Windows下文件是否被执行也取决于扩展名,而Linux下的扩展名只能表示程序的关联,是否被执行取决于文件属性。

8、文件类型
通常,Linux系统中常用的文件类型有5种:普通文件、目录文件、设备文件、管道文件和链接文件。

1) 普通文件
普通文件是计算机操作系统用于存放数据、程序等信息的文件,一般都长期存放于外存储器(磁盘、磁带等)中。

2) 目录文件
Linux系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构。

3)设备文件
Linux系统把每个设备都映射成一个文件,这就是设备文件,它是用于向I/O设备提供连接的一种文件,分为字符设备和块设备文件。

4)管道文件
管道文件也是Linux中较特殊的文件类型,这类文件多用于进程间的通信方面。

5)链接文件
链接文件有两种,一种是符号链接,也称为软连接,一种是硬链接。

9、本文部分总结于以下内容,完整内容查看下面网址

https://wenku.baidu.com/view/041a5a7d5acfa1c7aa00cc53.html

 

 

 

 

 

 

2019-10-14 20:19:45 weixin_42648229 阅读数 237

操作系统的基本功能之一就是文件管理,而文件管理是由文件系统完成的。文件系统的目的就是实现数据的查询和存储,由于使用场景和环境的不同,linux支持多种文件系统,不同的文件系统支持不同的体系。

#include<stdio.h>
//fs文件操作:读,写,执行
//文件id的长度,同类项个数,所对应的真实的地址,及属性(单位,所挂载的通知,是否校验,
struct file_item_t
{
	int id;//文件id号
	int real_addr;//真实对应的地址
	int len;//数据的长度
	int same;//同类项的个数
	int attr;//每个字节对应的bit位,表示特定的属性(bit23- bit31:数据的单位;bit16- bit22:该id所挂载的通知;bit8-bit15:所挂载的ram;bit0:数据是否校验;bit1:同类项使能;
			 //bit2:设备页的大小,一般只有操作flash设备的时候,这个属性才会生效
};


//通信相关的参数,存在e2里面
struct file_item_t comm_para[]=
{
	{ 0x1200,0x3450, 4,3,6},
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
};

int comm_para_num = sizeof(comm_para) / sizeof(comm_para[0]); //e2相关的参数总的个数

struct file_item_t ram_para[] =
{
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
	{ 0x1200,0x3450, 4,3,6 },
};
int ram_para_num = sizeof(ram_para) / sizeof(ram_para[0]); //ram相关的总的个数

														   //对id的操作,无外乎就是读,写 ,执行。
struct file_ops_t
{
	int(*read)(int id, int*buf, int len, void *flag); //读操作
	int(*write)(int id, int*buf, int len, void *flag);//写操作
	int(*ctrl)(int id, int*buf, int len, void *flag);//直接控制
};

int e2_read(int id, int*buf, int len, void *flag)
{

}
int e2_write(int id, int*buf, int len, void *flag)
{

}
int e2_ctrl(int id, int*buf, int len, void *flag)
{

}
//对存在e2地址相关的参数的操作
struct file_ops_t e2_fife_ops = 
{
	   e2_read,
	   e2_write,
	   e2_ctrl,
};

int at_read(int id, int*buf, int len, void *flag)
{

}
int at_write(int id, int*buf, int len, void *flag)
{

}
int at_ctrl(int id, int*buf, int len, void *flag)
{

}

int comm_read(int id, int*buf, int len, void *flag)
{

}
int comm_write(int id, int*buf, int len, void *flag)
{

}
int comm_ctrl(int id, int*buf, int len, void *flag)
{

}

struct ram_file_ops_t
{
	int index;
	struct file_ops_t *ram_ops;
};

struct file_ops_t at_ram =
{
	at_read,
	at_write,
	at_ctrl,
};

struct file_ops_t comm_ram =
{
	comm_read,
	comm_write,
	comm_ctrl,
};

//对每个id进行的操作,无外乎读,写,执行。根据具体绑定的驱动,进行实际的操作
struct ram_file_ops_t ram_file_ops[] =
{
	{ 3, &at_ram },
	{ 4, &comm_ram},
};
int  ram_file_ops_num = sizeof(ram_file_ops) / sizeof(ram_file_ops[0]);

struct which_partition_t
{
	struct file_ops_t *ops; //对id的操作进行实际控制
	struct file_item_t *item; //文件id的参数信息
	int *item_num;//文件id的个数 
	int attr;//文件所挂载的驱动  //根据所挂载的驱动,进行实际的读,写,执行操作
};


//文件id总的分类
struct which_partition_t which_partition[] = 
{
	{ &e2_fife_ops,   comm_para,  &comm_para_num,   0},
	{ &ram_file_ops,  ram_para,   &ram_para_num,   1},
};

int which_partition_num = sizeof(which_partition)/sizeof(which_partition[0]);

//文件系统运行时,总的数据结构
struct file_run_item_t 
{
	int id;//文件的id号
	int current_addr;//当前的地址,因为操作备用地址时,是根据当前地址偏移出来的
	int len;//操作e2的长度
	int crc_addr;//备份地址的长度
	int crc_len;//crc备份地址的长度
	struct which_partion_t *which_partition; //id所挂载的驱动和id相关的属性及id的操作(读,写,执行)
	struct items_t         *which_items; //文件类型
	struct device_t        *which_device;//真正挂驱动,挂IIC和spi
};

struct file_run_item_t   file_run_item = 0;//全局的fs结构体为0
struct fifo_t
{
	int *ptr;//申请内存的大小
	int read_ptr;//读指针
	int write_ptr;//写指针
	int buf_size;//内存的大小
};
struct fifo_t **notify = 0;//notify申请的全局变量

int bitmap[16] = {1,2,4,8,0x10,0x20,0x40,0x80,0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000};//分别为16个字节数据对应的bit位

//所挂载的通知
struct notify_para_t
{
	int notify_value;//通知的值
	int notify_index;//通知的索引
};

struct notify_para_t notify_para[]= 
{
	{0x4000,0x0006 },
	{0x6000,0x0007 },
};

int notify_para_num = sizeof(notify_para)/sizeof(notify_para[0]);//notify总的个数


//为每个模块关注的id进行申请内存
int notify_init(void)
{
	int  i = 0;
	int  j = 0;
	int  k = 0;
	int notify_index = 0;
	struct file_item_t *item = 0;
	int module_buf[16] = { 0 };//16个模块,每个模块要分配的内存的大小
	notify = (struct fifo_t**)malloc((sizeof(struct fifo_t*) * 16, 1));//给notify申请全局变量

	//遍历每个id,查找所有挂载此模块的id总的个数
	for (i = 0; i < which_partition_num; i++)
	{
		for (j = 0; j < which_partition[i].item_num; j++) //每个分区id总的个数
		{
			notify_index = (int)(item->attr >> 16);//判断该id是否挂载有通知
			if (notify_index) //挂载有通知
			{
				for (k = 0; k < notify_para_num; k++)
				{
					if (notify_para[k].notify_index == notify_index)
					{
						if (notify_para[k].notify_value && bitmap[i])//挂载有此模块的通知
						{
							module_buf[i]++;
						}				
					}

				}

			}

		}
	}

	//为每一个模块所挂载的通知,分配总的内存
	for (i = 0; i < 16; i++)
	{
		notify[i] = (struct fifo_t *)malloc(sizeof(struct fifo_t),1);
		notify[i]->ptr = (int)malloc(module_buf[i] * 2);//申请的缓存的大小
		notify[i]->read_ptr = 0;
		notify[i]->write_ptr = 0;
		notify[i]->buf_size = module_buf[i];
	}
}

int find_id_result(int id)
{
	int  i = 0, j = 0, k = 0;
	struct file_item_t *item = 0;
	int start = 0, end = 0, middle = 0, result = 0xA5;
	//采用二分法,在总的表格里面查找此id相关的信息
	for (i = 0; i < which_partition_num; i++)
	{
		item = which_partition[i].item;//所有参数相关的信息
		for (j = 0; j < which_partition[i].item_num; j++)
		{
			if ((id >= item->id) && (id <= item->id + which_partition[i].item_num + 1)) //要搜索的id在开始和结束里面,则从此表格中进行搜索
			{
				start = item->id;
				end = item->id + which_partition[i].item_num + 1;
				middle = (start + end) / 2;
				do
				{
					if (id > middle)
					{
						result = 1;//需要往后查询
						start = middle;
						middle = (start + end) / 2;
					}
					else if (id < middle)  //需要往前查询
					{
						result = 1;//需要往后查询
						end = middle;
						middle = (start + end) / 2;
					}
					else if (id == middle)
					{
						result = 0;
						file_run_item.which_items = item;
						file_run_item.which_partition = &which_partition[i];
						//根据id所给定的属性里面的信息,进行查找其绑定的驱动
                   
						return true;//正确查询到此id
					}

				} while (result != 0)//当index= 0时,表示查询到;>1时表示

			}
		}
	}
	return false;//从所有表格中进行查询,都没有查询到
}


//根据要搜索的id,在总的表格进行搜素,并且找到其所挂载的驱动
 int hfp_write(int id, int *buf, int len, void *flag)
{	
	int  i = 0, j = 0;
	struct file_item_t *item = 0;
	int notify_data = 0;
	if( true == find_id_result(id))//在表格中查询得到正确的id
	{
       //根据查询id所绑定的数据项的属性,来找其挂载的驱动
		 item = file_run_item.which_items;
		 int driver_attr = (int)(item->attr >> 16);
		 int notify_attr = (int)(item->attr >> 8);
		 if (driver_attr) //当配置有ram相关的驱动时,则从ram表格里面进行查找,进行执行对应的对应操作
		 {
			 for (i = 0; i < ram_file_ops_num; i++)
			 {
				 if (ram_file_ops_num[i].index == driver_attr) //查询得到对应的ramfs驱动
				 {
					 ram_file_ops_num[i].ram_ops->write(id, buf, len, flag);
				 }
				 return;
			 }		
		 }
		 //不是ram的话,就是e2或flash,直接操作就可以了
		 file_run_item.which_partition->ops->write(id, buf, len, flag); //真实的地址
	}
    //操作完要执行的动作后,进行通知其他模块。将此id写入到
	if (notify_attr) //挂载着通知
	{
		for (i = 0; i < notify_para_num; i++)
		{
			if (notify_attr == notify_para_num[i].notify_index)
			{
				notify_data = notify_para_num[i].notify_value;//获取到该id所关注的模块值
				for (j = 0; j < 16; j++) //看需要通知哪个模块
				{
					if (notify_data & bitmap[i])//需要通知到这个模块,对应的fifo里面写入id
					{
						notify[i]->ptr[wr++] =  id >> 8;
						notify[i]->ptr[wr++] =  id;                   
					}
				}
			}

		}
	}

}

Linux文件系统之二

阅读数 558

Linux文件系统详解

阅读数 1565

Linux 文件系统编程

阅读数 279

Linux 文件系统编程

博文 来自: clusterally

linux文件系统简介

阅读数 1304

没有更多推荐了,返回首页