理解Linux內(nèi)核最好預(yù)備的知識點(diǎn)
Linux內(nèi)核的特點(diǎn)
Linux內(nèi)核的任務(wù)
內(nèi)核的組成部分
哪些地方用到了內(nèi)核機(jī)制?
Linux進(jìn)程
Linux創(chuàng)建新進(jìn)程的機(jī)制
Linux線程
內(nèi)核線程
地址空間與特權(quán)級別
虛擬地址與物理地址
特權(quán)級別(Linux的兩種狀態(tài))
系統(tǒng)調(diào)用
設(shè)備驅(qū)動程序、塊設(shè)備和字符設(shè)備
網(wǎng)絡(luò)
文件系統(tǒng)
模塊和熱插拔
注:本文為《深入Linux內(nèi)核架構(gòu)》 的學(xué)習(xí)筆記
理解Linux內(nèi)核最好預(yù)備的知識點(diǎn):
Linux內(nèi)核的特點(diǎn):
結(jié)合了unix操作系統(tǒng)的一些基礎(chǔ)概念
Linux內(nèi)核的任務(wù):
1.從技術(shù)層面講,內(nèi)核是硬件與軟件之間的一個中間層。作用是將應(yīng)用層序的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動程序,對系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。
2.從應(yīng)用程序的層面講,應(yīng)用程序與硬件沒有聯(lián)系,只與內(nèi)核有聯(lián)系,內(nèi)核是應(yīng)用程序知道的層次中的最底層。在實(shí)際工作中內(nèi)核抽象了相關(guān)細(xì)節(jié)。
3.內(nèi)核是一個資源管理程序。負(fù)責(zé)將可用的共享資源(CPU時(shí)間、磁盤空間、網(wǎng)絡(luò)連接等)分配得到各個系統(tǒng)進(jìn)程。
4.內(nèi)核就像一個庫,提供了一組面向系統(tǒng)的命令。系統(tǒng)調(diào)用對于應(yīng)用程序來說,就像調(diào)用普通函數(shù)一樣。
內(nèi)核實(shí)現(xiàn)策略:
1.微內(nèi)核。最基本的功能由中央內(nèi)核(微內(nèi)核)實(shí)現(xiàn)。所有其他的功能都委托給一些獨(dú)立進(jìn)程,這些進(jìn)程通過明確定義的通信接口與中心內(nèi)核通信。
2.宏內(nèi)核。內(nèi)核的所有代碼linux命令,包括子系統(tǒng)(如內(nèi)存管理、文件管理、設(shè)備驅(qū)動程序)都打包到一個文件中。內(nèi)核中的每一個函數(shù)都可以訪問到內(nèi)核中所有其他部分。目前支持模塊的動態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個策略實(shí)現(xiàn)的。
內(nèi)核的組成部分:
1.用戶空間(在“地址空間與特權(quán)級別”小節(jié)會詳細(xì)介紹):
應(yīng)用程序:
C庫
2.內(nèi)核空間(在“地址空間與特權(quán)級別”小節(jié)會詳細(xì)介紹):
核心內(nèi)核
設(shè)備驅(qū)動程序
硬件
詳細(xì)可參考圖1
特點(diǎn):
1.不與任何特定的用戶空間進(jìn)程相關(guān)聯(lián)。
2.與中斷上下文運(yùn)轉(zhuǎn)的內(nèi)核相比,內(nèi)核線程可以進(jìn)入睡眠狀態(tài),也可以像系統(tǒng)中的普通進(jìn)程一樣被調(diào)度器跟蹤。
用途:
1.從內(nèi)存和塊設(shè)備之間的數(shù)據(jù)同步。
2.幫助調(diào)度器在CPU上分配進(jìn)程。
如何查看內(nèi)核線程:
命令:ps fax 方括號內(nèi)的就是內(nèi)核線程。
地址空間與特權(quán)級別
在正式介紹之前先介紹幾個單位:
KiB 2^10字節(jié)
MiB 2^20
GiB 2^30
虛擬地址與物理地址:
虛擬地址:在計(jì)算機(jī)的專用術(shù)語中是指標(biāo)識一個虛擬(非物理地址)的實(shí)體地址。
物理地址:切切實(shí)實(shí)存在的地址。在存儲器里以字節(jié)為單位存儲信息,為正確地存放或取得信息,每一個字節(jié)單元給以一個唯一的存儲器地址,稱為物理地址。
映射關(guān)系:
用頁表為物理地址分配虛擬地址
注意:未必虛擬地址的所有頁都映射到某個頁幀。
原因:
1.頁沒有內(nèi)存可以使用
2.數(shù)據(jù)尚不需要使用而沒有載入內(nèi)存。
3.頁已經(jīng)換出硬盤,需要時(shí)再換回內(nèi)存。
頁幀:物理內(nèi)存頁
頁:專指虛擬地址空間中的頁。
頁表:將虛擬地址空間映射到物理地址空間的數(shù)據(jù)結(jié)構(gòu)。
多級分頁:建立虛擬地址到物理地址映射的一種方法,能有效減少內(nèi)存用量。
CPU加速內(nèi)存的訪問過程,方法:
1.MMU(Memory Management Unit)內(nèi)存管理單元
2.TLB(Translation Lookaside Buffer)地址轉(zhuǎn)換后備緩沖器
IA-32位結(jié)構(gòu)的CPU只需要使用二級頁表,Linux內(nèi)核總是使用四級頁表,剩余部分由內(nèi)核通過控頁表對缺少的頁表進(jìn)行仿真。
概念注意:
1.CPU的字長決定了所能管理的地址空間的最大長度。對于32位系統(tǒng)是2^32 B = 4GiB
2.虛擬地址空間:地址空間的最大長度與實(shí)際可用的物理內(nèi)存的數(shù)量無關(guān)。
虛擬地址空間劃分為兩個部分:
內(nèi)核空間
用戶空間
如圖2所示:
圖2%20虛擬內(nèi)存的劃分
有個等價(jià)名稱值得一提:
用戶層:指應(yīng)用程序本身。指不屬于內(nèi)核的東西。
用戶空間:不僅可以表示應(yīng)用程序,還指代應(yīng)用程序所運(yùn)行的虛擬地址空間的一部分。與內(nèi)核空間相對。
注意:每一個進(jìn)程都有上述獨(dú)立的虛擬地址空間。對于圖2所示,每個進(jìn)程有4GiB的內(nèi)存空間。
Linux有兩種狀態(tài),兩種狀態(tài)代表兩種特權(quán)級別:
核心態(tài):在虛擬地址的內(nèi)核空間運(yùn)行的狀態(tài)。
用戶狀態(tài):在虛擬地址的用戶空間運(yùn)行的狀態(tài)。
注意:在用戶狀態(tài)禁止訪問內(nèi)核空間
這兩種狀態(tài)的差別在于:對高于TASK_SIZE的內(nèi)存區(qū)域的訪問。
定義:從用戶狀態(tài)到核心態(tài)的切換通過系統(tǒng)調(diào)用的特定手段完成。
方法:
1.內(nèi)核代表用戶程序執(zhí)行代碼
2.異步硬件中斷激活,然后在中斷上下文中進(jìn)行。注意:在中斷上下文運(yùn)行時(shí),內(nèi)核不能進(jìn)入睡眠狀態(tài)。
注意:
內(nèi)核空間中的代碼可以對硬件執(zhí)行一些底層操作并訪問所有的虛擬和物理內(nèi)存,而用戶空間中的代碼則由于cpu的安全邊界控制,無法訪問所有內(nèi)存。平時(shí)我們調(diào)用recv函數(shù)會將網(wǎng)絡(luò)i/o數(shù)據(jù)拷貝到定義的用戶緩沖區(qū)內(nèi)linux命令,這樣就會在內(nèi)核空間和用戶空間之間進(jìn)行數(shù)據(jù)拷貝,這樣就會導(dǎo)致進(jìn)程再內(nèi)核態(tài)和用戶態(tài)之間進(jìn)行頻繁轉(zhuǎn)換,降低效率。假設(shè)用戶代碼調(diào)用write()這個系統(tǒng)調(diào)用,此時(shí)控制流轉(zhuǎn)到了內(nèi)核空間即cpu開始執(zhí)行內(nèi)核空間的代碼,同時(shí)cpu運(yùn)行狀態(tài)也進(jìn)入了內(nèi)核態(tài)。