2.16.10.init程式詳解1

weixin_30639719發表於2020-04-05

2.16.10.1、init程式完成了從核心態向使用者態的轉變
(1)一個程式2種狀態。init程式剛開始執行的時候是核心態,它屬於一個核心執行緒,然後他自己執行了一個使用者態下面的程式後把自己強行轉成了使用者態。因為init程式自身完成了從核心態到使用者態的過度,因此後續的其他程式都可以工作在使用者態下面了。
(2)核心態下做了什麼?重點就做了一件事情,就是掛載根檔案系統並試圖找到使用者態下的那個init程式。init程式要把自己轉成使用者態就必須執行一個使用者態的應用程式(這個應用程式名字一般也叫init),要執行這個應用程式就必須得找到這個應用程式,要找到它就必須得掛載根檔案系統,因為所有的應用程式都在檔案系統中。
核心原始碼中的所有函式都是核心態下面的,執行任何一個都不能脫離核心態。應用程式必須不屬於核心原始碼,這樣才能保證自己是使用者態。也就是說我們這裡執行的這個init程式和核心不在一起,他是另外提供的。提供這個init程式的那個人就是根檔案系統。

(3)使用者態下做了什麼?init程式大部分有意義的工作都是在使用者態下進行的。init程式對我們作業系統的意義在於:其他所有的使用者程式都直接或者間接派生自init程式。

(4)如何從核心態跳躍到使用者態?還能回來不?
init程式在核心態下面時,通過一個函式kernel_execve來執行一個使用者空間編譯連線的應用程式就跳躍到使用者態了。注意這個跳躍過程中程式號是沒有改變的,所以一直是程式1.這個跳躍過程是單向的,也就是說一旦執行了init程式轉到了使用者態下整個作業系統就算真正的運轉起來了,以後只能在使用者態下工作了,使用者態下想要進入核心態只有走API這一條路了。

2.16.10.2、init程式構建了使用者互動介面
(1)init程式是其他使用者程式的老祖宗。linux系統中一個程式的建立是通過其父程式建立出來的。根據這個理論只要有一個父程式就能生出一堆子孫程式了。
(2)init啟動了login程式、命令列程式、shell程式
(3)shell程式啟動了其他使用者程式。命令列和shell一旦工作了,使用者就可以在命令列下通過./xx的方式來執行其他應用程式,每一個應用程式的執行就是一個程式。

總結:本節的主要目的是讓大家認識到init程式如何一步步發展成為我們平時看到的那種作業系統的樣子。

轉載於:https://www.cnblogs.com/Ocean-Star/p/9236189.html

相關文章