[嵌入式系统-68]:RT-Thread-组件:tmpfs 临时文件系统,是一种基于内存的文件系统

目录

tmpfs 临时文件系统

1. 文件管理

2. 目录管理

3. MSH 命令

4. 如何使用

5. 使用示例


tmpfs 临时文件系统

tmpfs 是一个临时文件系统的实现,是一种基于内存的文件系统,优势是:

  • 动态调整虚拟内存
  • 读写速度快

tmpfs 还有一个特点,它不是存在于一个底层块设备上面,而是直接建立在虚拟内存之上的,无需使用 mkfs 格式化直接 mount挂载 就可以创建 tmpfs 文件系统。由于是在内存中存储数据,那么在断电后数据也会丢失

在 RT-Thread 中,也存在一份ramfstmpfs 和 ramfs 的区别如下表:

特性tmpfsramfs
是否固定大小
是否支持文件操作
具有易失性

目前 tmpfs 已经作为一个组件存在于 RT-Thread 中,位于 rt-thread\components\dfs\filesystems\tmpfs,可以进行裁剪配置。

RT-Thread中的tmpfs和ramfs都是基于内存的文件系统,但它们之间存在一些重要的区别。

  1. 访问权限:ramfs只能由root用户访问,而tmpfs则允许一般用户访问
  2. 存储介质和机制:ramfs直接工作于虚拟文件系统(VFS)层,它不能也不需要具体问题系统层来格式化,可以创建多个,并且在创建时可以指定其最大能使用的内存大小。而tmpfs则是一种临时文件系统,直接建立在虚拟内存之上无需使用mkfs格式化,直接mount就可以创建。tmpfs的存储内容是通过虚拟内存(VM)管理的,包括真实的物理内存和swap磁盘,但在swap中的读写速度相对于物理内存要慢很多。
  3. 数据持久性:由于ramfs和tmpfs都是基于内存的文件系统,因此在断电后数据都会丢失。但是,tmpfs有一个特点,即它是临时的,当umount一个tmpfs实例时,存储在其中的所有内容将丢失。而ramfs在默认情况下被限制最多可使用内存大小的一半,但可以通过maxsize选项来改变其最大使用内存的大小。
  4. 容量调整:tmpfs有最大容量限制,但可以通过"mount -o remount …"命令对tmpfs的容量大小进行调整。而ramfs在创建时可以指定其最大能使用的内存大小,但创建后没有容量大小的限制,存在耗尽内存的风险。

总的来说,tmpfs和ramfs都是基于内存的文件系统,但tmpfs在访问权限、存储机制、数据持久性和容量调整方面提供了更多的灵活性和功能。在选择使用哪种文件系统时,需要根据具体的应用场景和需求来进行选择。

在RT-Thread中,tmpfs和ramfs作为基于内存的文件系统,也有其特定的用途。

tmpfs

tmpfs在RT-Thread中主要用于存储临时数据。由于tmpfs是在内存中存储数据,因此它的读写速度非常快,非常适合用于存储那些需要频繁访问但又不需要持久化存储的数据。例如,它可以用于存储进程运行时产生的临时文件、缓存数据等。在RT-Thread中,tmpfs可以通过POSIX接口进行访问和操作,提供了open、close、read、write等基本的文件操作函数,方便开发者进行文件操作。

ramfs

ramfs在RT-Thread中同样是一个基于内存的文件系统,但相比于tmpfs,它更加简单和直接。ramfs直接利用系统的物理内存作为存储空间,将其作为一个可调整大小的基于RAM的文件系统。ramfs没有持久化存储,数据在断电后会丢失,因此它主要用于临时存储和系统初始化等场景。ramfs的大小是动态调整的,随着文件的创建和删除,它会动态地增加或减少所使用的内存空间。在RT-Thread中,ramfs可以通过特定的API进行创建和管理,但相比于tmpfs,它的使用相对较少,因为tmpfs提供了更多的功能和灵活性。

总的来说,tmpfs和ramfs在RT-Thread中各有其用途,tmpfs更适合用于存储需要频繁访问但又不需要持久化存储的临时数据,而ramfs则更加简单和直接,主要用于临时存储和系统初始化等场景。开发者可以根据具体的应用场景和需求来选择使用哪种文件系统。

1. 文件管理

