溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux內(nèi)核中init進(jìn)程是什么

發(fā)布時(shí)間:2021-12-17 10:09:03 來源:億速云 閱讀:309 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“l(fā)inux內(nèi)核中init進(jìn)程是什么”,在日常操作中,相信很多人在linux內(nèi)核中init進(jìn)程是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”linux內(nèi)核中init進(jìn)程是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!


一、init進(jìn)程完成了從內(nèi)核態(tài)向用戶態(tài)的轉(zhuǎn)變:


1、一個(gè)進(jìn)程2種狀態(tài):

這里所說的一個(gè)進(jìn)程兩種狀態(tài),說的是進(jìn)程狀態(tài)的轉(zhuǎn)換;首先在介紹這種狀態(tài)的轉(zhuǎn)換之前,我們來了解一下什么是init進(jìn)程,它其實(shí)是linux系統(tǒng)在啟動(dòng)后運(yùn)行的第一個(gè)進(jìn)程(這里關(guān)于進(jìn)程的學(xué)習(xí),可以去看我之前分享的linux應(yīng)用編程專輯,有很詳細(xì)的介紹);而init進(jìn)程剛開始運(yùn)行的時(shí)候是內(nèi)核態(tài),它屬于一個(gè)內(nèi)核線程,然后他自己運(yùn)行了一個(gè)用戶態(tài)下面的程序后把自己強(qiáng)行轉(zhuǎn)成了用戶態(tài)。因?yàn)閕nit進(jìn)程自身完成了從內(nèi)核態(tài)到用戶態(tài)的過度,因此后續(xù)的其他進(jìn)程都可以工作在用戶態(tài)下面了。


2、內(nèi)核態(tài)下做了什么?


內(nèi)核狀態(tài)下重點(diǎn)就做了一件事情,就是掛載根文件系統(tǒng)并試圖找到用戶態(tài)下的那個(gè)init程序。init進(jìn)程要把自己轉(zhuǎn)成用戶態(tài)就必須運(yùn)行一個(gè)用戶態(tài)的應(yīng)用程序(這個(gè)應(yīng)用程序名字一般也叫init),要運(yùn)行這個(gè)應(yīng)用程序就必須得找到這個(gè)應(yīng)用程序,要找到它就必須得掛載根文件系統(tǒng),因?yàn)樗械膽?yīng)用程序都在文件系統(tǒng)中。內(nèi)核源代碼中的所有函數(shù)都是內(nèi)核態(tài)下面的,執(zhí)行任何一個(gè)都不能脫離內(nèi)核態(tài)。應(yīng)用程序必須不屬于內(nèi)核源代碼,這樣才能保證自己是用戶態(tài)。也就是說我們這里執(zhí)行的這個(gè)init程序和內(nèi)核不在一起,他是另外提供的。提供這個(gè)init程序的那個(gè)人就是根文件系統(tǒng)。


打個(gè)不恰當(dāng)?shù)谋扔?,比如大家都知道的建房子,在這之前,你必須打好地基,打好了地基之后,你才能開始動(dòng)工在地基上砌磚頭了,也就是各種操作了。


3、用戶態(tài)下做了什么?


init進(jìn)程大部分有意義的工作都是在用戶態(tài)下進(jìn)行的。init進(jìn)程對我們操作系統(tǒng)的意義在于:其他所有的用戶進(jìn)程都直接或者間接派生自init進(jìn)程。


4、如何從內(nèi)核態(tài)跳躍到用戶態(tài)?還能回來不?


init進(jìn)程在內(nèi)核態(tài)下面時(shí),通過一個(gè)函數(shù)kernel_execve來執(zhí)行一個(gè)用戶空間編譯連接的應(yīng)用程序就跳躍到用戶態(tài)了。注意這個(gè)跳躍過程中進(jìn)程號是沒有改變的,所以一直是進(jìn)程1.這個(gè)跳躍過程是單向的,也就是說一旦執(zhí)行了init程序轉(zhuǎn)到了用戶態(tài)下整個(gè)操作系統(tǒng)就算真正的運(yùn)轉(zhuǎn)起來了,以后只能在用戶態(tài)下工作了,用戶態(tài)下想要進(jìn)入內(nèi)核態(tài)只有走API這一條路了。這就是大家經(jīng)??床僮飨到y(tǒng)大致框架都是這樣描述的:


上層:表示我們的應(yīng)用程序,在linux里面我們會有相應(yīng)的api(或者自己寫的)


中間層:就是我們的內(nèi)核了,也就是操作系統(tǒng)了


底層:就是實(shí)實(shí)在在的硬件電路(當(dāng)然在os和硬件之間有一個(gè)啟動(dòng)程序,也就是我們常說的uboot)。


具體kernel_execve函數(shù)如下(這里贊不分析,暫時(shí)讓大家理性的感受一下第一次看linux內(nèi)核代碼的感受,這里主要面向第一次接觸linux代碼的小伙伴哦。):

int kernel_execve(const char *filename, char *const argv[], char *const envp[])
{
struct pt_regs regs;
int ret;

memset(&regs, 0, sizeof(struct pt_regs));
ret = do_execve((char *)filename, (char __user * __user *)argv,
(char __user * __user *)envp, &regs);
if (ret < 0)
goto out;

/*
* Save argc to the register structure for userspace.
*/
regs.ARM_r0 = ret;

/*
* We were successful.  We won't be returning to our caller, but
* instead to user space by manipulating the kernel stack.
*/
asm( "add r0, %0, %1\n\t"
"mov r1, %2\n\t"
"mov r2, %3\n\t"
"bl memmove\n\t" /* copy regs to top of stack */
"mov r8, #0\n\t" /* not a syscall */
"mov r9, %0\n\t" /* thread structure */
"mov sp, r0\n\t" /* reposition stack pointer */
"b ret_to_user"
:
: "r" (current_thread_info()),
 "Ir" (THREAD_START_SP - sizeof(regs)),
 "r" (&regs),
 "Ir" (sizeof(regs))
: "r0", "r1", "r2", "r3", "ip", "lr", "memory");

out:
return ret;
}
 


二、init進(jìn)程構(gòu)建了用戶交互界面:


在上面也說了,在init進(jìn)程切換到用戶狀態(tài)后,以后對操作系統(tǒng)操作的話就能只能在用戶狀態(tài)下操作了,而這各種操作也就是我們的進(jìn)程操作了,和windows里面的實(shí)際應(yīng)用程序一樣,一個(gè)程序就是一個(gè)進(jìn)程,比如我們在windows任務(wù)管理器里面就可以看到如下圖所示:

linux內(nèi)核中init進(jìn)程是什么   

在我們linux系統(tǒng)里面的話,在init進(jìn)程轉(zhuǎn)換為用戶狀態(tài)下后,后面有一些我們比較熟悉的進(jìn)程操作:login進(jìn)程、命令行進(jìn)程、shell進(jìn)程(shell,我們都很熟悉,人機(jī)交互圖像話界面),并且shell進(jìn)程又會啟動(dòng)了其他用戶進(jìn)程;然后在命令行和shell進(jìn)程一旦工作了,用戶就可以在命令行下通過./xx的方式來執(zhí)行其他應(yīng)用程序,每一個(gè)應(yīng)用程序的運(yùn)行就是一個(gè)進(jìn)程。

到此,關(guān)于“l(fā)inux內(nèi)核中init進(jìn)程是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI