据我所知,initrd充当块设备,因此需要文件系统驱动程序(例如ext2)。内核必须至少具有一个内置模块来检测initrd的文件系统。在本文Introducing initramfs, a new model for initial RAM disks中,它写为:



什么是page cachedentry cache?在本段中,这是否意味着数据被重复,因为ramdisk被视为块设备,因此所有数据都被缓存了?

相反,ramfs:



总之,ramfs只是文件打开并加载到内存中,不是吗?
initrdramfs都在编译时压缩,但是不同之处在于,initrd是一个块设备,要在启动时由内核挂载,而ramfs是通过cpio拆包到内存中的。我对么?还是ramfs是一个非常小的文件系统?

最终,直到今天,initrd图像仍显示在最新内核中。但是,那个initrd实际上是今天使用的ramfs,并且该名称只是出于历史目的吗?

最佳答案

Dentry(和inode)缓存
Linux中的文件系统子系统具有三层。 VFS(虚拟文件系统),该文件系统实现了系统调用接口(interface),并处理交叉安装点,默认权限和限制检查。它的下面是单个文件系统的驱动程序,而这些文件系统又与块设备(磁盘,存储卡等;网络接口(interface)除外)的驱动程序接口(interface)。
VFS和文件系统之间的接口(interface)有几个类(纯C语言,因此结构包含指向函数的指针等,但从概念上讲,它是面向对象的接口(interface))。主要的三类是inode(描述文件系统中的任何对象(文件或目录)),dentry(描述目录中的条目)和file(描述进程打开的文件)。挂载后,文件系统驱动程序为其根目录创建inodedentry,而其他文件则在进程要访问文件并最终到期时按需创建。那是一个dentry和inode缓存。
是的,这确实意味着,对于每个打开的文件和任何根目录,必须在代表它的内核内存中分配inodedentry结构。
页面缓存
在Linux中,每个包含用户态数据的内存页面都由统一的page结构表示。这可能会将页面标记为匿名(如果可用,可能会交换到交换空间)或将其与某个文件系统上的inode关联(可能会写回到文件系统并从文件系统中重新读取),并且该页面可以是任意数量的内存的一部分映射,即在某些进程的地址空间中可见。当前加载到内存中的所有页面的总和就是页面缓存。
这些页面用于实现mmap接口(interface),而常规的读写系统调用可以由文件系统通过其他方式实现,但是大多数接口(interface)使用的通用函数也使用页面。有一些通用功能,当请求读取文件时,分配页面并调用文件系统来逐一填充页面。对于基于块设备的文件系统,它仅计算适当的地址并将此填充委托(delegate)给块设备驱动程序。
ramdev(虚拟磁盘)
Ramdev是常规块设备。这允许在其上对任何文件系统进行分层,但是受到块设备接口(interface)的限制。这只是填充调用者分配的页面并将其写回的方法。这正是磁盘,存储卡,USB大容量存储等实际块设备所需要的,但是对于ramdisk而言,这意味着数据在内存中存在两次,一次在ramdev的内存中,一次在该内存分配的内存中。 call 者。
这是实现initrd的旧方法。从initrd罕见而异国情调的时代开始。
tmpfs
Tmpfs是不同的。这是一个虚拟文件系统。它提供给VFS的方法是使其工作的绝对最低限度(因此,它是inode,dentry和file方法应该做什么的极好的文档)。只有在inode高速缓存中有相应的inode和dentry时文件才存在,它们是在创建文件时创建的,除非删除该文件,否则永不过期。页面在写入数据时与文件相关联,否则表现为匿名页面(数据可以存储以进行交换,只要文件存在,page结构就保持使用状态)。
这意味着内存中没有多余的数据副本,整个过程要简单得多,而且速度也要快一些。它只是使用数据结构作为主存储,而该数据结构可用作任何其他文件系统的缓存。
这是实现initrd(initramfs,但是图像仍称为initrd)的新方法。
这也是实现“posix共享内存”的方式(这只是意味着将tmpfs安装在/dev/shm上,应用程序可以在其中自由创建文件并进行映射;简单而有效),最近甚至/tmp/run(或/var/run)也经常使用tmpfs特别是安装在笔记本电脑上,以防止磁盘旋转或在使用SSD时避免磨损。

10-07 17:58