kexec 與 kboot

kexec 達到跳過 BIOS/bootloader 而直接重啟一個新 kernel 的功能。由於新舊 kernel 的起始位址是一樣的,因此如何克服新舊 kernel 順利轉換是其中一個問題。

當透過 kexec 這個工具載入新 kernel 到 memory 時,會先將目前 register 值以及系統的一些資料存起來(這部份有點不太懂,不過大概知道是一些重要的 data structure),當然中斷要取消掉。再來去跑位於 reboot_code_buffer 中的一小段 assembly code。這個 assembly code 就是實際做兩個 kernel 切換的工作。它最主要是清除掉一些資料,例如 stack 及 register 內的值。當由這段 assembly code 返回時,自然系統會去跑新的 kernel。

kboot - A Bootloader Based on Kexec 一文中,針對 kexec 的流程做了以下的圖解:



上圖應該有助於幫助大家了解 kexec 的流程。

上頭我看過這篇文章 Reboot Linux faster using kexec 後做的一些筆記。其中有些實作細節不太懂(哀...),但大概了解它是可以用來快速重啟 linux kernel...

至於 kboot 本身,事實上就是一個簡單的 linux。按官方說法,kboot 會誕生是因為他們覺得:

1. lilo 太多 assembly code
2. grub 很不錯,但是自成一格
3. u-boot 什麼都包(從 linux 偷一些 driver,修改後加入),但是產生很多問題

kboot 屬於 second-stage bootloader,意思就是說它前面還是要有一個 bootloader,例如 lilo/grub 等,來啟動它(這是傳統 linux 開機流程:bootloader->linux)。下圖說明了 kboot 流程:



基本上它透過 kexec 來達到啟動 main system 的目的。什麼?這樣不就等於啟動兩次 linux 系統?執時速度變慢了,那可以得到什麼好處?

官方說法是說,kboot 的好處是可以使用完整 linux 的功能(因為它就是一個完整的 linux...),程式碼好維護,有大眾化的使用者介面…等。聽起來好像還不錯,但是實際上它就是要開兩次 linux。至於應用在哪?ㄟ…我也不清楚耶!:P

留言

熱門文章