问题描述
为了使用存储设备,我们需要一个文件系统,交换空间如何?
如果没有文件系统,操作系统如何使用它? (来自RAM的)数据如何写入磁盘,以及如何再次访问?
最佳方案
从技术上讲,交换没有特定的文件系统。文件系统的全部目的是以某种方式构造数据。特别是交换分区没有结构,但是它有一个特定的标头,它由mkswap
程序创建。特别是,这(取自kernel.org):
25 union swap_header {
26 struct
27 {
28 char reserved[PAGE_SIZE - 10];
29 char magic[10];
30 } magic;
31 struct
32 {
33 char bootbits[1024];
34 unsigned int version;
35 unsigned int last_page;
36 unsigned int nr_badpages;
37 unsigned int padding[125];
38 unsigned int badpages[1];
39 } info;
40 };
根据TLDP,每个分区都有与之关联的特定代码:
code for ext2 is 0x83 and linux swap is 0x82
当涉及交换文件时,情况稍有不同。内核必须尊重以下事实:文件系统可能具有自己的数据结构方式。从同一kernel.org链接:
Remember that filesystems may have their own method of storing files and disk and it is not as simple as the swap partition where information may be written directly to disk. If the backing storage is a partition, then only one page-sized block requires IO and as there is no filesystem involved, bmap() is unnecessary.
总之,从技术上讲,您可以将交换空间称为自己类型的文件系统,但它与NTFS或ext4之类的文件系统不具有可比性
你也问过
I want to know how it is possible to write in a storage space without file system
严格来说,不需要构造RAM。但是,在Unix-like OS下,RAM的某些部分可以构造为tmpfs。还有ramfs和initramfs,它们是在引导过程中加载的。但是从技术上讲,RAM数据应该是原始的1和0,因此无论如何都无需构造它们。
次佳方案
交换空间由内核用来在系统内存(RAM)变满时临时存储页面。内核使用它自己的内部表来将”remember”放置在交换磁盘中的确切位置。结果,交换磁盘不包含正确的文件系统,通常只是磁盘上的空白分区。
您可能感兴趣的是RAM-disk,它是存储在系统内存中的小型文件系统。如果需要更多内存,内核会将其(和其他内容)推送到交换空间。有关设置一个的说明,请参阅here。
第三种方案
交换空间被划分为与内存页面大小相同的块(通常为4kB),并且这些页面到应用程序内存的映射记录构成了CPU和OS中虚拟内存子系统的扩展。
也就是说,在应用程序内存空间和实际物理内存地址之间已经存在一个映射系统。为应用程序提供了一个很大的内存地址空间,他们可以使用它们尽可能多的内存。随着更多的此内存地址空间被实际使用,物理内存将映射到该应用程序以用作存储介质。
当内存交换到磁盘时,相关系统会维护该应用程序的内存空间到磁盘上块的映射。
映射表本身未存储在磁盘上,并且重新启动后磁盘上剩余的数据无用。