Linux/C++ 中的 NVM 存储模拟器
NVM Storage Simulator in Linux/C++
我目前正在将一个项目移植到 Linux 上的 运行,该项目将一些数据存储在 NVM 外部存储器中。在我的硬件上,我只有 Linux rootfs 所在的 eMMC 主存储可供我使用。我想做的是在 Linux 中模拟以前的 NVM 外部存储,以便我的应用程序可以在那里存储一些数据。
我想到的第一个明显的解决方案是将此数据存储在 eMMC 中未被 linux 使用的不同内存区域,但目前我无法控制分区的当前布局eMMC.
我想到的另一个想法是将此数据存储在 fs 上的文件中,但这将引入大量打开和关闭 fd 以写入和获取数据,除了文件很容易损坏之外。
旁注:我尝试移植的应用程序是用 C++ 编写的。
在这里问这个问题,我想知道的不是如何具体实现,而是找出不同的解决方案和思路来解决这个问题。
关于申请和要求的更多信息:
- 需要存储的数据可能小于 5 mb
- 数据需要尽可能快地写入,我不确定需要写入多少数据,但我猜此时为 20kb/s
- 与旧的实现相关,我无法再访问它,我只有一个简单的界面可以使用,所以我不能说旧的 NVM 使用的功能。首先,我想要一些简单的东西,没有任何花里胡哨的东西
- 我所拥有的是我想要存储的每个数据条目的映射,以及从基地址到适当的内存偏移量。
谢谢。
结束了 opening/creating 文件系统上的一个文件
memFileFd = open(memFilePath.c_str(), O_RDWR | O_CREAT, (mode_t)0600);
正在将文件扩展到所需大小
// go to the end of the desired size
lseek(memFileFd, memSize, SEEK_SET);
// write termination character to expand it
write(memFileFd, "", 1);
映射为文件分配的内存
memBlock = (uint8_t *)mmap(0, memSize, PROT_READ | PROT_WRITE, MAP_SHARED, memFileFd, 0);
// we can safely close the FD now after the mem was mapped
close(memFileFd);
然后我们就可以对这块内存进行读写,把它当作一个虚拟的NVM
// write data
memcpy(memBlock + address, bufferToBeWritten, bufferLength);
// we want to flush the cached pages touched by us so we
// calculate the start address of the cache page written and the
// size of the touched memory as a multiple of page size
int pagesize = getpagesize();
uint32_t syncStartPageOffset = (address / (uint32_t)pagesize) * pagesize;
uint32_t syncSize = ((bufferLength / (uint32_t)pagesize) + 1) * pagesize;
// sync mem
msync(m_memBlock + syncStartPageOffset, syncSize, MS_SYNC);
// read data
memcpy(bufferToBeReadIn, memBlock + address, bufferLength);
我目前正在将一个项目移植到 Linux 上的 运行,该项目将一些数据存储在 NVM 外部存储器中。在我的硬件上,我只有 Linux rootfs 所在的 eMMC 主存储可供我使用。我想做的是在 Linux 中模拟以前的 NVM 外部存储,以便我的应用程序可以在那里存储一些数据。
我想到的第一个明显的解决方案是将此数据存储在 eMMC 中未被 linux 使用的不同内存区域,但目前我无法控制分区的当前布局eMMC.
我想到的另一个想法是将此数据存储在 fs 上的文件中,但这将引入大量打开和关闭 fd 以写入和获取数据,除了文件很容易损坏之外。
旁注:我尝试移植的应用程序是用 C++ 编写的。
在这里问这个问题,我想知道的不是如何具体实现,而是找出不同的解决方案和思路来解决这个问题。
关于申请和要求的更多信息:
- 需要存储的数据可能小于 5 mb
- 数据需要尽可能快地写入,我不确定需要写入多少数据,但我猜此时为 20kb/s
- 与旧的实现相关,我无法再访问它,我只有一个简单的界面可以使用,所以我不能说旧的 NVM 使用的功能。首先,我想要一些简单的东西,没有任何花里胡哨的东西
- 我所拥有的是我想要存储的每个数据条目的映射,以及从基地址到适当的内存偏移量。
谢谢。
结束了 opening/creating 文件系统上的一个文件
memFileFd = open(memFilePath.c_str(), O_RDWR | O_CREAT, (mode_t)0600);
正在将文件扩展到所需大小
// go to the end of the desired size
lseek(memFileFd, memSize, SEEK_SET);
// write termination character to expand it
write(memFileFd, "", 1);
映射为文件分配的内存
memBlock = (uint8_t *)mmap(0, memSize, PROT_READ | PROT_WRITE, MAP_SHARED, memFileFd, 0);
// we can safely close the FD now after the mem was mapped
close(memFileFd);
然后我们就可以对这块内存进行读写,把它当作一个虚拟的NVM
// write data
memcpy(memBlock + address, bufferToBeWritten, bufferLength);
// we want to flush the cached pages touched by us so we
// calculate the start address of the cache page written and the
// size of the touched memory as a multiple of page size
int pagesize = getpagesize();
uint32_t syncStartPageOffset = (address / (uint32_t)pagesize) * pagesize;
uint32_t syncSize = ((bufferLength / (uint32_t)pagesize) + 1) * pagesize;
// sync mem
msync(m_memBlock + syncStartPageOffset, syncSize, MS_SYNC);
// read data
memcpy(bufferToBeReadIn, memBlock + address, bufferLength);