赞
踩
目录
tmpfs 是一个临时文件系统的实现,是一种基于内存的文件系统,优势是:
tmpfs 还有一个特点,它不是存在于一个底层块设备上面,而是直接建立在虚拟内存之上的,无需使用 mkfs 格式化,直接 mount挂载 就可以创建 tmpfs 文件系统。由于是在内存中存储数据,那么在断电后数据也会丢失。
在 RT-Thread 中,也存在一份ramfs。tmpfs 和 ramfs 的区别如下表:
特性 | tmpfs | ramfs |
---|---|---|
是否固定大小 | 否 | 是 |
是否支持文件夹操作 | 是 | 否 |
具有易失性 | 是 | 是 |
目前 tmpfs 已经作为一个组件存在于 RT-Thread 中,位于 rt-thread\components\dfs\filesystems\tmpfs
,可以进行裁剪配置。
RT-Thread中的tmpfs和ramfs都是基于内存的文件系统,但它们之间存在一些重要的区别。
- 访问权限:ramfs只能由root用户访问,而tmpfs则允许一般用户访问。
- 存储介质和机制:ramfs直接工作于虚拟文件系统(VFS)层,它不能也不需要具体问题系统层来格式化,可以创建多个,并且在创建时可以指定其最大能使用的内存大小。而tmpfs则是一种临时文件系统,直接建立在虚拟内存之上,无需使用mkfs格式化,直接mount就可以创建。tmpfs的存储内容是通过虚拟内存(VM)管理的,包括真实的物理内存和swap磁盘,但在swap中的读写速度相对于物理内存要慢很多。
- 数据持久性:由于ramfs和tmpfs都是基于内存的文件系统,因此在断电后数据都会丢失。但是,tmpfs有一个特点,即它是临时的,当umount一个tmpfs实例时,存储在其中的所有内容将丢失。而ramfs在默认情况下被限制最多可使用内存大小的一半,但可以通过maxsize选项来改变其最大使用内存的大小。
- 容量调整: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则更加简单和直接,主要用于临时存储和系统初始化等场景。开发者可以根据具体的应用场景和需求来选择使用哪种文件系统。
对 tmpfs 文件的操作,应用层可以直接使用 POSIX 进行访问,操作文件的访问序列图如下所示:
对文件的操作有:
对目录的管理可以使用 POSIX 接口,其访问序列图与访问文件序列图类似,对目录的操作有:
可以使用 DFS 的 MSH 命令对 tmpfs 进行操作,文件系统操作常用的 MSH 命令如下表所示:
MSH 命令 | 描述 |
---|---|
ls | 显示文件和目录的信息 |
cd | 进入指定目录 |
cp | 复制文件 |
rm | 删除文件或目录 |
mv | 将文件移动位置或改名 |
echo | 将指定内容写入指定文件,当文件存在时,就写入该文件,当文件不存在时就新创建一个文件并写入 |
cat | 展示文件的内容 |
pwd | 打印出当前目录地址 |
mkdir | 创建文件夹 |
如下是应用层使用 DFS 虚拟文件系统的 API 对 tmpfs 进行访问的序列图:
使用 QEMU 演示 tmpfs 的使用,以挂载在 "/mnt/tmp" 目录为例进行演示。
在 rt-thread 源码的 rt-smart 分支上,打开 qemu-vexpress-a9 BSP,使用 menuconfig 在组件中配置 tmpfs,位于 "RT-Thread Components → Device virtual file system",退出保存。
备注:
这里支持RAM文件系统和tmp文件系统!!!
注意:若同一个系统中使用多个文件系统,注意在同一界面修可挂载文件系统数量值与文件系统类型个数的值,使其支持多文件系统。
在 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
使用文件系统的 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 命令查看文件内容
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。