Kexec Handover 用法¶
Kexec HandOver (KHO) 是一種允許 Linux 在 kexec 過程中保留記憶體區域的機制,這些記憶體區域可能包含序列化的系統狀態。
本文件假定您熟悉基本的 KHO 概念。如果您尚未閱讀它們,請立即閱讀。
先決條件¶
當核心編譯時設定了 CONFIG_KEXEC_HANDOVER 為 y 時,KHO 可用。每個 KHO 生產者可能都有自己的配置選項,如果您希望在 kexec 過程中保留它們各自的狀態,則需要啟用該選項。
要使用 KHO,請使用 kho=on 命令列引數啟動核心。您可以使用 kho_scratch 引數來定義 scratch 區域的大小。例如,kho_scratch=16M,512M,256M 將在啟動時保留一個 16 MiB 的低記憶體 scratch 區域、一個 512 MiB 的全域性 scratch 區域和 256 MiB 的每個 NUMA 節點的 scratch 區域。
執行 KHO kexec¶
首先,在執行 KHO kexec 之前,您需要將系統移動到 KHO 最終確定階段
$ echo 1 > /sys/kernel/debug/kho/out/finalize
執行此命令後,KHO FDT 在 /sys/kernel/debug/kho/out/fdt 中可用。其他子系統也可能在 /sys/kernel/debug/kho/out/sub_fdts/ 下注冊它們自己的保留的子 FDT。
接下來,載入目標有效負載並 kexec 到其中。重要的是,您使用 -s 引數來使用核心中的 kexec 檔案載入器,因為使用者空間 kexec 工具目前不支援使用基於使用者空間的檔案載入器的 KHO
# kexec -l /path/to/bzImage --initrd /path/to/initrd -s
# kexec -e
新的核心將啟動幷包含先前核心的某些狀態。
例如,如果您使用 reserve_mem 命令列引數來建立早期記憶體預留,則新核心將在與舊核心相同的物理地址處擁有該記憶體。
中止 KHO 執行¶
您可以透過呼叫以下命令再次將系統移出 KHO 最終確定階段
$ echo 0 > /sys/kernel/debug/kho/out/active
執行此命令後,KHO FDT 將不再在 /sys/kernel/debug/kho/out/fdt 中可用。
debugfs 介面¶
目前,KHO 建立以下 debugfs 介面。請注意,這些介面將來可能會更改。一旦 KHO 穩定,它們將被移動到 sysfs。
/sys/kernel/debug/kho/out/finalizeKexec HandOver (KHO) 允許 Linux 將相容驅動程式的狀態轉換到下一個 kexec 的核心中。為此,裝置驅動程式將指示 KHO 保留記憶體區域,這些區域可能包含序列化的核心狀態。在狀態被序列化時,它們無法對序列化的狀態(例如移交的記憶體分配)執行任何修改。
當此檔案包含“1”時,系統處於轉換狀態。當包含“0”時,系統不處於轉換狀態。要在兩種狀態之間切換,請將相應的數字回顯到此檔案中。
/sys/kernel/debug/kho/out/fdt當 KHO 狀態樹被最終確定時,核心會在此檔案中公開扁平化的裝置樹 blob,該 blob 攜帶其當前的 KHO 狀態。Kexec 使用者空間工具可以使用它作為 KHO 有效負載映象的輸入檔案。
/sys/kernel/debug/kho/out/scratch_lenKHO scratch 區域的長度,這些區域是物理上連續的記憶體區域,將始終可用於未來的 kexec 分配。Kexec 使用者空間工具可以使用此檔案來確定其有效負載映象的放置位置。
/sys/kernel/debug/kho/out/scratch_physKHO scratch 區域的物理位置。Kexec 使用者空間工具可以結合 scratch_phys 使用此檔案來確定其有效負載映象的放置位置。
/sys/kernel/debug/kho/out/sub_fdts/在 KHO 最終確定階段,KHO 生產者在此目錄下注冊它們自己的 FDT blob。
/sys/kernel/debug/kho/in/fdt當核心使用 Kexec HandOver (KHO) 啟動時,攜帶有關先前核心狀態的元資料的狀態樹位於此檔案中,格式為扁平化裝置樹。當它的所有使用者完成對其元資料的解釋時,此檔案可能會消失。
/sys/kernel/debug/kho/in/sub_fdts/與
kho/out/sub_fdts/類似,但包含從舊核心傳遞的 KHO 生產者的子 FDT blob。