Differences between revisions 11 and 12
Revision 11 as of 2012-02-01 22:20:59
Size: 3043
Editor: ?bmomjian
Comment: remove duplicate word, "soon"
Revision 12 as of 2013-04-24 16:12:37
Size: 3255
Editor: ?mc.sim
Comment: add links to kernel.org
Deletions are marked like this. Additions are marked like this.
Line 23: Line 23:
 * http://www.mjmwired.net/kernel/Documentation/filesystems/ramfs-rootfs-initramfs.txt  * https://www.kernel.org/doc/Documentation/blockdev/ramdisk.txt
 * https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt
 * https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
 * [[http://www.k-max.name/linux/ramdisk-ramfs-tmpfs-in-linux/|Tmpfs in Russian]]

Ramfs is a very simple FileSystem that exports Linux's disk cacheing mechanisms (the page cache and dentry cache) as a dynamically resizable ram-based filesystem.

Normally all files are cached in memory by Linux. Pages of data read from backing store (usually the ?block_device the filesystem is mounted on) are kept around in case it's needed again, but marked as clean (freeable) in case the Virtual Memory system needs the memory for something else. Similarly, data written to files is marked clean as soon as it has been written to backing store, but kept around for cacheing purposes until the VM reallocates the memory. A similar mechanism (the dentry cache) greatly speeds up access to directories.

With ramfs, there is no backing store. Files written into ramfs allocate dentries and page cache as usual, but there's nowhere to write them to. This means the pages are never marked clean, so they can't be freed by the VM when it's looking to recycle memory.

The amount of code required to implement ramfs is tiny, because all the work is done by the existing Linux cacheing infrastructure. Basically, you're mounting the disk cache as a filesystem. Because of this, ramfs is not an optional component removable via menuconfig, since there would be negligible space savings.

The older "ram disk" mechanism created a synthetic block device out of an area of ram and used it as backing store for a filesystem. This block device was of a fixed size, so the filesystem mounted on it was a fixed size. Using a ram disk also required unnecessarily copying memory from the fake block device into the page cache (and copying changes back out), as well as creating and destroying dentries. Plus it needed a filesystem driver (such as ext2) to format and interpret this data. This wastes memory, creates unnecessary work for the CPU, wastes memory bus bandwidth, and pollutes the CPU caches. (There are tricks to avoid this copying by playing with the page tables, but they're unpleasantly complicated and turn out to be about as expensive as the copying anyway.)

More to the point, all the work ramfs is doing has to happen _anyway_, since all file access goes through the page and dentry caches. The ram disk is simply unnecessary, ramfs is internally much simpler.

One downside of ramfs is you can keep writing data into it until you fill up all memory, and the VM can't free it because the VM thinks that files +should get written to backing store (rather than swap space), but ramfs hasn't got any backing store. Because of this, only root (or a trusted user) should be allowed write access to a ramfs mount.

A ramfs derivative called tmpfs was created to add size limits, and the ability to write the data to swap space. Normal users can be allowed write access to tmpfs mounts. See documentation/filesystems/tmpfs.txt for more information.

See also :