linux內核詳解


一、linux的內核管理:對內核的基本認識

   我們所談到的操作系統主要指內核

wKiom1MW__OBIMrkAAJjAGg7HOU338.jpg

   以上功能據沒有涉及實現文本編輯、實現字處理,也沒有服務等等。

   故,操作系統是一種通用軟件,是平台類軟件,自己並不做任何工作,只是給其他程序提供了運行環境。除操作系統之外,還有應用程序,為實現某一目的,專門設計的程序。

 

   那么,既然內核有這么多功能,模塊化設計?各功能獨立成子系統?

   顯然將功能整合在一起,內核將變得非常復雜。

 

二、內核的設計流派

   說說內核設計的兩大流派:

wKiom1MXH4DTXj2BAADKCSiwVIw437.jpg

 

   從根本上講,將一個事情拆成各個小問題,然后每個小問題只復雜一個任務是linux的設計哲學之一。

   按道理,linux是微內核,但恰恰不是。

 

三、linux內核設計

   原因:早期設計的時沒有使用微內核的思想,linux是一步步擴展而來后來,有呼聲,要將linux改為微內核,但linus拒絕,能工作能穩定的工作,就OK,更重要的是,雖然微內核是一種優良的設計思想,但時下,他跑起來一點不比單內核高效更高級,但微內核有更優良的線程,linux則表現一般。

   但linux在一步步的發展中吸取了微內核的設計經驗,雖然是單內核,但是兼具微內核的特性。

   linux通過使用模塊化內核設計來兼具微內核特性,但這樣的模塊化設化設計並不是像微內核一樣是各個子系統,而是由核心加外圍的功能性模塊組成內核。而微內核子系統都是各自獨立運行的,不需要依賴其他部分就能工作。而linux各模塊必許依賴核心,只是能在使用時進行裝載,不用時被動態卸載。linux下的模塊外在表現為類型程序的庫文件,只是程序庫文件為.so,而內核模塊為.ko(kernel object),被內核調用。  

wKiom1MXHx7AGAkSAAD5irpadJg210.jpg

 

   假設,如果驅動是內核提供的,想象下,編譯好一個內核,裝在主機上,萬一后來發現他無法驅動我們后來新添加的新硬件設備。各種硬件都是由內核驅動的,內核沒有提供這個程序。假設我們有了驅動程序,怎樣才能讓他驅動起來,是不是從新編譯內核,這是對用戶和廠商的不幸。。。。

   模塊化設計得以避免這種情況,故各贏家廠商的以模塊化的形式開發自己的驅動,只需針對某一特定設備開發自己驅動程序的即可,而后我們編譯這些模塊即可。由於linux支持動態裝卸載模塊,因此當我需要和不需要某一功能時,可自行拆卸,並不影響核心的運行,這就是好處和優勢表現之一。

 

四、內核的基本概念

   跟各種應用程序一樣,內核也是一種應用程序,只不過,這種應用程序是直接操作硬件的。

   內核直接面對的是硬件,調用的是硬件接口,是通過個硬件廠商和CPU廠商提供的指令集進行開發。

   開發應用程序面對的是內核,系統調用,或庫調用進行的,故簡單得多。

   為編寫內核級的應用程序,又為了避免過於底層,固有很多庫文件,可以讓內核編譯時使用。

   內核是直接面向硬件的,故可用資源權限很大,但內核是工作在有限地址空間內的,在linux而言,32位系統上,線性地址空間中,內核只認為自己有1G的,雖然可以掌握4G,但是自己的運行只能使用1G,剩下的3G給其他應用程序。win是各2G。故我們開發內核時可用的內存空間很有限,尤其是開發驅動,要明白自己的可用空間很有限,故需高效。

 

五、從動態的角度看linux主機的運行狀況

   應用程序運行在內核上,只是邏輯上的情況。但實際是直接工作在硬件上的,任意應用程序數據都在內存中,數據處理都是CPU,只是他們不能隨意使用而已,要接受內核的管理。

   但CPU只有一顆,應用程序工作的時候,內核就暫停了,應用程序也在內存空間中,一旦應用程序想要訪問其他硬件資源時,即要執行I/O指令時,不能執行。

   因為應用程序看不見硬件,應用程序是基於系統調用的程序,當應用程序需要訪問硬件資源時時,就向CPU發起特權請求,一旦CPU收到特權請求,CPU就會喚醒內核,從而執行內核中的某段代碼(非完整的內核程序),然后將結果返回給應用程序,而后內核代碼退出,內核程序暫停。在這期間CPU就從用戶模式轉換成了內核模式,內核模式 就好似能夠執行特權的模式。

   所有的應用程序時在硬件上直接執行的,只是在必要時接受內核的管理和監控。

   故內核也是監控器,監控程序,是資源和進程的監控程序。

 

六、CPU的時間與內核的空間

   因為內存中每一個進程都以為直接是獨占CPU的,故內核即是將CPU虛擬化,提供給進程,CPU在內核級別就已經虛擬化了,通過將CPU切成時間片,隨着時間流逝而完成在個進程之間分派計算能力的,CPU是以時間提供其計算能力的。

   而內存是站在空間角度進行數據容納的。

   這就是所謂的時空轉換。

   在單位時間內要能夠提供的計算能力越大,必須速度越快,否則只能延長時間。這也就是我們需要更快的CPU,以節約時間。

   對於內存而言考慮的是空間問題。

 

六、CPU的運算特性

   I/O是最慢的設備,我們CPU有大量時間都拿來等待I/O完成,為避免空余的沒有任何意義的等待,需要等待時,就讓CPU運行別的進程或線程。

   我們應該最大能力榨取CPU的計算能力,因為CPU的計算能力是隨着時間時鍾頻率的振盪器在震盪,你用或者不用他都在跑。

   如果你讓CPU空閑着,他依然耗電,而且隨時間流逝,計算能力白白消逝了,因此能夠讓CPU工作在80-90%的利用率下,這就意味着他的生產能力得到了充分的發揮。CPU是用不壞的,沒有什么磨損很消耗,是電器設備,除了功率大是發熱量大,散熱足夠就好了,對於電器設備而言不用反而會壞。

 

七、從硬件看系統啟動  

   內核沒有生產力,生產力是由個被調用的應用程序產生,故我們應該盡量讓系統運行在應用程序模式中,故內核占據的時間越少越好。而內核主要在進程切換、中斷處理等相關功能上,占據時間,模式切換到目的也是為了生產完成,但進程切換與生產就沒有任何意義了,中斷處理可以認為與生產本身相關,因為應用要執行I/O

   內核的主要目的是完成硬件管理,而linux中有一個思想,各進程都是由其父進程衍生的,由父進程fork()而來的,那么由誰來fork()以及管理這些進程,於是有了大管家程序init,統籌管理用戶空間的所有進程。用戶空間的管理工作都不會由內核執行,故我們啟動完內核之后,要想啟動用戶空間首先需要啟動init,故init的PID號永遠為1。 init也是由其父進程fork()而來,是內核空間中的用來專門引導用戶空間進程的機制。init是一個應用程序,在/sbin/init下,是一個可執行文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM