Linux/C++ 中的 NVM 存储模拟器

NVM Storage Simulator in Linux/C++

我目前正在将一个项目移植到 Linux 上的 运行,该项目将一些数据存储在 NVM 外部存储器中。在我的硬件上,我只有 Linux rootfs 所在的 eMMC 主存储可供我使用。我想做的是在 Linux 中模拟以前的 NVM 外部存储,以便我的应用程序可以在那里存储一些数据。

我想到的第一个明显的解决方案是将此数据存储在 eMMC 中未被 linux 使用的不同内存区域,但目前我无法控制分区的当前布局eMMC.

我想到的另一个想法是将此数据存储在 fs 上的文件中,但这将引入大量打开和关闭 fd 以写入和获取数据,除了文件很容易损坏之外。

旁注:我尝试移植的应用程序是用 C++ 编写的。

在这里问这个问题,我想知道的不是如何具体实现,而是找出不同的解决方案和思路来解决这个问题。

关于申请和要求的更多信息:

谢谢。

结束了 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);