用戶代碼操作系統代碼是如何在CPU上面運行的(用戶態和內核態)

      網友投稿 1779 2022-05-28

      目錄

      1.CPU的四種狀態與操作系統的兩種狀態(用戶態和內核態)

      2.操作系統的用戶態和內核態之間的切換

      3.操作系統的用戶態切換到內核態的四種情況

      4.用戶代碼和操作系統代碼是如何在cup上面運行的

      4.1

      操作系統運行用戶程序?

      4.2

      為什么同是代碼,操作系統程序會比一般程序擁有更高的權限?

      4.3

      代碼是如何成為操作系統的?

      4.4

      現代的計算機CPU是如何加載操作系統代碼的?

      1.CPU的四種狀態與操作系統的兩種狀態(用戶態和內核態)

      首先我們要知道CPU有四種狀態,分別為編號為0(特權最大)到3(特權最小),以及3個受保護的主要資源:內存、I/O端口和執行某些機器指令的能力。

      操作系統它基于CPU之上,只用到了CPU的兩種狀態,一個內核態,一個用戶態,內核態運行在CPU的第 0 等級,用戶態運行在CPU的第 3 等級。

      2.操作系統的用戶態和內核態之間的切換

      首先內核態與用戶態是操作系統的兩種運行級別,跟intel cpu沒有必然的聯系, intel cpu提供Ring0-Ring3三種級別的運行模式,Ring0級別最高,Ring3最低。

      其次Linux使用了Ring3級別運行用戶態,Ring0作為 內核態,沒有使用Ring1和Ring2。Ring3狀態不能訪問Ring0的地址空間(這里存放在整個內核的代碼和所有的內核模塊,以及內核所維護的數據)。

      然后用戶運行一個程序,該程序所創建的進程開始是運行在用戶態的,如果要執行文件操作,網絡數據發送等操作,必須通過write,send等系統調用(

      比如netty和redis中對于多路復用select和poll的改進epoll也需要切換到內核態

      ),這些系統調用會調用內核中的代碼來完成操作,這時,必須切換到Ring0,然后進入內核地址空間去執行這些代碼完成操作,完成后,切換回Ring3,回到用戶態。這樣,用戶態的程序就不能隨意操作內核地址空間,具有一定的安全保護作用。

      最后至于說保護模式,是說通過內存頁表操作等機制,保證進程間的地址空間不會互相沖突,一個進程的操作不會修改另一個進程的地址空間中的數據。

      3.操作系統的用戶態切換到內核態的四種情況

      用戶代碼和操作系統代碼是如何在CPU上面運行的(用戶態和內核態)

      系統調用

      這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程通過系統調用申請使用操作系統提供的服務程序完成工作,比如x86里的call gate也可以用來做系統調用,也能做到權限控制和內核代碼保護,跟中斷的效果完全一樣,

      硬中斷

      當外圍設備完成用戶請求的操作后,會向 CPU 發出相應的中斷信號,這時 CPU 會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,如果先前執行的指令是用戶態下的程序,那么這個轉換的過程自然也就發生了由用戶態到內核態的切換。比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行后續操作等。該中斷可被屏蔽。

      從本質上講,中斷(硬)是一種電信號,當設備有某種事情發生的時候,他就會產生中斷,通過總線把電信號發送給中斷控制器。如果中斷的線是激活的(與邏輯門的另外一邊設置的是高電平,如果是低電平就進行了屏蔽),中斷控制器就把電信號發送給處理器的某個特定引腳。處理器于是立即停止自己正在做的事,跳到中斷處理程序的入口點,進行中斷處理。

      軟中斷(softIRQ)

      軟中斷(softIRQ)的一種典型應用就是所謂的"下半部"(bottom half),它的得名來自于將硬件中斷處理分離成"上半部"和"下半部"兩個階段的機制:上半部在屏蔽中斷的上下文中運行,用于完成關鍵性的處理動作;而下半部則相對來說并不是非常緊急的,通常還是比較耗時的,因此由系統自行安排運行時機,不在中斷服務上下文中執行。

      在系統調用的時候,也可以用軟中斷的方式實現,比如 fork() 實際上就是執行了一個創建新進程的系統調用。而系統調用的機制其核心還是使用了操作系統為用戶特別開放的一個中斷來實現,例如 Linux 的 int 80h 中斷。該中斷不可被屏蔽。

      異常

      當 CPU 在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換到處理此異常的內核相關程序中,也就轉到了內核態,比如缺頁異常。

      首先明確下什么是缺頁異常,CPU通過地址總線可以訪問連接在地址總線上的所有外設,包括物理內存、IO設備等等,但從CPU發出的訪問地址并非是這些外設在地址總線上的物理地址,而是一個虛擬地址,由MMU將虛擬地址轉換成物理地址再從地址總線上發出,MMU上的這種虛擬地址和物理地址的轉換關系是需要創建的,并且MMU還可以設置這個物理頁是否可以進行寫操作,當沒有創建一個虛擬地址到物理地址的映射,或者創建了這樣的映射,但那個物理頁不可寫的時候,MMU將會通知CPU產生了一個缺頁異常。

      下面總結下缺頁異常的幾種情況:

      1、當MMU中確實沒有創建虛擬頁物理頁映射關系,并且在該虛擬地址之后再沒有當前進程的線性區vma的時候,可以肯定這是一個編碼錯誤,這將殺掉該進程;

      2、當MMU中確實沒有創建虛擬頁物理頁映射關系,并且在該虛擬地址之后存在當前進程的線性區vma的時候,這很可能是缺頁異常,并且可能是棧溢出導致的缺頁異常;

      3、當使用malloc/mmap等希望訪問物理空間的庫函數/系統調用后,由于linux并未真正給新創建的vma映射物理頁,此時若先進行寫操作,將如上面的2的情況產生缺頁異常,若先進行讀操作雖也會產生缺頁異常,將被映射給默認的零頁(zero_pfn),等再進行寫操作時,仍會產生缺頁異常,這次必須分配物理頁了,進入寫時復制的流程;

      4、當使用fork等系統調用創建子進程時,子進程不論有無自己的vma,“它的”vma都有對于物理頁的映射,但它們共同映射的這些物理頁屬性為只讀,即linux并未給子進程真正分配物理頁,當父子進程任何一方要寫相應物理頁時,導致缺頁異常的寫時復制。

      4.用戶代碼和操作系統代碼是如何在cup上面運行的

      計算機的代碼,都是機器碼,都由CPU一條一條地執行的,無論是應用程序的代碼,還是操作系統的代碼,都是機器碼,CPU都用一樣的方法來執行,這個問題和內核態還是用戶態無關。所以,沒有“操作系統運行用戶程序”的說法。所有的軟件指令,都被CPU用一樣的方法執行。

      權限是CPU制造的,CPU只要能保證權限的穿越是單向的,就可以賦予操作系統(的代碼)特殊的權限。比如ARM64 CPU啟動的時候,(在特定的設計下),工作在權限EL1,這時開始執行的代碼就是操作系統的代碼了,操作系統執行夠了以后,主動把CPU權限降低到EL0(EL1的時候你有權降級,但反過來你就沒有權利),這之后執行的代碼就在所謂的“用戶態"了,由于CPU工作在EL0狀態,這些代碼的權限就很低,這時如果你執行一個權限比較高的指令(比如訪問SCTLR_EL1.A寄存器,又比如x86的int,ARM的SC),CPU就會報錯(報錯的結果是把權限切換回EL1,并且直接調用操作系統設置好的代碼,這樣控制權仍是操作系統的),把用戶程序的控制權強行取走,賦予給操作系統,這就是為什么操作系統(表現出來)比用戶程序擁有更高的權限。

      所謂操作系統,用戶程序,系統服務,都是我們基于CPU權限人為制造的概念,并非必須存在的客觀實體。

      CPU開始加電了,完成內部必要的處理后,就可以從指定的內存地址開始執行代碼,這個內存地址稱為Reset向量,在一些CPU上是固定的,在一些CPU上是可以根據特定的條件變化的(比如把CPU連入電路的時候,給某個引腳加高電平等),但無論如何,反正最終CPU會在某個固定的位置開始執行程序。什么代碼放在這里,什么代碼就具有最高的執行權限。

      在DOS+x86的時代,硬件設計者會在這個內存位置上固定焊一個ROM,然后在計算機出廠的時候,固定在這個ROM上燒一段程序,這個程序就稱為BIOS,所以,CPU加電后,首先進入的是BIOS程序,然后有BIOS程序根據你是否有磁盤,從磁盤的指定位置上讀入代碼來執行。

      所以你要成為操作系統,你就要把你的代碼放到磁盤的指定位置,這樣這個代碼就會具備“操作系統”的控制權。

      現代更復雜的計算機,硬件加電的時候,根本還沒有給主CPU加電,而是某個MCU(小CPU)首先獲得系統的控制權,這個MCU就可以直接設置固定的內存內的內容,讓CPU到時執行這段代碼,這樣,其實真正具有系統的把控權的是這個MCU,它的代碼才是系統的“固件”。

      如果是多核CPU,CPU加電的時候僅啟動一個核,完成前期的大部分初始化(比如安全操作系統和虛擬機調度器的初始化),然后進入EL1,完成主CPU的初始化,在這個主CPU初始化的時候,準備其他CPU的Reset向量的內容,完成準備后,控制硬件給其他CPU加電,這樣其他CPU也在操作系統的控制下投入運行。整個系統就都在控制之下了。

      Linux 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:電腦中毒,文件夾都變成exe文件怎么辦?
      下一篇:利用QEMU+GDB搭建Linux內核調試環境
      相關文章
      亚洲AV日韩精品一区二区三区| 大桥未久亚洲无av码在线| 亚洲精品成人区在线观看| 亚洲综合校园春色| 亚洲国产精品综合久久2007| 亚洲精品综合久久中文字幕| 亚洲综合一区二区精品导航| 亚洲无删减国产精品一区| 亚洲AV无码一区二区三区DV| 亚洲国产第一站精品蜜芽| 亚洲AV无码一区二区乱孑伦AS| 亚洲精品夜夜夜妓女网| 亚洲精品无码久久千人斩| 亚洲色婷婷六月亚洲婷婷6月| 国产亚洲精aa成人网站| 亚洲理论电影在线观看| 亚洲成A人片在线观看无码不卡| 久久久久久久综合日本亚洲| 亚洲国产精品无码久久久不卡| 亚洲欧洲成人精品香蕉网| 国产精品亚洲片在线| 亚洲AV无码一区东京热| 亚洲人成在线观看| 亚洲高清在线mv| 亚洲av永久综合在线观看尤物| 四虎亚洲精品高清在线观看| 亚洲精品无码不卡在线播放| 日韩成人精品日本亚洲| 亚洲成年看片在线观看| 久久久久一级精品亚洲国产成人综合AV区 | 亚洲youwu永久无码精品| 亚洲av无码成人影院一区| 国产成人亚洲精品电影| 国产亚洲精品无码专区| 亚洲an天堂an在线观看| 亚洲日本国产乱码va在线观看| 亚洲sss综合天堂久久久| 亚洲乱码国产乱码精华| 亚洲国产精品尤物yw在线| 亚洲色中文字幕无码AV| 老色鬼久久亚洲AV综合|