问题

linux创建的硬链接为什么不占用磁盘空间?

回答
咱们聊聊 Linux 创建硬链接为啥不占地方的事儿。这事儿说起来,得从文件的本质说起。

你想啊,在电脑里,文件这玩意儿,最核心的其实是它存储在硬盘上的那堆实际数据。你可以把这堆数据想象成一本内容丰富的小说。

而我们平时看到的文件名,以及它在哪个文件夹里,这更像是这本小说的“书签”或者“目录条目”。它们告诉你,在哪儿能找到这本小说,或者说,这本小说应该叫什么名字。

Linux 系统里,有一个叫做 inode 的东西,它扮演的就是那个“书签”的角色。每个文件,无论它有多大,都对应着一个唯一的 inode。这个 inode 里头,就记录了关于这个文件的所有“身份信息”,比如:

文件的权限(谁能读,谁能写,谁能执行)
文件的所有者和所属组
文件的大小
文件被创建的时间、最后修改时间、最后访问时间
最关键的:指向文件实际数据块的指针。 也就是告诉系统,这本小说的数据到底存放在硬盘上的哪个位置。

你看到的那个文件名,其实只是一个指向 inode 的“名字”。一个文件的数据,可以有一个或多个文件名指向它,而这每一个文件名,就叫做一个“硬链接”。

所以,当你创建一个硬链接的时候,你并不是在复制文件本身的数据。你只是给同一个 inode(也就是那本小说)新增了一个“书签”,让它有了另一个名字,或者在另一个目录里出现了。

举个例子,假设你有一个文件叫 `my_document.txt`,它在 `/home/user/docs/` 目录下。系统为它创建了一个 inode,假设这个 inode 编号是 12345。这个 inode 12345 里头,就记录了 `my_document.txt` 的所有信息,包括它在硬盘上实际存储数据的地址。

现在,你执行命令 `ln /home/user/docs/my_document.txt /home/user/backup/my_doc_backup.txt` 来创建一个硬链接。

这个操作做了什么呢?

1. 系统在 `/home/user/backup/` 目录下,创建了一个新的目录项,这个目录项的名字叫做 `my_doc_backup.txt`。
2. 这个新的目录项,指向了和 `my_document.txt` 完全一样的 inode,也就是 inode 12345。
3. inode 12345 的一个计数器(叫做“链接计数”或“hard link count”)会加一。原来可能只写着“1”,现在就变成“2”了。

你想想,你只是在创建一个新的“书签”,让这本小说多了一个名字,但小说的内容(实际数据)还是那一本。硬盘上存储的那堆小说数据,并没有因为你多打了一个书签而重复存放。它们还是在同一个物理位置上。

所以,硬链接不占用额外的磁盘空间,是因为:

共享数据: 所有的硬链接都指向同一个 inode,而 inode 包含了指向实际数据块的指针。数据本身只存储一份。
不复制: 创建硬链接不是复制文件数据,只是创建了一个新的文件条目(目录项),这个文件条目和原文件指向同一个 inode。

什么时候数据会被真正删除?

只有当所有指向同一个 inode 的文件名(所有硬链接)都被删除后,这个 inode 的链接计数才会变成零。当链接计数为零时,系统才会认为这个 inode 和它所指向的数据块已经不再被使用,然后才会把硬盘上存储的实际数据擦掉,释放磁盘空间。

就好比,你有多本一样的书,但每一本书的内容都一样。你把其中一本的名字改了,或者放在另一个书架上,这都不会增加你书房里书籍的总量。只有当你把所有指向同一本书的“名字”都丢弃了,那本书才算真正从你的书架上消失。

因此,硬链接是一种非常高效的文件管理方式,它允许一个文件在文件系统的不同位置拥有多个名称,而无需重复存储文件内容,极大地节省了磁盘空间。

网友意见

user avatar

首先需要纠正问题本身,创建硬链接是占用存储空间的,软链接(或者常说符号链接)更是占用存储空间的。所以“linux创建的硬链接既然和软连接一样不占用磁盘空间”这句话本身就是错误。当然,它们的存储方式确实和普通的文件不一样,两者本身也完全不一样。

我在专栏中的下面这篇文章里介绍了XFS文件系统存储软链接的方式:

如果想详细了解XFS存储结构的可以进一步阅读相关的系列文章,XFS属于通用文件系统,理解它可以理解很多文件系统。我们下面单独以XFS文件系统为例,对软链接和硬链接的存储方式进行说明,大家可自行扩展理解到其它文件系统。下面我们先来看软链接:

