
如果像這樣啟動怎麼辦:
透過GRUB命令列或類似方式將參數傳遞INIT=/bin/sh(or /bin/bash)
給內核,然後啟動;
一旦 shell 載入完畢,立即退出。然後電腦對按下的任何按鍵都沒有反應。
我很好奇地位此刻的系統。據我所知,這init
是加載內核後將執行的第一個進程,而其他進程都fork
從中執行,似乎當/bin/sh
按照上述方式執行而不是init
使用正常的引導過程時,系統就不再有任何進程了。做。
是不是像跑步一樣閒著
while (1) {
sleep(1);
}
或者還有什麼?
感謝大家的建議。也許更多資訊會有所幫助,我曾經認為這是不必要的。
我最近在一台CentOS 7.2伺服器上工作,有一個XFS磁碟分割不正常,在系統啟動時花了無盡的時間進行檢查和恢復。我計劃編輯/etc/fstab
以關閉該分割區的自動安裝。由於正常的啟動過程被卡住,我曾經init=/bin/bash
使系統啟動到bash。編輯後fstab
,我exit
不小心執行了shell,然後螢幕上對按下的任何按鍵(包括 )都沒有響應Ctrl-Alt-Del
,並且沒有任何資訊提示內核恐慌(我無法判斷CPU是否正在努力工作,因為那個房間很吵)。我認為這是閒著,無事可做。這個現象讓我思考了我一開始寫下的問題。
今晚我在我自己的裝有 Debian 8 的筆記型電腦上做了一些測試。內核恐慌明顯。
答案1
我很驚訝。我的理解是終止PID 1導致內核恐慌。我可以告訴你那件事發生了什麼事。
恐慌行為是可配置的。使用預設選項,您將達到環形看起來跟你說的一模一樣。
使用的延遲函數是有記錄的作為“忙等待”。這是不是預計會進入作業系統正常閒置時使用的省電 CPU 睡眠狀態。
如果您查看恐慌列印的回溯,我想您會看到這一切都發生在sys_exit()
.我認為從技術上講,PID 1 不會被破壞,它只是永遠不會從系統呼叫中返回。首先停止任何其他 CPU。
(有一種東西叫做“啟動空閒線程”。我沒有看到它參與這個過程。 AFAICT 你永遠看不到這個線程。如果您想將其理解為空閒線程,您還必須詢問一旦其他 cpu 上線後,是什麼為它們提供空閒線程)。
答案2
如果沒有使用者級進程運行,系統就無事可做,這是不正確的。系統有一堆核心執行緒,核心本身已經啟動了。他們大部分時間都在睡覺,但會定期醒來執行任務。內核執行緒僅執行內核空間程式碼,即它們沒有任何用戶級記憶體映射。它們是獨立的進程,因為它們是獨立調度的並且具有唯一的進程 ID。
如果運行ps aux
,您可以透過執行緒名稱周圍的方括號來識別核心執行緒。
答案3
系統沒有任何進程在運作。因此,沒有像您所寫的那樣繁忙的循環(CPU 利用率為 100%)。中斷仍然可以由核心處理,但沒有進程。 CPU 將處於閒置狀態。
詳細資訊可以在此處找到kernel_init() 的來源,程序的執行方式與 類似execve()
。這也意味著執行不會返回(請參閱 參考資料execve(3p)
)。