Q群:
电话:
邮箱:
地址:
RAMDISK即虚拟内存盘,它是通过软件将一部分内存(RAM)模拟为磁盘(DISK)来使用。相对于直接的硬盘文件访问来说,它可以极大的提高文件访问速度。但是RAM的易失性也意味着当关闭电源后这部分数据将会丢失,所以一般用来存储临时文件。RAMDSIK有以下特点:
使用RAM模拟成块设备,访问速度快,且可以频繁读写,但是掉电消失。
任何在磁盘上面可以运行的文件系统,都可以在RAMDISK上面运行。例如在本操作系统中,可以在RAMDISK上面运行CUTEFS、FATFS等(在RAMDISK上面运行FATFS时,为满足FATFS的基本条件,RAMDSIK至少需要512byte per block * 192 block)。
接口 | 说明 |
---|---|
ramdisk_dev_init | 静态初始化RAMDISK,需要使用者给出RAMDISK的地址空间 |
ramdisk_dev_deinit | 反初始化RAMDISK,与ramdisk_dev_init()配合使用 |
ramdisk_dev_create | 动态创建并初始化RAMDISK,RAMDISK的地址空间由该接口动态申请 |
ramdisk_dev_destroy | 销毁RAMDISK,并释放对应的内存空间,与ramdisk_dev_create()配合使用 |
该函数用于静态初始化RAMDISK,需要使用者给出具体的RAMDISK的地址空间,函数原型如下:
os_err_t ramdisk_dev_init(ramdisk_dev_t *ram_dev, void *addr, const char *name, os_uint32_t size, os_uint32_t block_size);
参数 | 说明 |
---|---|
ram_dev | RAMDISK句柄,由使用者提供 |
addr | RAMDISK的起始地址,由使用者提供 |
name | RAMDISK设备名字 |
size | RAMDISK总的空间大小 |
block_size | RAMDISK每个块的大小 |
该函数用于反初始化RAMDISK,与ramdisk_dev_init()配合使用,函数原型如下:
void ramdisk_dev_deinit(ramdisk_dev_t* ram_dev);
参数 | 说明 |
---|---|
ram_dev | RAMDISK句柄,为ramdisk_dev_init()时使用的句柄 |
返回 | 说明 |
无 | 无 |
该函数用于动态创建并初始化RAMDISK,RAMDISK的地址空间由该接口动态申请,函数原型如下:
ramdisk_dev_t *ramdisk_dev_create(const char *name, os_uint32_t size, os_uint32_t block_size);
参数 | 说明 |
---|---|
name | RAMDISK设备名字 |
size | RAMDISK总的空间大小 |
block_size | RAMDISK每个块的大小 |
返回 | 说明 |
非OS_NULL | 创建成功 |
OS_NULL | 创建失败 |
该函数用于销毁RAMDISK,并释放对应的内存空间,与ramdisk_dev_create()配合使用,函数原型如下:
void ramdisk_dev_destroy(ramdisk_dev_t *ram_dev);
参数 | 说明 |
---|---|
ram_dev | RAMDISK句柄,为ramdisk_dev_create()时返回的句柄 |
返回 | 说明 |
无 | 无 |
本示例演示了RAMDISK的静态初始化和反初始化,并配合CUTEFS文件系统使用,示例代码如下:
#include <oneos_config.h>
#include <os_dbg.h>
#include <shell.h>
#include <os_errno.h>
#include <ramdisk.h>
#include <vfs_posix.h>
#define TEST_TAG "TEST"
#define RAMDISK_NAME "ramdisk0"
#define RAMDISK_SIZE (25*1024)
#define RAMDISK_BLK_SIZE 512
char ramdisk_addr[RAMDISK_SIZE];
struct ramdisk_device ramdisk_dev;
static void test_ramdisk_init(void)
{
if(OS_EOK != ramdisk_dev_init(&ramdisk_dev, &ramdisk_addr, RAMDISK_NAME, RAMDISK_SIZE, RAMDISK_BLK_SIZE))
{
LOG_E(TEST_TAG, "ramdisk init failed.");
return;
}
LOG_W(TEST_TAG, "ramdisk init success.");
if (0 != vfs_mount(RAMDISK_NAME, "/", "cute", 0, 0))
{
LOG_E(TEST_TAG, "cutefs mount failed.");
return;
}
LOG_W(TEST_TAG, "cutefs mount success.");
}
SH_CMD_EXPORT(ramdisk_init, test_ramdisk_init, "test init ramdisk");
static void test_ramdisk_deinit(void)
{
LOG_W(TEST_TAG, "filesystem unmount, and ramdisk deinit.");
vfs_unmount("/");
ramdisk_dev_deinit(&ramdisk_dev);
}
SH_CMD_EXPORT(ramdisk_deinit, test_ramdisk_deinit, "test deinit ramdisk");
运行结果如下:
sh />ramdisk_init
W/RAMDISK tshell: create ramdisk device:ramdisk0 successfully
W/TEST tshell: ramdisk init success.
I/VFS_FS tshell: Mount cute to /
W/TEST tshell: cutefs mount success.
sh />
sh />ls
Directory /:
sh />
sh />echo 111 test1.txt
sh />ls
Directory /:
test1.txt 3
sh />cat test1.txt
111
sh />ramdisk_deinit
W/TEST tshell: filesystem unmount, and ramdisk deinit.
sh />
sh />ls
No such directory
sh />
本示例演示了RAMDISK的动态初始化和销毁,并配合FATFS文件系统使用(实际使用FATFS时,每个BLOCK的大小可以是512、 1024、2048 或者4096 bytes,BLOCK的个数至少为192个),示例代码如下:
#include <oneos_config.h>
#include <os_dbg.h>
#include <shell.h>
#include <os_errno.h>
#include <ramdisk.h>
#include <vfs_posix.h>
#define TEST_FS_TAG "TEST_FS"
#define RAMDISK_NAME "ramdisk0"
#define RAMDISK_BLK_SIZE 512
#define RAMDISK_BLK_NUM 192
static ramdisk_dev_t *ram_dev = OS_NULL;
static void test_create_ramdisk(void)
{
ram_dev = ramdisk_dev_create(RAMDISK_NAME, RAMDISK_BLK_SIZE * RAMDISK_BLK_NUM, RAMDISK_BLK_SIZE);
if (!ram_dev)
{
LOG_E(TEST_FS_TAG, "create ramdisk failed.");
return;
}
LOG_W(TEST_FS_TAG, "create ramdisk successful.");
}
static void test_destroy_ramdisk(void)
{
if (ram_dev)
{
ramdisk_dev_destroy(ram_dev);
LOG_W(TEST_FS_TAG, "destroy ramdisk!");
}
}
static void test_mount_fatfs_on_ramdisk(void)
{
if (0 != vfs_mount(RAMDISK_NAME, "/", "fat", 0, 0))
{
LOG_E(TEST_FS_TAG, "mount fatfs failed.");
return;
}
LOG_W(TEST_FS_TAG, "mount fatfs successful.");
}
static void test_unmount_fatfs_on_ramdisk(void)
{
if (vfs_unmount("/") == 0)
{
LOG_W(TEST_FS_TAG, "fatfs File System unmount success!");
}
else
{
LOG_E(TEST_FS_TAG, "fatfs File System unmount failed!");
}
}
void test_fs(os_int32_t argc, char **argv)
{
if (argc == 1)
{
LOG_E(TEST_FS_TAG, "Usage: test_fs [cmd]");
}
else if (argc == 2)
{
if (strcmp(argv[1], "mount_fat_ram") == 0)
{
test_mount_fatfs_on_ramdisk();
}
if (strcmp(argv[1], "unmount_fat_ram") == 0)
{
test_unmount_fatfs_on_ramdisk();
}
if (strcmp(argv[1], "create_ramdisk") == 0)
{
test_create_ramdisk();
}
if (strcmp(argv[1], "destroy_ramdisk") == 0)
{
test_destroy_ramdisk();
}
}
}
SH_CMD_EXPORT(test_fs, test_fs, "test fs func");
运行结果如下:
sh />test_fs create_ramdisk
W/RAMDISK: create ramdisk device:ramdisk0 successfully
W/TEST_FS: create ramdisk successful.
sh />
sh />mkfs -t fat ramdisk0
sh />
sh />test_fs mount_fat_ram
I/VFS_FS: Mount fat to /
W/TEST_FS: mount fatfs successful.
sh />
sh />ls
Directory /:
sh />
sh />echo 111 test1.txt
sh />ls
Directory /:
test1.txt 3
sh />cat test1.txt
111
sh />test_fs unmount_fat_ram
W/TEST_FS: fatfs File System unmount success!
sh />
sh />test_fs destroy_ramdisk
W/TEST_FS: destroy ramdisk!