免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

用戶態(tài)和內(nèi)核態(tài)的概念區(qū)別

 joy_chen 2012-12-24

究竟什么是用戶態(tài),什么是內(nèi)核態(tài),這兩個(gè)基本概念以前一直理解得不是很清楚,根本原因個(gè)人覺得是在于因?yàn)榇蟛糠謺r(shí)候我們?cè)趯懗绦驎r(shí)關(guān)注的重點(diǎn)和著眼的角度放在了實(shí)現(xiàn)的功能和代碼的邏輯性上,先看一個(gè)例子:

1)例子

C代碼

1.     void testfork(){  

2.     if(0 = = fork()){  

3.     printf(create new process success!\n);  

4.     }  

5.     printf(testfork ok\n);  

6.     }  

這段代碼很簡(jiǎn)單,從功能的角度來看,就是實(shí)際執(zhí)行了一個(gè)fork(),生成一個(gè)新的進(jìn)程,從邏輯的角度看,就是判斷了如果fork()返回的是則打印相關(guān)語句,然后函數(shù)最后再打印一句表示執(zhí)行完整個(gè)testfork()函數(shù)。代碼的執(zhí)行邏輯和功能上看就是如此簡(jiǎn)單,一共四行代碼,從上到下一句一句執(zhí)行而已,完全看不出來哪里有體現(xiàn)出用戶態(tài)和進(jìn)程態(tài)的概念。

如果說前面兩種是靜態(tài)觀察的角度看的話,我們還可以從動(dòng)態(tài)的角度來看這段代碼,即它被轉(zhuǎn)換成CPU執(zhí)行的指令后加載執(zhí)行的過程,這時(shí)這段程序就是一個(gè)動(dòng)態(tài)執(zhí)行的指令序列。而究竟加載了哪些代碼,如何加載就是和操作系統(tǒng)密切相關(guān)了。

2)特權(quán)級(jí)

熟悉Unix/Linux系統(tǒng)的人都知道,fork的工作實(shí)際上是以系統(tǒng)調(diào)用的方式完成相應(yīng)功能的,具體的工作是由sys_fork負(fù)責(zé)實(shí)施。其實(shí)無論是不是Unix或者Linux, 對(duì)于任何操作系統(tǒng)來說,創(chuàng)建一個(gè)新的進(jìn)程都是屬于核心功能,因?yàn)樗龊芏嗟讓蛹?xì)致地工作,消耗系統(tǒng)的物理資源,比如分配物理內(nèi)存,從父進(jìn)程拷貝相關(guān)信 息,拷貝設(shè)置頁目錄頁表等等,這些顯然不能隨便讓哪個(gè)程序就能去做,于是就自然引出特權(quán)級(jí)別的概念,顯然,最關(guān)鍵性的權(quán)力必須由高特權(quán)級(jí)的程序來執(zhí)行,這 樣才可以做到集中管理,減少有限資源的訪問和使用沖突。

特權(quán)級(jí)顯然是非常有效的管理和控制程序執(zhí)行的手段,因此在硬件上對(duì)特權(quán)級(jí)做了很多支持,就Intel x86架構(gòu)的CPU來說一共有0~3四個(gè)特權(quán)級(jí),級(jí)最高,3級(jí)最低,硬件上在執(zhí)行每條指令時(shí)都會(huì)對(duì)指令所具有的特權(quán)級(jí)做相應(yīng)的檢查,相關(guān)的概念有 CPL、DPLRPL,這里不再過多闡述。硬件已經(jīng)提供了一套特權(quán)級(jí)使用的相關(guān)機(jī)制,軟件自然就是好好利用的問題,這屬于操作系統(tǒng)要做的事情,對(duì)于 Unix/Linux來說,只使用了級(jí)特權(quán)級(jí)和3級(jí)特權(quán)級(jí)。也就是說在Unix/Linux系統(tǒng)中,一條工作在級(jí)特權(quán)級(jí)的指令具有了CPU能提供的最高權(quán)力,而一條工作在3級(jí)特權(quán)級(jí)的指令具有CPU提供的最低或者說最基本權(quán)力。

3)用戶態(tài)和內(nèi)核態(tài)

