Linux:如何为RAMFS / TMPFS启用就地执行(XIP)

时间:2016-05-19 08:12:41

标签: linux linux-kernel embedded-linux

我正在使用rootfs进程在tmpfs分区中构建init的嵌入式系统。 rootfs完成后,它将执行pivot-root并开始生成位于rootfs的进程。

但似乎XIP对我们的tmpfs不起作用,因此所有应用程序都加载到ram中两次(在tmpfs中并在加载时再次加载到ram中。)< / p>

这真的可以吗?

我在https://ez.analog.com/thread/45262找到了一个旧的讨论主题,它描述了我所看到的相同问题。

如何为位于内存中的文件系统实现XIP?

1 个答案:

答案 0 :(得分:0)

你想要做的事情应该是可能的(尽管我自己没有尝试过)。问题是你没有以正确的方式去做。如果使用Block RAM设备(“brd”),则可以创建一个块设备,实际上RAM作为块设备提供。要在你的内核上启用它(抱歉你没有说你有哪个内核所以我将使用内核4.14),你需要在内核配置中启用CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_RAM_DAX。它们都在“设备驱动程序”下 - &gt; “块设备”。然后创建这样一个RAM支持的块设备,然后在其上创建一个ext2或ext4或XFS文件系统,然后将rootfs准备到该文件系统中,然后将其根目录转换为它。现在,您正在一个RAM支持的文件系统中执行,该系统具有XIP(现在由DAX取代)功能,因此执行应用程序现在至少在理论上应该可以正常工作而无需创建数据副本并只是将其从块的RAM页面中运行RAM设备。

请注意这种方法有限制,例如内核模块本身仍然会被复制到RAM中,get_user_pages()可能不起作用,O_DIRECT可能无效,RDMA,sendfile()和splice()也不行

要了解的一些相关内容包括:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/block/Kconfig?h=v3.19#n359

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/block/Kconfig?h=v3.19#n396

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/blockdev/ramdisk.txt?h=v3.19

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/xip.txt?h=v3.19

注意XIP自4.0内核以来被DAX取代,因此可以看到:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/dax.txt?h=4.14

另请注意,使用内核4.15从块RAM驱动程序中删除了对DAX的支持,因此一旦转移到内核4.15及更高版本,您将无法再执行此操作...请参阅提交7a862fbbdec665190c5ef298c0c6ec9f3915cf45以了解背后的原因删除功能。

我希望这足以让你走上正轨,对于自4.15内核以来已删除功能的坏消息感到抱歉......