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

  • CPU的兩種工作狀態(tài):內(nèi)核態(tài)和用戶態(tài)(或者稱管態(tài)和目態(tài))

內(nèi)核態(tài)

  • 系統(tǒng)中既有操作系統(tǒng)的程序,也由普通用戶的程序。為了安全和穩(wěn)定性操作系統(tǒng)的程序不能隨便訪問,這就是內(nèi)核態(tài)
  • 內(nèi)核態(tài)可以使用所有的硬件資源

用戶態(tài)

  • 不能直接使用系統(tǒng)資源,也不能改變CPU的工作狀態(tài),并且只能訪問這個(gè)用戶程序自己的存儲(chǔ)空間

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

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

  • Linux使用了Ring3級(jí)別運(yùn)行用戶態(tài),Ring0標(biāo)識(shí)內(nèi)核態(tài)
  • Ring0作為內(nèi)核態(tài),沒有使用Ring1和Ring2。
  • Ring3狀態(tài)不能訪問Ring0的地址 空間,包括代碼和數(shù)據(jù)。
  • Linux進(jìn)程的4GB地址空間,3G-4G部分大家是共享的,是內(nèi)核態(tài)的地址空間,這里存放在整個(gè)內(nèi)核的代碼和所有的內(nèi)核模塊, 以及內(nèi)核所維護(hù)的數(shù)據(jù)。用戶運(yùn)行一個(gè)程序,該程序所創(chuàng)建的進(jìn)程開始是運(yùn)行在用戶態(tài)的,如果要執(zhí)行文件操作,網(wǎng)絡(luò)數(shù)據(jù)發(fā)送等操作,必須通過 write,send等系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用會(huì)調(diào)用內(nèi)核中的代碼來完成操作,這時(shí),必須切換到Ring0,然后進(jìn)入3GB-4GB中的內(nèi)核地址空間去執(zhí) 行這些代碼完成操作,完成后,切換回Ring3,回到用戶態(tài)。這樣,用戶態(tài)的程序就不能隨意操作內(nèi)核地址空間,具有一定的安全保護(hù)作用。

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

Paste_Image.png

系統(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ù)程序完成工作,比如linux中fork()實(shí)際上就是執(zhí)行了一個(gè)創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機(jī)制其核心還是使用了操作系統(tǒng)為用戶 特別開放的一個(gè)中斷來實(shí)現(xiàn),例如Linux的int 80h中斷。

異常

  • 當(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),比如缺頁異常。

外圍設(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)的。

具體的切換操作

  • 從 觸發(fā)方式上看,可以認(rèn)為存在前述3種不同的類型,但是從最終實(shí)際完成由用戶態(tài) 到內(nèi)核態(tài)的切換操作上來說,涉及的關(guān)鍵步驟是完全一致的,沒有任何區(qū)別,都相當(dāng)于執(zhí)行了一個(gè)中斷響應(yīng)的過程,因?yàn)橄到y(tǒng)調(diào)用實(shí)際上最終是中斷機(jī)制實(shí)現(xiàn)的,而 異常和中斷的處理機(jī)制基本上也是一致的,關(guān)于它們的具體區(qū)別這里不再贅述。關(guān)于中斷處理機(jī)制的細(xì)節(jié)和步驟這里也不做過多分析,涉及到由用戶態(tài)切換到內(nèi)核態(tài) 的步驟主要包括:
    • 從當(dāng)前進(jìn)程的描述符中提取其內(nèi)核棧的ss0及esp0信息。
    • 使用ss0和esp0指向的內(nèi)核棧將當(dāng)前進(jìn)程的cs,eip,eflags,ss,esp信息保存起來,這個(gè)過程也完成了由用戶棧到內(nèi)核棧的切換過程,同時(shí)保存了被暫停執(zhí)行的程序的下一條指令。
  • 將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應(yīng)的寄存器,開始執(zhí)行中斷處理程序,這時(shí)就轉(zhuǎn)到了內(nèi)核態(tài)的程序執(zhí)行了。

來自于百度全科

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • linux用戶態(tài)和內(nèi)核態(tài)的轉(zhuǎn)換 當(dāng)一個(gè)進(jìn)程執(zhí)行系統(tǒng)調(diào)用而執(zhí)行內(nèi)核代碼時(shí),稱進(jìn)程處于內(nèi)核 內(nèi)核態(tài),此時(shí)處理器處于特權(quán)...
    狗尾巴草敗了閱讀 1,333評(píng)論 0 3
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,311評(píng)論 0 23
  • 3.1進(jìn)程 3.1.1 在進(jìn)程執(zhí)行時(shí),任意給定一個(gè)時(shí)間,進(jìn)程都包含如下信息: 標(biāo)識(shí)符進(jìn)程id,用于區(qū)別其他進(jìn)程 狀...
    Myth52125閱讀 774評(píng)論 0 1
  • “曲欄干,深院宇,依舊春來,依舊春又去。一片殘紅無著處,綠遍天涯,綠遍天涯樹?!泵慨?dāng)看到清代吳藻的這首《蘇幕遮·曲...
    桃花勝雪閱讀 712評(píng)論 0 1
  • 今天收到了友人從家鄉(xiāng)寄來的小吃,拿到包裹便迫不及待的打開了,迫不及待的想感受那種熟悉的味道。這種感覺就像是吸毒,一...
    何同學(xué)1998閱讀 313評(píng)論 2 2

友情鏈接更多精彩內(nèi)容