(base) ➜ ~ df
文件系统 1K-块 已用 可用 已用% 挂载点
udev 8137076 0 8137076 0% /dev
tmpfs 1633052 2128 1630924 1% /run
/dev/sda10 199793984 56065704 133509632 30% /
tmpfs 8165248 352300 7812948 5% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 8165248 0 8165248 0% /sys/fs/cgroup
/dev/loop1 56320 56320 0 100% /snap/core18/1880
/dev/loop4 223232 223232 0 100% /snap/gnome-3-34-1804/60
/dev/loop0 56704 56704 0 100% /snap/core18/1885
/dev/loop2 166784 166784 0 100% /snap/gnome-3-28-1804/145
/dev/loop3 261760 261760 0 100% /snap/gnome-3-34-1804/36
/dev/loop6 44288 44288 0 100% /snap/snap-store/415
/dev/loop5 63616 63616 0 100% /snap/gtk-common-themes/1506
/dev/loop7 51968 51968 0 100% /snap/snap-store/481
/dev/loop8 31104 31104 0 100% /snap/snapd/9279
/dev/loop9 31744 31744 0 100% /snap/snapd/9607
/dev/nvme0n1p1 103186 52312 50874 51% /boot/efi
tmpfs 1633048 80 1632968 1% /run/user/1000
udev (user dev)
udev 是一个工作在用户空间的工具,它能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建,删除,权限等。这些文件通常都定义在/dev 目录下,但也可以在配置文件中指定。udev 必须内核中的sysfs和tmpfs支持,sysfs 为udev 提供设备入口和uevent 通道,tmpfs 为udev 设备文件提供存放空间。
注意,udev 是通过对内核产生的设备文件修改,或增加别名的方式来达到自定义设备文件的目的。但是,udev 是用户模式程序,其不会更改内核行为。也就是说,内核仍然会创建sda,sdb等设备文件,而udev可根据设备的唯一信息来区分不同的设备,并产生新的设备文件(或链接)。而在用户的应用中,只要使用新产生的设备文件即可。
tmpfs(temporary file storage)
tmpfs,临时文件系统,是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似像,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储,而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。
ramdisk : 相当于一个磁盘,需要先格式化再使用(可以格式化成各种文件系统),如果umount再加载,只要不重启,则数据依然会存在。
ramfs:位于虚拟文件系统(VFS)层, 无需格式化, 只使用物理内存.
tmpfs:也是位于虚拟文件系统层, 使用的是Linux系统内存, 不管是物理内存还是swap,只负责向系统申请。
虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
ext:全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过为了快速恢复文件系统,减少一致性检查的时间,增加了日志功能,所以Ext2被称为索引式文件系统,而Ext3/Ext4被称为日志式文件系统。
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
实现原理:基于VM子系统
内存管理子系统职能:
- 管理虚拟地址和物理地址的映射;
- 管理物理内存的分配
用户空间(0~3G)
空间简介
其从0x0000 0000
到0xBFFF FFFF
共3GB的线性地址空间,每个进程都有一个独立的3GB用户空间,当然这是虚拟的空间。
常见十六进制对应内存单位大小:
0x400 | 1K |
0x1000 | 4K |
0x1 0000 | 64K |
0x10 0000 | 1M |
0x100 0000 | 16M |
0x1000 0000 | 256M |
0x4000 0000 | 1G |
内核空间(3~4G)
其从0xC0000000到0xFFFFFFFF共1GB大小,内核空间又可以根据映射方式的不同分为下面四块
- 内核逻辑地址空间
空间简介
其从0xC0000000到high_memory(图中896MB的地方)最大为896MB(也就是说这块空间有可能不满,但最大为896MB),当然是虚拟空间。
注:在此注意一下896MB我们一会在分析。
如何转换为物理空间
这一部分虚拟地址与物理内存中对应的地址只差一个固定偏移量(3G),如果内存物理地址空间从0x00000000地址编址,那么这个固定偏移量就是PAGE_OFFSET(如上图)。 - Vmalloc空间
空间简介
其地址没有严格的界限,这段空间既可以访问到我们的高端内存,也可以访问到低端内存。(高端和低端一会解释) - 永久内核映射
空间简介:其固定用来访问高端内存。 - 固定映射
空间简介:其在系统初始化期间永久映射I/O地址空间,或者特殊的寄存器。
-
遗留知识
在刚才我们前面的分析中我们留下了一些问题下面进行解释。
a) 低端内存
内核逻辑地址空间所映射的物理内存就是低端内存(实际物理内存的大小,但是小于896MB)
b) 高端内存
低端内存地址之上的物理内存是高端内存(物理内存896MB之上)。
c) 896MB来由
Linux将内存分为内核空间和用户空间,其中内核空间中的0xC0000000-high_memory部分用来映射物理内存,但是我们还需要映射I/O空间和固定的寄存器,所以留出了high_memory-0xFFFFFFFF之间的地址来映射I/O空间和固定的寄存器,而在X86平台根据经验设定了这个high_memory为896MB。
- /run
/run 目录是说, 里面的东西是系统运行时需要的, 不能随便删除. 但是重启的时候应该抛弃. 下次系统运行时重新生成.
在我的电脑上, /run是个tmpfs, /var/run是个指向/run的链接, 换句话说他俩是同一个东西.
dev/loop
/dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
这种设备文件经常被用于光盘或是磁盘镜像(IOS、IMG)。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。