linux操作系统原理_Linux内核分析-操作系统是如何工作的(二)
linux操作系統的主要構架如圖1所示,我們知道,操作系統是通過管理CPU進程、存儲器、文件系統、設備驅動、以及網絡接口等相關部分來工作的,我們這里主要是通過分析關于CPU的操作即進程的管理執行來分析linux操作系統是怎樣工作的。
圖1 linux操作系統內核結構一 linux操作系統工作的基礎
linux操作系統的正常工作可以說有三個非常重要的部分,就是我們的存儲程序原理、堆棧以及中斷的支持。
1.存儲程序計算機
我們都知道,馮.諾依曼體系結構為計算機的發展提供了不可磨滅的作用,馮.諾依曼的主要貢獻就是提出并實現了“存儲程序”的概念。
按照馮·諾依曼存儲程序的原理,計算機在執行程序時須先將要執行的相關程序和數據放入內存儲器中,在執行程序時CPU根據當前程序指針寄存器的內容取出指令并執行指令,然后再取出下一條指令并執行,如此循環下去直到程序結束指令時才停止執行。那么我們就可以將計算機的工作過程簡化成如下圖2所示。
圖2計算機基本工作原理
而我們的linux操作系統就是以存儲程序計算機的工作原理為基礎去管理整個計算機以及整個計算機的執行工作流程。
2.棧
進程是CPU執行的基本單位,每個進程都有自己獨立的內存空間,進程的內存地址空間如附錄一所示。當然我們這里要說的就是進程的用戶態的占空間以及8KB的內核棧,由于虛擬存儲技術,每個進程都感覺自己享有完整的內存空間,在這里不加贅述。
棧為我們的函數調用以及進程的切換等等提供了不可磨滅的作用。當我們進行函數調用的時,用戶態的棧會保存我們的返回地址、相關寄存器、函數參數以及局部變量等等一些相關條件;當我們進行系統調用或者其它中斷的時候,內核棧會同樣為我們保存返回地址、相關寄存器等一些相關信息,可以說棧是我們系統的正常執行必不可少的條件。
3.中斷
中斷是指當出現需要時,CPU暫時停止當前程序的執行轉而執行處理新情況的程序和執行過程。中斷技術的出現為多任務計算機提供了不可磨滅的作用,中斷使得進程能夠并發的去執行,大大提高了CPU的利用率。中斷是多進程能夠正常執行以及進程間的切換的必不可少的要素。
以上的三方面是linux操作系統正常工作管理必不可少的部分。我們知道,進程是CPU執行的單位(這里暫時不考慮線程),下面我們通過分析內核是如何管理進程來實現任務的正常進行。
二 內核工作的微觀分析
操作系統對進程的管理主要就是進程的管理和調度,我們為每個進程維護一個進程描述和以及進程間的關系。我們的內核的工作主要有兩部分組成,首先運行有一個內核線程,然后就是一些中斷處理程序的集合,我們在中斷處理程序中要就行進程的調度。下面主要分析內核是如何執行進程的切換以及調度來實現操作系統的正常執行。
如圖3所示,當前進程X在運行,當前的esp寄存器指向進程X的用戶棧,eip指向進程X的代碼區,假設進程X的時間片用完,這時候發生中斷,那么CPU要做兩件工作,1是將當前的eip和esp壓入到進程X的內核棧,2是將esp指向進程X的內核棧,并將eip指向中斷處理入口,進入到內核態。在進行SAVA_ALL即保存相關寄存器等之后,開始執行中斷處理程序,進行的切換與調度就是發生在中斷處理程序中。我們會根據相應的調度策略,選擇下一個要執行的進程Next,并切換到進程Next。這里內核是通過執行switch_to(switch_to的代碼見附錄一所示)來進行進程切換的,在switch_to中我們主要進行了進程的寄存器register和進程的內核棧stack的切換。當進程切換完以后,我們的esp就指向了進程Y的內核棧,我們可以看到,在進程Y的內核棧中保存著進程Y被掛起以前的esp以及eip,我們進程彈棧操作,那么我們現在的eip指向的就是我們進程Y的代碼區,而esp就只想進程Y的用戶棧,這樣通過esp和eip的的切換我們就切換到了進程Y繼續執行,完成了整個進程從X切換到進程Y。
圖3 中斷以及進程切換和調度
附錄一 進程的地址空間
附錄二 switch_to源代碼
#define switch_to(prev,next,last) do{ unsigned long esi,edi; asmvolatile("pushflnt" /* Saveflags */ "pushl %%ebpnt" "movl %%esp,%0nt" /* save ESP */ "movl %5,%%espnt" /* restore ESP */ "movl $1f,%1nt" /*save EIP */ "pushl %6nt" /*restore EIP */ "jmp __switch_ton" "1:t" "popl %%ebpnt" "popfl" :"=m" (prev->thread.esp),"=m"(prev->thread.eip), "=a" (last),"=S" (esi),"=D" (edi) :"m" (next->thread.esp),"m"(next->thread.eip), "2" (prev), "d" (next)); } while (0)首先恭喜您,能夠認真的閱讀到這里,如果對部分理解不太明白,建議先將文章收藏起來,然后對不清楚的知識點進行查閱,然后在進行閱讀,相應你會有更深的認知。如果您喜歡這篇文章,就點個贊或者【關注我】吧!!
總結
以上是生活随笔為你收集整理的linux操作系统原理_Linux内核分析-操作系统是如何工作的(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火锅鱼的家常做法?
- 下一篇: 石庄业琛广场有皮皮虾海鲜哪吗?