**:
什麼是kexec?
可從當前正在執行的核心直接跳轉到新核心
為什麼需要kexec?
跳過boot階段,減少重啟時間
kexec整體思路如下
1)新的kernel映象和initrd映象連續儲存在記憶體中,initrd的位置記錄在boot_params中
2)切換到新核心就是跳轉到新的kernel映象所在記憶體位置,cpu執行其entry的**即可,新的核心通過boot_params記錄的initrd位置完成根檔案系統內容的載入
原理不複雜,但受到一些實際情況的限制,所以在實現上會略複雜一些。
首先,kernel映象有指定的入口位址,kernel映象要載入到入口位址位置才能正常啟動,而這塊記憶體正在被當前核心使用,所以kernel映象需要臨時存放的記憶體,在跳轉前要將內容搬移到入口位址。
其次,initrd的體積可能較大,找不到用於儲存initrd的連續大段物理記憶體,因此需要分散儲存在能申請到的記憶體頁面中,在kernel跳轉前搬移拼接到目的位址。
簡單講,映象先臨時存放,切換時再搬移到目標位址。
以kexec -s uimage --ramdisk=./ramdisk.bin為例進行說明。
uimage和ramdisk.bin都是要使用的內容,抽象為segment物件進行管理,那麼這裡存在2個segment,分別對應uimage和ramdisk.bin
核心使用alloc_pages來申請頁面,如果碎片化嚴重,很難申請到高階物理記憶體,所以kexec的做法是迴圈申請,每次申請乙個頁面。這會帶來乙個問題,屬於同乙個映象的頁面彼此不連續,需要對這些臨時承載映象內容的頁面進行管理。
為此,kexec引入了entry的概念,其實就是乙個unsigned long物件,記錄申請到的page的實體地址,並利用低位的4bit來對entry進行分類,共計有如下4類entry。
1)ind_destination,用於記錄segment要搬移到的目標位址
2)ind_source,用於記錄segment內容所在的實體地址
3)ind_indirection
4)ind_done
entry本身也需要記憶體來儲存,為此,kexec首先申請乙個page用於儲存entry,如果page存滿entry時,需要再新分配乙個page,並使用之前page內最後乙個entry記錄新分配page的實體地址,這個entry就是3)ind_indirection型別entry。
那麼uimage作為第乙個segment,會對應乙個ind_destination型別entry和若干ind_source型別entry,ramdisk.bin作為第二個segment同樣會對應乙個ind_destination型別entry和若干ind_source型別entry,當全部segment儲存完成,kexec會加入4)ind_done型別entry,表示全部segment的內容到此記錄完成。
結合下圖會有較直觀的認識,ind_destination型別entry表示乙個segment的開始,直到下乙個ind_destination型別entry或ind_done型別entry之前的ind_source型別entry都記錄了該segment內容儲存的實體地址。
接下來的事情相對簡單,在使用者執行kexec -e後,會進入跳轉流程,將segment的內容依次搬移到ind_destination型別entry記錄的實體地址對應位置,結合下圖可有較直觀的認識。
全部segment內容搬移完成,跳轉到入口位址,就切換到了新的kernel。
5分鐘搞懂模版方法模式
模版是什麼大家都清楚,比如簡歷模版,簡歷模版包括教育經歷 工作經歷 專業技能等等欄目。雖然簡歷模版相同,但是每個人的簡歷卻不同,這是因為我們每個人的教育經歷 工作經歷 專業技能等都不同。同理,在設計模式中,模板方法模式的主要用途在於將不變的行為從子類搬到超類,去除了子類中的重複 下面是模板方法模式的...
5分鐘搞懂 session與cookie
無狀態協議的意思是服務端與客戶端不會記錄任何一次通訊的資訊。諾蘭有一部電影 記憶碎片 說的是乙個有 短期記憶喪失症 的人根據自己支離破碎的記憶來找到殺害自己妻子的 的故事。因為記不住發生的事,電影中那個老兄只能靠寫字條幫忙記錄事情。無狀態協議的通訊雙方就是 失憶症患者 而且是永久性的。服務端君 和 ...
5分鐘搞懂什麼是深度學習
現在各種名詞非常火,什麼人工智慧 機器學習 深度學習,那麼我要學習它,當然是要在乙個大的方向 輪廓上看到它。比如爬一座山,先遠遠的看看,對它有乙個大致的了解。如何理解人工智慧 機器學習和深度學習三者的關係 嗯嗯,這麼一看是不是清楚了很多呢?再來一張 人工智慧 機器學習和深度學習三者的關係 深度學習 ...