内核如何在运行时进行自我更新而不破坏进程中的任何内容?
答案1
当你更新内核时,你实际上更新了内核包裹。在大多数 Linux 发行版上,这实际上只是在包管理器中注册包,在 下添加新模块/lib/modules
,在 下添加 initramfs 和内核/boot
,并且可能更新引导加载程序条目和其他一些杂项活动。它通常不会实际替换内存中加载的内核。
启动时,内核本身被加载到内存中。也就是说,即使它加载的文件(例如/boot/vmlinuz
)消失了,在内核初始加载后也不再需要它。
即使它曾是某些东西(例如调试信息)需要并且已被替换,任何已经拥有打开文件句柄的人仍然可以使用该文件,因为在相关 inode 具有引用计数之前不会删除支持数据0(内核本身不需要这样的引用,因为它已经加载到内存中,这与从用户空间可执行文件运行进程不同)。这些块通常可以从磁盘中完全释放,除非您正在该文件上运行某些用户空间程序。 Linux 内核不会对自己的内存进行分页,甚至会在启动时动态解压缩自身。没有/proc/.../exe
或/proc/.../fd
没有办法访问启动的 /boot/vmlinuz — 内核甚至可能不会在网络启动或 USB 启动情况下挂载它启动的设备。
所以一般来说,内核不会自行更新。这通常是在重新启动或kexec
重新启动时完成的。你所描述的那种事情做存在于有限的用例中补丁,移植物, 和克斯拼接,但通常这些只能用于小型和有针对性的补丁,而不是新的上游内核版本。