Linux-Kernel
Linux 核心如何自我更新?
核心如何在執行時自我更新而不破壞過程中的任何內容?
更新核心時,實際上是更新了核心包。在大多數 Linux 發行版上,這實際上只是在包管理器中註冊包,在 下添加新模組,在下
/lib/modules
添加 initramfs 和核心/boot
,並可能更新引導載入程序條目和其他一些其他活動。它通常不會真正替換記憶體中載入的核心。在啟動時,核心本身被載入到記憶體中。也就是說,即使載入它的文件(例如
/boot/vmlinuz
)消失了,在核心初始載入後也不需要它。即使某些東西需要它(比如調試資訊)並且已經被替換,任何已經擁有打開文件句柄的人仍然可以使用該文件,因為在有問題的 inode 之前不會刪除支持數據引用計數為 0(核心本身不需要這樣的引用,因為它已經載入到記憶體中,這與從使用者空間執行檔中執行的程序不同)。除非您正在對該文件執行某些使用者空間程序,否則這些塊通常可以從磁碟中完全釋放。Linux 核心不會對自己的記憶體進行分頁,甚至會在啟動時即時解壓縮。沒有
/proc/.../exe
或/proc/.../fd
訪問已啟動的 /boot/vmlinuz 的方法——核心甚至可能不會掛載它在網路啟動或 USB 啟動情況下啟動的設備。所以一般來說,核心不會自我更新。這通常在重新啟動或
kexec
時間完成。您所描述的這種事情確實存在於kpatch、kgraft和ksplice等有限案例中,但通常這些只能用於小型和有針對性的更新檔,而不是新的上游核心版本。