現(xiàn)在我們從特權(quán)級(jí)的調(diào)度來理解用戶態(tài)和內(nèi)核態(tài)就比較好理解了,當(dāng)程序運(yùn)行在3級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在用戶態(tài),因?yàn)檫@是最低特權(quán)級(jí),是普通的用戶進(jìn)程運(yùn)行的特權(quán)級(jí),大部分用戶直接面對(duì)的程序都是運(yùn)行在用戶態(tài);反之,當(dāng)程序運(yùn)行在級(jí)特權(quán)級(jí)上時(shí),就可以稱之為運(yùn)行在內(nèi)核態(tài)。

雖然用戶態(tài)下和內(nèi)核態(tài)下工作的程序有很多差別,但最重要的差別就在于特權(quán)級(jí)的不同,即權(quán)力的不同。運(yùn)行在用戶態(tài)下的程序不能直接訪問操作系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)和程序,比如上面例子中的testfork()就不能直接調(diào)用 sys_fork(),因?yàn)榍罢呤枪ぷ髟谟脩魬B(tài),屬于用戶態(tài)程序,而sys_fork()是工作在內(nèi)核態(tài),屬于內(nèi)核態(tài)程序。

當(dāng)我們?cè)谙到y(tǒng)中執(zhí)行一個(gè)程序時(shí),大部分時(shí)間是運(yùn)行在用戶態(tài)下的,在其需要操作系統(tǒng)幫助完成某些它沒有權(quán)力和能力完成的工作時(shí)就會(huì)切換到內(nèi)核態(tài),比如testfork()最初運(yùn)行在用戶態(tài)進(jìn)程下,當(dāng)它調(diào)用fork()最終觸發(fā) sys_fork()的執(zhí)行時(shí),就切換到了內(nèi)核態(tài)。

2. 用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換

1)用戶態(tài)切換到內(nèi)核態(tài)的3種方式

a. 系統(tǒng)調(diào)用

這是用戶態(tài)進(jìn)程主動(dòng)要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進(jìn)程通過系統(tǒng)調(diào)用申請(qǐng)使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如前例中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個(gè)中斷來實(shí)現(xiàn),例如Linuxint 80h中斷。

b. 異常             

當(dāng)CPU在執(zhí)行運(yùn)行在用戶態(tài)下的程序時(shí),發(fā)生了某些事先不可知的異常,這時(shí)會(huì)觸發(fā)由當(dāng)前運(yùn)行進(jìn)程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常。

c. 外圍設(shè)備的中斷

當(dāng)外圍設(shè)備完成用戶請(qǐng)求的操作后,會(huì)向CPU發(fā)出相應(yīng)的中斷信號(hào),這時(shí)CPU會(huì)暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號(hào)對(duì)應(yīng)的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個(gè)轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤讀寫操作完成,系統(tǒng)會(huì)切換到硬盤讀寫的中斷處理程序中執(zhí)行后續(xù)操作等。

3種方式是系統(tǒng)在運(yùn)行時(shí)由用戶態(tài)轉(zhuǎn)到內(nèi)核態(tài)的最主要方式,其中系統(tǒng)調(diào)用可以認(rèn)為是用戶進(jìn)程主動(dòng)發(fā)起的,異常和外圍設(shè)備中斷則是被動(dòng)的。

2)具體的切換操作

從觸發(fā)方式上看,可以認(rèn)為存在前述3種 不同的類型,但是從最終實(shí)際完成由用戶態(tài)到內(nèi)核態(tài)的切換操作上來說,涉及的關(guān)鍵步驟是完全一致的,沒有任何區(qū)別,都相當(dāng)于執(zhí)行了一個(gè)中斷響應(yīng)的過程,因?yàn)? 系統(tǒng)調(diào)用實(shí)際上最終是中斷機(jī)制實(shí)現(xiàn)的,而異常和中斷的處理機(jī)制基本上也是一致的,關(guān)于它們的具體區(qū)別這里不再贅述。關(guān)于中斷處理機(jī)制的細(xì)節(jié)和步驟這里也不 做過多分析,涉及到由用戶態(tài)切換到內(nèi)核態(tài)的步驟主要包括:

[1] 從當(dāng)前進(jìn)程的描述符中提取其內(nèi)核棧的ss0esp0信息。

[2] 使用ss0esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cs,eip,eflags,ss,esp信息保存起來,這個(gè)

過程也完成了由用戶棧到內(nèi)核棧的切換過程,同時(shí)保存了被暫停執(zhí)行的程序的下一

條指令。

[3] 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應(yīng)的寄存器,開始

執(zhí)行中斷處理程序,這時(shí)就轉(zhuǎn)到了內(nèi)核態(tài)的程序執(zhí)行了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多