对 tmpfs 文件的操作,应用层可以直接使用 POSIX 进行访问,操作文件的访问序列图如下所示:

image-20221101172133720

对文件的操作有:

  • open:打开文件
  • close:关闭文件
  • read:读取文件数据
  • write:向文件中写数据
  • lseek:改变读写一个文件时读写指针位置
  • getdents:获取目录项
  • stat:获取文件状态

2. 目录管理

对目录的管理可以使用 POSIX 接口,其访问序列图与访问文件序列图类似,对目录的操作有:

  • mkdir:创建目录
  • rmdir:删除目录
  • opendir:打开目录
  • readdir:读取目录
  • closedir:关闭目录
  • dirent:读取目录
  • telldir:取得目录流的读取位置
  • seekdir:设置下次读取目录的位置
  • rewinddir:重设读取目录的位置为开头位置

3. MSH 命令

可以使用 DFS 的 MSH 命令对 tmpfs 进行操作,文件系统操作常用的 MSH 命令如下表所示:

MSH 命令描述
ls显示文件和目录的信息
cd进入指定目录
cp复制文件
rm删除文件或目录
mv将文件移动位置或改名
echo将指定内容写入指定文件,当文件存在时,就写入该文件,当文件不存在时就新创建一个文件并写入
cat展示文件的内容
pwd打印出当前目录地址
mkdir创建文件夹

4. 如何使用

如下是应用层使用 DFS 虚拟文件系统的 API 对 tmpfs 进行访问的序列图:

  • 文件系统自动初始化:开启自动初始化之后,虚拟文件系统和临时文件系统都将自动初始化,无需用户执行。
  • 在应用层使用 dfs_mount() 挂载 tmpfs 文件系统。
  • 在应用层使用 DFS 虚拟文件系统的 API 对 tmpfs 进行访问,更多 API 接口详见 DFS 虚拟文件系统

image-20221102174841105

5. 使用示例

使用 QEMU 演示 tmpfs 的使用,以挂载在 "/mnt/tmp" 目录为例进行演示。

在 rt-thread 源码的 rt-smart 分支上,打开 qemu-vexpress-a9 BSP,使用 menuconfig 在组件中配置 tmpfs,位于 "RT-Thread Components → Device virtual file system",退出保存。

image-20221101155404497

备注:

这里支持RAM文件系统和tmp文件系统!!!

注意:若同一个系统中使用多个文件系统,注意在同一界面修可挂载文件系统数量值与文件系统类型个数的值,使其支持多文件系统。

image-20221103101448013

在 mnt.c 中使用 dfs_mount 挂载文件系统的代码如下所示:

    /* romfs 挂载在 / 下 */
    /* fatfs 挂载在 /mnt 下 */
    /* tmpfs 挂载在 /mnt/tmp 下 */
    if (dfs_mount(RT_NULL, "/mnt/tmp", "tmp", 0, NULL) != 0)
    {
        rt_kprintf("Dir /tmp mount failed!\n");
        return -1;
    }复制错误复制成功

使用命令 scons 编译后,输入 qemu.bat 运行 qemu,切换到 mnt 目录下创建 tmp 目录(若是第一次使用 fatfs,则需要先使用 mkfs 格式化)

msh />cd mnt            # 使用 cd 命令切换目录
msh /mnt>mkdir tmp      # 使用 mkdir 创建新目录
msh /mnt>ls             # 使用 ls 命令查看当前目录信息
Directory /mnt:
tmp                 <DIR>复制错误复制成功

执行 "ctrl+c" 退出 qemu 后,再次执行 qemu.bat 运行 qemu

image-20221101155816447

使用文件系统的 MSH 命令在 tmpfs 文件系统中操作文件:

msh /mnt/tmp>echo "RT-Thread"         # 将字符串输出到标准输出
RT-Thread

msh /mnt/tmp>mkdir test               # 创建 test 目录
msh /mnt/tmp>echo "rtt" tmpfile.txt   # 使用 echo 命令将输入的字符串输出到指定输出位置
msh /mnt/tmp>ls                       # 使用 ls 命令查看当前目录信息
Directory /mnt/tmp:
tmpfile.txt         3
test                <DIR>

msh /mnt/tmp>cat tmpfile.txt          # 使用 cat 命令查看文件内容

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值