软链接(符号链接):

符号链接,又俗称软链接,它实际上是一个真实的数据文件,存储它的时需要存储它的目录项(文件名)以及内容。如果你连目录项是什么都不知道,最好先看看书。目录项简单说就是目录(类型的文件)的数据内容,也可以看一下下面这个回答了解一下目录项的主要作用:

比如我下面这个软链接文件:

       # ln -s nothisfile symlink1 # ls -li total 0 131 lrwxrwxrwx. 1 root root 10 Jun  1 21:50 symlink1 -> nothisfile     

即使是通过ls命令,也可以看到这个符号链接的size是10字节,也就是"nothisfile"的10个字节。我们称这10个字节是它的数据大小,也就是它存储了10个字节的数据,实际上它还有很多元数据也占用了存储空间:

首先是存储这个符号链接文件的目录项,目录结构需要分配空间存储目录项,关于XFS的目录存储数据的结构,想详细了解的可以参考下面的文章:

醉卧沙场:XFS的on-disk组织结构(8)——Inode datafork of Directory - short/block

醉卧沙场:XFS的on-disk组织结构(9)——Inode datafork of Directory - leaf/node

醉卧沙场:XFS的on-disk组织结构(10)——Inode datafork of Directory - B+tree

我们这里只看一下当前这个简单的叫symlink1的目录项,我把它创建在了一个文件系统的根目录下,所以我们到这个文件系统的根目录去看一下:

       # xfs_db /dev/mapper/testvg-testdev xfs_db> sb 0 xfs_db> p rootino rootino = 128     

首先我们从这个文件系统的superblock里知道它的根目录,也就是root inode是128,那么我们去inode号为128的这个目录下去找symlink1:

       xfs_db> inode 128 xfs_db> p core.magic = 0x494e core.mode = 040755 core.version = 3 core.format = 1 (local) ... u3.sfdir3.hdr.count = 1 u3.sfdir3.hdr.i8count = 0 u3.sfdir3.hdr.parent.i4 = 128 u3.sfdir3.list[0].namelen = 8 u3.sfdir3.list[0].offset = 0x60 u3.sfdir3.list[0].name = "symlink1" u3.sfdir3.list[0].inumber.i4 = 131 u3.sfdir3.list[0].filetype = 7     

我们可以看到这个目录里存储着symlink1这个目录项,以及和这个目录项相关的元数据结构,比如我们知道symlink1符号链接文件对应的inode号是131。

