File 在程序集中存储读/写数据,类似于文件系统

File 在程序集中存储读/写数据,类似于文件系统,file,assembly,operating-system,persistence,non-volatile,File,Assembly,Operating System,Persistence,Non Volatile,我正在创建一个自定义操作系统,是否有任何方法将数据(几乎像文件系统)存储在汇编中,以便在计算机关闭并重新打开时,数据仍然存在?您可以为SATA硬盘驱动器、USB大容量存储、软盘、NVMe闪存或asm中的任何其他内容编写设备驱动程序。您还可以使用BIOS函数访问它们(尤其是在x86上)。但是,您必须以512B或4096B的块来管理写操作,因为这些类型的存储是基于块的 这个问题的一个更字面的解释有一个有趣的答案:像mov[mem],eax这样的存储指令是否可以将数据放入持久存储中,而加载指令可以稍

我正在创建一个自定义操作系统,是否有任何方法将数据(几乎像文件系统)存储在汇编中,以便在计算机关闭并重新打开时,数据仍然存在?

您可以为SATA硬盘驱动器、USB大容量存储、软盘、NVMe闪存或asm中的任何其他内容编写设备驱动程序。您还可以使用BIOS函数访问它们(尤其是在x86上)。但是,您必须以512B或4096B的块来管理写操作,因为这些类型的存储是基于块的


这个问题的一个更字面的解释有一个有趣的答案:像
mov[mem],eax
这样的存储指令是否可以将数据放入持久存储中,而加载指令可以稍后(在一个电源循环后)获取数据

是,如果您的硬件有一些内存映射的非易失性RAM。(物理内存映射的NVRAM类似于,而不像
mmap()
将文件逻辑映射到进程的虚拟内存地址空间)。看到这个了吗

例如,x86最近得到了更多支持NVRAM的指令,比如写回缓存线(一直写到内存),而不必逐出缓存线。
clwb
的早期实现可能只是像
clflushopt
一样运行它,但是:

另外,
clflushopt
是一种更有效的方法,可以强制将更多缓存线写入内存。在执行弱顺序刷新(如
clflushopt
后,使用内存屏障(如
sfence
),以确保在出现进一步写入之前,数据位于非易失性RAM中

有一段时间,英特尔将需要
pcommit
作为确保数据访问非易失性存储器的一部分。考虑到这一点,请参阅以了解有关使用持久RAM的更多详细信息


IDK了解x86以外的体系结构上的情况,但NV RAM可能也可用于ARM和其他CPU。

谢谢!这真的很有帮助您当然也可以将它们写入任何存储设备(如文件系统),但如果它是您的实际硬件,请确保您写入的设备不关心内容,或者您确实使用了它的文件系统并写入了有效的文件(对于现代文件系统来说可能非常复杂,对于像FS这样的旧FAT来说足够简单)。最好不要首先使用实际的硬件,而是在一些VM/模拟器中运行。但NVRAM几乎是“即时”的(而存储设备可能需要几毫秒的闪存驱动器,或“万年”的机械驱动器),您可以按任何方式构造数据(只要适合大小)。