kexec 快速重啟linux

2021-05-21 19:35:57 字數 2460 閱讀 4748

linux幾乎可以執行任何可以執行的東西,這好像是廢話。其實這句話的意思是它可以將任何東西作為可以執行的映像來執行,核心既然也是一種elf映像,那麼它當然是一種可執行的實體了。

linux核心是單核心,就是說linux的核心是乙個整體,裡面包羅永珍,這看起來讓人覺得linux是雜糅在一起的一堆,但是它內部的設計卻是高度模 塊化的,甚至是oo的,而且效能非常好,絕對不是將效能和穩定性作為容易維護的代價,linux核心從來都沒有捧軟體工程的場,但是它確實完全符合軟體工 程的思想,原因何在?藝術,因為創造它的人把它作為藝術品,而藝術品的美絕對是一種真實美,一種純潔美。

linux核心的一體性使得它很容易作為乙個整體被移動,載入,執行,這是很方便的,可以把特性,不足,甚至bug集中在乙個一體的核心當中,而不像微內 核或者windows之類的亂核心出了問題讓你找不到北。linux核心非常精巧,不但作為磁碟映象它是一體的,作為載入記憶體之後的記憶體映像,它也是一體 的,它載入到記憶體的固定位置,占用記憶體非常之小,這讓核心本身可以在記憶體中非常靈活,靈活在**呢?你可以實現在執行時公升級,修補,甚至替換linux內 核,替換linux實際上不就是重新啟動嗎?是的,就是重新啟動。如今的linux核心中提供了kexec機制可以實現linux在執行時重新啟動而不用 重新啟動硬體。

首先我們看一下linux之所以可以實現這種特性的原因,上面已經說了其中一點,還有一點就是linux靈活的記憶體管理系統,記憶體是程式的軀體,邏輯是程 序的靈魂,因此記憶體直接影響著程式,當然也影響著核心,任何可以被cpu執行的執行緒都在記憶體中,**來自記憶體,資料來自記憶體,一切都來自記憶體,而 linux作業系統執行除了依賴記憶體外還依賴核心,要想替換核心並且跳轉到新核心,而且是在當前的核心上下文替換核心是很不容易的,因為「替換並跳轉」本 身的**要來自老的核心,在沒有第三方幫忙的情況下,新核心替換了老核心之後的瞬間老核心就要失效了,那麼「替換並跳轉」僅僅在替換完成後就完蛋了,不能 跳轉到新核心了,這正如自己永遠不能舉起自己是一樣的道理,再者,linux是乙個分頁系統,頁表占有舉足輕重的地位,在載入新核心並跳轉到它之前,如果 清空了頁表,那麼現在的執行緒還怎麼繼續下去,畢竟在替換並跳轉的操作中,cpu認的還是虛擬位址,還要通過頁表這一mmu設施來進行轉換才可以得到實體地址的,如何繞開mmu或者主宰mmu平滑地過渡到新核心的虛擬記憶體就是乙個問題了。

linux自身的靈活性恰恰很簡單地解決了上述問題,在linux中除了核心映像的位置是固定的外,沒有什麼是固定的,也就是說你可以在任何地方放置任何東西,linux僅僅規定了虛擬記憶體高1g的幾個區域以及它們的用途,卻並沒有規定更具體的事情,比如什麼頁面必須對映到哪個地方,另外,linux對物 理記憶體幾乎沒有做任何規定。想想windows是怎麼做的,頁表的虛擬記憶體位址固定,檔案對映快取的虛擬位址固定,等等等等,幾乎和linux相反,一切 都是固定,雖然固化記憶體的windows在記憶體如此廉價的今天可以用自對映技術節省了那麼一點記憶體,但是卻極大的限制了其靈活性,這點上,windows 像陣列,而linux更像太極。linux的記憶體內容的不受限制就是說你可以將頁面對映到任何位置,而且你可以在任何地方申請得到這樣頁面,想替換執行中 的核心,其邏輯一想便知,將新的核心映像對映到記憶體的某些頁面,最好是物理連續,物理不連續也行,邏輯連續就成,然後將「替換並跳轉」的**對映到某些頁 面並且讓這段**「記住」新核心映像的頁面,然後跳轉到這個「替換並跳轉」的**並把這個**的頁面對映到與實體地址相同的虛擬位址(這並不會導致問題, 不會和核心資料或核心**衝突,只要在3g以下就可以,使用者空間這個時候已經完全沒有用了,系統預設這個時候使用者程序已經完全沒有乙個在執行了),最後跳轉到這個「替換並跳轉」的**處,在這段**中進行替換操作,實質上就是mov指令,此時禁用分頁就沒有問題了,因為這段**的虛擬位址和實體地址一致, 程式繼續進行而不會跑飛,最後linux採用了乙個技巧,不是靠jmp指令跳轉到新的核心,而是靠ret,因為在此之前,這段**已經設定了堆疊和新核心 的起始位址並讓它們在一起了,乙個跳轉正好過去。最後我們來看一下一些**:

noret_type void machine_kexec(struct kimage *image)

unsigned long page_list;

unsigned long reboot_code_buffer;

relocate_new_kernel_t rnk;

local_irq_disable();

reboot_code_buffer = page_to_pfn(image->control_code_page) << page_shift;

page_list = image->head;

identity_map_page(reboot_code_buffer); //此舉乃是一致性對映

memcpy((void *)reboot_code_buffer, relocate_new_kernel, relocate_new_kernel_size);

rnk = (relocate_new_kernel_t) reboot_code_buffer;

(*rnk)(page_list, reboot_code_buffer, image->start, cpu_has_pae); //「替換並跳轉」函式

快速重啟 Quick Boot plus

quick boot 快速啟動 可方便快速地重啟 關閉您的裝置,或將您的裝置重啟到恢復 引導模式,增強版還實現了熱啟動和tasker locale外掛程式整合功能。快速重啟漢化版 quick boot plus v4.7 主要功能 重新啟動 正常重啟您的裝置 恢復模式 將您的裝置重啟到恢復模式 re...

Linux 重啟命令

linux 重啟命令 1 shutdown 2 poweroff 3 init 4 reboot 5 halt 具體說明 shutdown reboot 在linux下一些常用的關機 重啟命令有shutdown halt reboot 及init,它們都可以達到重啟系統的目的,但每個命令的內部 工作...

Linux 重啟命令

linux 重啟命令 1 shutdown 2 poweroff 3 init 4 reboot 5 halt 具體說明 shutdown reboot 在linux下一些常用的關機 重啟命令有shutdown halt reboot 及init,它們都可以達到重啟系統的目的,但每個命令的內部 工作...