5.0 NuttX File System

本文介绍了NuttX操作系统中的文件系统,包括Pseudo Root File System和Mounted File Systems。NuttX的根文件系统是一个内存中的伪文件系统,支持挂载如VFAT、ROMFS、NXFFS和NFS等真实文件系统。文章还探讨了块设备驱动和文件系统的注册过程,以及mount流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处:5.0 NuttX File System_Alvin Peng的博客-CSDN博客

文章均出自个人理解

前言

      前一段时间折腾了几个驱动(PWM、Serial、I2C),这次来折腾下,Nuttx的文件系统,之前看到手册上有好多xxxFs啥的,里面有提到以个可以执行二进制文件,听起来很有意思,现在开始来看看到底是怎么实现的呢。

Pseudo Root File System

     Nuttx的根文件系统是一个简单的伪文件系统,这个文件系统存在内存中,是不需要任何存储介质或块设备驱动支持的,我的理解是在RAM中申请的一块区域,然后构建这个文件系统的,其内容是通过标准文件系统操作引用即时生成的,这句话说的容易理解点就是说,这个文件系统具备(open、close、write、read...)这些接口,还记得之前的文档中说道,nuttx是将所有的驱动向上都抽象成了这种接口的。

     同样的在Linux/proc文件系统也是伪文件系统(原文翻译,我其实不懂linux,没细致去研究过),在我们之前编写的驱动(字符型、块驱动...)通过regist_driver(...)注册驱动时候,就是注册到这个伪根文件系统的,说道这里,其实这里的文件系统其实就是一个特定结构的数组(这里挖个坑,后面列举实例佐证);

Mounted File Systems

     之前提到的这种伪文件系统(Simple in-memory file system)可以被扩展为具备访问真实存储设备的块设备(block device),Nuttx是支持标准的mount()接口,允许一个块设备绑定到伪文件系统的一个挂载点上的,目前Nuttx是支持标准的VFAT和ROMFS文件系统,以及Nuttx的NXFFS和网络文件系统客户端(NFS client),这里表达的意思有点含糊,简单的一句话应该是nuttx的伪文件系统可以为以下几种文件系统提供挂载点;

Comparison to Linux

    这里和linux做个对比就是,nuttx的根文件系统是一个伪文件系统,真实的文件系统(存在真实的介质中)可能被挂载在这个伪文件系统中,而linux的根文件系统是真实存在与介质中的; 通过读这段文字,我的理解还是猜测这里的伪文件系统就是指不会被保存,掉电就消失了,但是ta又具备文件系统所有的接口和功能罢了(这里改天还是要找出具体的例子来佐证);

以下的文字是参考了《NuttX文件系统学习之关键数据结构及设备注册》文章

     老规矩还是先来整理框架,前面翻译的文章让人没有清晰的结构,感觉有点云里雾里,直接开始梳理;

在Nuttx的文件系统中,定义了字符型驱动设备、块驱动设备、Mountpoint驱动设备...这里需要回忆下之前的字符型设备最关键的两个数据结构×_dev_s和×_ops_s,下面就先分析字符型设备注册的过程,来了解Nuttx的文件系统框架;

字符型驱动注册流程

     之前在填充了×_dev_s和×_ops_s的数据结构后就调用了register_driver来注册;

int register_driver(FAR const char *path,
                    FAR const struct file_operations *fops,
                    mode_t mode,
                    FAR void *priv)
{
  FAR struct inode *node;
  int ret;

  /* Insert a dummy node -- we need to hold the inode semaphore because we
  * will have a momentarily bad structure.
  */

  inode_semtake();
  ret = inode_reserve(path, &node);
  if (ret >= 0)
  {
  /* We have it, now populate it with driver specific information.
  * NOTE that the initial reference count on the new inode is zero.
  */

  INODE_SET_DRIVER(node);

  node->u.i_ops = fops;
#ifdef CONFIG_FILE_MODE
  node->i_mode = mode;
#endif
  node->i_private = priv;
  ret = OK;
  }

  inode_semgive();
  return ret;
}

这里很明显,我们填充的两个驱动数据结构都被注册到了struct inode这个数据结构中了,实际这inode就是我们这次分析的切入点;

/* This structure represents one inode in the Nuttx pseudo-file system */

struct inode
{
  FAR struct inode *i_peer;  /* Link to same level inode */
  FAR struct inode *i_child; /* Link to lower level inode */
  int16_t i_crefs;           /* References to inode */
  uint16_t i_flags;          /* Flags for inode */
  union inode_ops_u u;       /* Inode operations */
#ifdef CONFIG_FILE_MODE
  mode_t i_mode;             /* Access mode flags */
#endif
  FAR void *i_private;       /* Per inode driver private data */
  char i_name[1];            /* Name of inode (variable) */
};union inode_ops_u u;       /* Inode operations */
#ifdef CONFIG_FILE_MODE
  mode_t i_mode;             /* Access mode flags */
#endif
  FAR void *i_private;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值