这些数据都是真实存在在存储空间上的,不是“虚构”的,如果逐个字节的直接读取存储器(如磁盘)上的二进制数据,是可以找到这一片存储空间的,比如:

       00010000: 49 4e 41 ed 03 01 00 00 00 00 00 00 00 00 00 00  INA............. 00010010: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010020: 60 b6 3b 43 0e 22 02 0a 60 b6 3b 3b 0a 07 b5 ea  `.;C."..`.;;.... 00010030: 60 b6 3b 3b 0a 07 b5 ea 00 00 00 00 00 00 00 16  `.;;............ 00010040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010050: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010060: ff ff ff ff 02 cf cb ae 00 00 00 00 00 00 00 12  ................ 00010070: 00 00 00 01 00 00 00 b7 00 00 00 00 00 00 00 00  ................ 00010080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010090: 60 8b ad cf 19 2d 44 48 00 00 00 00 00 00 00 80  `....-DH........ 000100a0: 7a af 6b 93 ad 7b 4d 94 91 ca 38 ba f6 74 8a d4  z.k..{M...8..t.. 000100b0: 01 00 00 00 00 80 08 00 60 73 79 6d 6c 69 6e 6b  ........`symlink 000100c0: 31 07 00 00 00 83 66 69 6c 65 32 01 00 00 00 84  1.....file2..... 000100d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................     

这就是上面那个目录的inode里的内容(一部分),如果你逐个字节对照是可以逐一对应上的(参考上面的文章)。就算你别的看不懂,"symlink1"这几个字符对应的"73 79 6d 6c 69 6e 6b 31"十六进制数你总该能看得懂的。所以说符号链接的目录项(文件名)相关数据是需要占用空间的。而且越复杂的目录结构可能需要不同的存储格式,不是简单的一个文件名就行了,还有很多元数据信息甚至在导致目录结构变化时(如发生split btree)会需要更多的空间。

从上面symlink1的目录项结构中我们看到了symlink1这个软链接文件的inode号是131,所以我们去这个inode上去看一下:

       xfs_db> inode 131 xfs_db> p core.magic = 0x494e core.mode = 0120777 core.version = 3 core.format = 1 (local) ... u3.symlink = "nothisfile" a.sfattr.hdr.totsize = 51 a.sfattr.hdr.count = 1 a.sfattr.list[0].namelen = 7 a.sfattr.list[0].valuelen = 37 a.sfattr.list[0].root = 0 a.sfattr.list[0].secure = 1 a.sfattr.list[0].name = "selinux" a.sfattr.list[0].value = "unconfined_u:object_r:unlabeled_t:s000"     

我们可以看到sysmlink1的inode结构里存储着它所指向的那个路径的路经名"nothisfile"。虽然我并没有实际创建这个路径,但是这不妨碍符号链接文件存储这个路径名,因为符号链接文件和它所指向的文件是两个不同的文件。这些也都是真实占用存储空间的,我们可以从存储器里看到这些数据,如下(列了一部分):

       00010600: 49 4e a1 ff 03 01 00 00 00 00 00 00 00 00 00 00  IN.............. 00010610: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010620: 60 b6 3b 43 0e 22 02 0a 60 b6 3b 3b 0a 07 b5 ea  `.;C."..`.;;.... 00010630: 60 b6 3b 3b 0a 07 b5 ea 00 00 00 00 00 00 00 0a  `.;;............ 00010640: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010650: 00 00 23 01 00 00 00 00 00 00 00 00 31 1f d7 7a  ..#.........1..z 00010660: ff ff ff ff 44 31 12 2b 00 00 00 00 00 00 00 04  ....D1.+........ 00010670: 00 00 00 01 00 00 00 b7 00 00 00 00 00 00 00 00  ................ 00010680: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010690: 60 b6 3b 3b 0a 07 b5 ea 00 00 00 00 00 00 00 83  `.;;............ 000106a0: 7a af 6b 93 ad 7b 4d 94 91 ca 38 ba f6 74 8a d4  z.k..{M...8..t.. 000106b0: 6e 6f 74 68 69 73 66 69 6c 65 00 00 03 00 01 00  nothisfile...... 000106c0: 00 00 00 00 00 04 00 00 00 00 00 00 53 00 00 80  ............S... 000106d0: 00 00 00 00 00 05 00 00 00 00 00 00 53 00 01 70  ............S..p 000106e0: 00 00 00 00 00 08 00 00 00 00 00 00 23 00 00 80  ............#... 000106f0: 00 00 00 00 00 09 00 00 00 00 00 00 53 00 00 80  ............S... 00010700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ...............     

凑巧的是,我当前的系统还打开了selinux,我创建的文件被自动加了selinux的扩展属性信息,这些也是要占用存储空间的。这里我让symlink1指向了一个很短的路径,如果指向一个很长的路径,那么就需要更多的存储空间,inode结构的空间可能都不够,需要再另外分配block来存储。详细的还是参考上面的文章,我这里就不展开了。

所以到这里我们知道,一个软链接(符号链接)文件的创建会占用很多空间,有为其目录项分配的空间(也可能预分配好了,但是不管怎么说它要被占用),有其inode结构占用的空间,还可能有其扩展属性和额外的存储数据的空间等。如果你阅读了关于文件系统全局元数据的知识,如:

醉卧沙场:XFS的on-disk组织结构(3)——AGF&AGFL

醉卧沙场:XFS的on-disk组织结构(4)——BNO/CNT B+tree of AGF

醉卧沙场:XFS的on-disk组织结构(5)——AGI & (F)INO B+Tree

那么你就还可以想像到创建一个符号链接的操作很可能还要伴随着管理free space,管理inode和free inode,甚至管理reflink和rmapbt的数据的变化,这些全局管理结构的变化也是可能需要更多的存储空间的

文件系统在进行解析路径的时候,默认在碰到符号链接的时候是要follow这个符号链接的,简单来说就是读取符号链接的内容,按照符号链接所记录的路经名走下去。所以如果你删除软链接所指向的文件,软链接文件本身还在,但是其存储的内容(路径名)就是变成了一个无效的路径,按照那个路径去走就找不到要找的目标了,自然访问不到文件。

硬链接:

硬链接就比较简单了,可能大家耳熟能详的说法就是硬链接和其指向的文件的inode号相同。是的,那么它是怎么做到的呢?如果你想详细了解inode是怎么回事,可以参考这几篇文章:

醉卧沙场:XFS的on-disk组织结构(6)——Inode Core

醉卧沙场:XFS的on-disk组织结构(7)——Inode Datafork of regular file

这里我们就简单说一下,比如我创建下面的硬链接:

       # touch file # ln file hardlink1 # ls -li  total 0 132 -rw-r--r--. 2 root root  0 Jun  1 22:33 file 132 -rw-r--r--. 2 root root  0 Jun  1 22:33 hardlink1 131 lrwxrwxrwx. 1 root root 10 Jun  1 21:50 symlink1 -> nothisfile     

我们看到file和hardlink1这两个文件确实是相同的inode号,而且硬链接的类型不像软链接那样是"l"(表示符号链接),而是和file一样都是"-"(表示普通文件)。如果你阅读了上面的文章,你会知道,inode号如果相同,说明这两个文件本身就是同一个,它们指向同一片物理地址。但是不同的是,它们是两个不同的目录项。也就是说它们所在的目录用两块不同的目录项来存储这两个文件名及其相关结构,如下:

       xfs_db> inode 128 xfs_db> p core.magic = 0x494e core.mode = 040755 core.version = 3 core.format = 1 (local) ... u3.sfdir3.hdr.count = 3 u3.sfdir3.hdr.i8count = 0 u3.sfdir3.hdr.parent.i4 = 128 u3.sfdir3.list[0].namelen = 8 u3.sfdir3.list[0].offset = 0x60 u3.sfdir3.list[0].name = "symlink1" u3.sfdir3.list[0].inumber.i4 = 131 u3.sfdir3.list[0].filetype = 7 u3.sfdir3.list[1].namelen = 4 u3.sfdir3.list[1].offset = 0x78 u3.sfdir3.list[1].name = "file" u3.sfdir3.list[1].inumber.i4 = 132 u3.sfdir3.list[1].filetype = 1 u3.sfdir3.list[2].namelen = 9 u3.sfdir3.list[2].offset = 0x88 u3.sfdir3.list[2].name = "hardlink1" u3.sfdir3.list[2].inumber.i4 = 132 u3.sfdir3.list[2].filetype = 1     

可以看到,像上面我们存储symlink1目录项一样,文件系统分别存储了file和hardlink1,它们分处在两片存储区域,但是它们指向的inumber都是132(看上面输出,别光看我:-)。这就是两个目录项指向同一个inode。同样,我们可以在存储器里直接看到它们的内容:

       00010000: 49 4e 41 ed 03 01 00 00 00 00 00 00 00 00 00 00  INA............. 00010010: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010020: 60 b6 45 68 01 32 b8 56 60 b6 45 5e 13 b0 05 b7  `.Eh.2.V`.E^.... 00010030: 60 b6 45 5e 13 b0 05 b7 00 00 00 00 00 00 00 33  `.E^...........3 00010040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010050: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010060: ff ff ff ff b2 78 76 9a 00 00 00 00 00 00 00 14  .....xv......... 00010070: 00 00 00 01 00 00 00 c7 00 00 00 00 00 00 00 00  ................ 00010080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 00010090: 60 8b ad cf 19 2d 44 48 00 00 00 00 00 00 00 80  `....-DH........ 000100a0: 7a af 6b 93 ad 7b 4d 94 91 ca 38 ba f6 74 8a d4  z.k..{M...8..t.. 000100b0: 03 00 00 00 00 80 08 00 60 73 79 6d 6c 69 6e 6b  ........`symlink 000100c0: 31 07 00 00 00 83 04 00 78 66 69 6c 65 01 00 00  1.......xfile... 000100d0: 00 84 09 00 88 68 61 72 64 6c 69 6e 6b 31 01 00  .....hardlink1.. 000100e0: 00 00 84 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 000100f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................     

目录项也是占空间的,所以不能说创建硬链接不占空间。虽然我上面的例子中的目录项们都在一个block里,没有造成额外分配,但是不表示目录项不占用空间,随着目录项的增多增大,肯定会需要更多的blocks的。而且也可能会产生目录数据结构的变化,占用更多空间来存储元数据。

所以说,硬链接不需要额外存储数据和inode结构,但是需要额外存储目录项,这是硬链接需要的存储空间,甚至可以说硬链接就是额外的目录项不是一个额外的文件。而且在分配目录项时可能造成多种目录结构甚至全局结构的变化,也是需要使用更多空间的

硬链接因为是两个目录项指向同一个inode,也就是指向同一个物理地址。所以当你删除其中一个,你只是删除了目录项,但是因为还有其它目录项引用这个inode的物理地址,所以这片地址仍然有效,可以通过剩下的指向这片inode的目录项继续访问。

结语

所以,理解文件系统是真正理解硬链接和软链接的途径。即使不深入理解,也应该知道上述的内容,不能模糊的说硬链接和软链接不占用空间。我们要知道它们的哪部分不额外占用空间,哪部分占用空间。

关于上面列出的部分文章,如果有兴趣想详细了解的话,还是建议按顺序阅读,从中间读会对很多前置知识难以理解。更多内容可参考下面这个索引文章里列出的链接:

类似的话题

  • 回答
    咱们聊聊 Linux 创建硬链接为啥不占地方的事儿。这事儿说起来,得从文件的本质说起。你想啊,在电脑里,文件这玩意儿,最核心的其实是它存储在硬盘上的那堆实际数据。你可以把这堆数据想象成一本内容丰富的小说。而我们平时看到的文件名,以及它在哪个文件夹里,这更像是这本小说的“书签”或者“目录条目”。它们告.............
  • 回答
    没问题,很高兴能帮助你入门 Linux 设备驱动开发,尤其是创建你的第一个字符设备驱动。这绝对是学习内核开发一个非常扎实的起点。新手在刚接触内核代码的时候,确实会遇到不少“这都是干啥的”的疑问,这很正常。我尽量把这些代码的功能讲得细致明白,就像咱们平时交流一样,尽量避免那些生硬的、机器人式的表述。咱.............
  • 回答
    .......
  • 回答
    在 Linux 系统中,创建新进程之所以被设计成由 `fork()` 和 `exec()` 系列函数协同完成,而不是一个单一的函数,这背后有着深刻的设计理念和技术考量。这种分离并非为了增加复杂性,而是为了提供一种极其灵活、强大且高效的进程创建机制,同时遵循了 Unix 哲学中的“ KISS”(Kee.............
  • 回答
    Linux Kernel 4.9 中引入的 BBR (Bottleneck Bandwidth and Roundtrip propagation time) 算法代表了 TCP 拥塞控制领域的一个重要进步。与之前广泛使用的算法(如 Cubic、Reno、NewReno)相比,BBR 具有以下显著优.............
  • 回答
    要说 Linux 的核心思想,那得从它诞生的时代背景聊起。那时候,操作系统还是一个比较封闭且昂贵的东西,主要是大型机和小型机的天下。普通人想要玩点啥,要么得花大价钱,要么只能玩一些非常简陋的系统。这时候,一个叫 Linus Torvalds 的芬兰大学生,出于对现有操作系统的“不满”和对学习计算机原.............
  • 回答
    当Linux系统更新后无法启动时,确实会让人感到焦虑和无助,但通过系统性排查和步骤操作,通常可以逐步解决问题。以下是详细的心理状态分析和应对步骤: 一、心情与心理状态1. 焦虑与着急:系统无法启动意味着无法进行常规操作,可能涉及重要数据丢失或服务中断,导致用户感到紧张。2. 无助感:如果对系统技术细.............
  • 回答
    Linux 系统确实具有“天生安全基因”,其整体安全性设计在操作系统层面具有显著优势,这源于其设计哲学、技术架构和开源生态的综合影响。以下从多个维度详细分析 Linux 的安全性特点及其优势: 1. 设计哲学:最小化、模块化与隔离性Linux 的设计哲学强调最小化攻击面和模块化架构,这些原则直接提升.............
  • 回答
    在Linux下进行Socket编程时,需要注意以下几个关键点,以确保程序的稳定性、安全性、性能和跨平台兼容性: 一、基础概念与步骤1. Socket类型与协议选择 TCP(面向连接):适合可靠数据传输,需通过三次握手建立连接。 UDP(无连接):适合低延迟场景,但可能丢失数据包。 .............
  • 回答
    Linux 之所以坚持使用宏内核(Monolithic Kernel)架构,主要源于其设计哲学、性能需求、开发历史以及对系统稳定性和可扩展性的追求。以下从多个角度详细分析这一选择的合理性: 1. 性能优势:减少上下文切换和系统调用开销 宏内核的直接性:在宏内核中,所有操作系统功能(如进程调度、设备驱.............
  • 回答
    Linux 内核是不是“屎山”?这个问题就像问“大海是咸的吗?”一样,答案既肯定又否定,而且极其复杂。要深入探讨这个问题,需要剥开一层层关于软件工程、历史、社区协作以及现实世界妥协的复杂性。“屎山”的定义:一个主观但有共识的标签首先,我们得理解“屎山”这个词在软件开发语境下的含义。它通常指的是: .............
  • 回答
    很多使用过 macOS 的朋友,在转向 Linux 时,常常会怀念 macOS 那种优雅、流畅且高度整合的桌面体验。毕竟,macOS 在用户界面和交互设计上一直有其独到之处。那么,Linux 内核的发行版本中,有没有能够提供类似体验的选择呢?答案是肯定的,而且不止一个,只是需要我们花点心思去挑选和配.............
  • 回答
    在 Linux 和 Windows 这两大操作系统之间,关于文件管理机制谁更优秀的讨论一直不绝于耳。要给出一个绝对的答案并不容易,因为“优秀”的标准会因使用者的需求、习惯和技术背景而异。但是,我们可以从多个维度来剖析 Linux 和 Windows 的文件管理机制,以便更清晰地理解它们的差异和各自的.............
  • 回答
    许多人认为 Linux 是一个强大的、多功能的操作系统,这毋庸置疑。但要说它是“实时操作系统”,那可就得打个问号了。这并不是说 Linux 在某些情况下做不到一些接近实时的事情,而是说它从本质上讲,不是为那种严格的、毫秒级的甚至微秒级的时间要求而设计的。咱们先聊聊什么是“实时操作系统”(RTOS)。.............
  • 回答
    在Linux下寻找真正意义上“断电可靠”的文件系统,这就像是在问有没有一种永不生锈的金属,答案是:没有绝对的,但有一些文件系统在设计上极大地增强了在异常断电情况下的数据完整性和恢复能力。这里的“断电可靠”不仅仅是说数据不丢失,更重要的是在断电后,文件系统能够以一个一致、可用的状态恢复,而不是变成一堆.............
  • 回答
    在 Linux 内核切换到分页模式后,`ljmp $__BOOT_CS,$1f` 这行代码的出现,标志着一个关键性的步骤:执行一次远距离跳转,将 CPU 的执行流从一个代码段切换到另一个代码段,并且是从保护模式下的一个代码段跳转到已经配置好的分页模式下的新代码段。 让我们一层层剖析它的含义,就像剥洋.............
  • 回答
    在 Linux 内核中,为多线程(更准确地说,为进程中的线程)分配和管理栈空间是一个至关重要的环节,它直接关系到程序的执行稳定性、资源利用率以及并发安全性。理解这一模型,需要我们深入到用户空间和内核空间两个层面,以及它们之间的交互。核心概念:栈(Stack)首先,让我们明确栈是什么。栈是一种后进先出.............
  • 回答
    在Linux主机中增加一块内存条后,物理地址的扩展是一个相对底层和自动化的过程,主要依赖于硬件(内存控制器、CPU)和操作系统内核的协同工作。这并非一个需要用户手动干预的“步骤”,而是系统识别和利用新增内存的内在机制。下面我将尽量详细地解释这个过程,尽量剥离掉任何可能让人觉得是AI生成的痕迹,用一种.............
  • 回答
    关于 Linux 内核为何要映射到所有物理内存这个问题,咱们得从几个关键点来掰扯清楚。这可不是什么凭空捏造的规定,而是有着非常扎实的底层逻辑和实际运行需求驱动的。首先,得明白一个最核心的概念:内核就是整个操作系统的“大脑”。它负责管理硬件资源,调度进程,处理各种系统调用,保证程序能够正常运行。如果内.............
  • 回答
    在 Linux 世界里,确实有很多软件能带来一种独特且令人愉悦的“快感”,这种快感并非来自游戏或娱乐,而是源于其高效、自由、可定制性以及解决问题的能力。对我而言,这种“快感”主要体现在以下几个方面,以及与之相关的软件: 1. 对系统的完全掌控与自由:软件代表: 命令行工具(Bash/Zsh, Vim.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有