在讨论你的例子之前,有点免责声明:这是一个有点简化的现实版本,有很多极端案例和例外我都没有解释,但它应该足以让你明白发生了什么……
块设备
令你困惑的是不加区分地使用“块设备”术语.块设备通常是HDD,CD,SSD,……正如名称本身所说,您无法读取/写入这些设备的单个字节,您需要将它们写入块(通常为512字节大小).
块设备有一些寄存器和小的存储区映射到处理器地址空间,可用于读取设备状态,发送命令等.但是,它们(通常)不提供访问它们直接存储的数据的方法.这通常通过向设备发送命令并等待硬件中断信号来完成,即DMA操作(读取或写入)已完成.
因此,您可以看到,使用这些设备,不使用主存储器(DRAM)有点困难(如果不是不可能),因为它们的操作涉及DMA操作等. DAX在这些情况下所做的是删除访问数据所涉及的一些开销,但不多于此.
DIMM格式* NVM
然而,最近一些DIMM格式*非易失性存储器(NVM)已经被引入市场.这些设备将其全部内容映射到处理器地址空间,因此可由处理器通过存储和加载指令直接访问.内核甚至不需要知道正在访问这些设备:所有意图和目的都是好像进程正在访问常规的DRAM支持的内存页面.
* DIMM格式只是一个例子.还有一些其他现有的接口,如PCI正在做…
令人困惑的部分
这就引起了混乱……直到最近,“存储设备”实际上是“块设备”的同义词. Linux内核将这些新的NVM识别为存储设备/块设备,并通过在/ dev中创建条目来对待它们,就像使用SSD一样. (如果您没有这些NVM支持的设备之一,您可以通过指定常规DRAM的给定内存范围应被视为NVM.See here以获取有关如何执行该操作的更多信息来模拟该设备.)
如果您在这样的设备上创建文件系统,它将像使用常规HDD一样工作.它将尝试通过将内容缓存到DRAM来提高性能.启用DAX的文件系统所做的是避免创建缓存,缓存旨在加快访问速度,但在这些情况下,最有可能会降低性能.
Even if the kernel or its modules are stored on a file system that
supports DAX on a block device that supports DAX, they will still be
copied into RAM.
我无法找到这种行为的可靠原因,但是我认为这是出于安全性和性能原因而做的,以保证内核和内核模块不会从慢速(比DRAM慢)设备运行在内核执行期间,它们的内容不会被搞乱.
但是,只要保留在用户空间中,只使用NVM支持的内存直接从NVM运行可执行文件不应该出现任何问题.
看看英特尔的Pmem.io项目和惠普的Atlas项目.它们是专门为此类事物创建的编程接口.
现在关于你的例子:
# mount -t ramfs -o dax,size=8m ext2 /ramdisk
# mount
rootfs on / type rootfs (rw,size=59124k,nr_inodes=14781)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type tmpfs (rw,relatime)
ext2 on /ramdisk type ramfs (rw,relatime,dax,size=8m)
#
您没有创建RAM-Backed EXT2文件系统.您正在使用具有虚拟名称ext2的ramfs创建RAM支持的文件系统.如果您像这样安装它会没有区别:
# mount -t ramfs -o dax,size=8m winter_is_coming /ramdisk