Linux內(nèi)核模式_第1頁
Linux內(nèi)核模式_第2頁
Linux內(nèi)核模式_第3頁
Linux內(nèi)核模式_第4頁
Linux內(nèi)核模式_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余4頁可下載查看

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Linux 內(nèi)核模式Linux 內(nèi)核模式Linux 內(nèi)核模式目前,操作系統(tǒng)內(nèi)核的結(jié)構(gòu)模式主要可分為整體式的單內(nèi)核模式和層次式的微內(nèi)核模式。 而 Linux0.11 是 采用了單 內(nèi)核模式。單內(nèi)核模式的主要優(yōu)點(diǎn)是內(nèi)核代碼結(jié)構(gòu)緊湊,執(zhí) 行速度快,不足之處主要是層次結(jié)構(gòu)性不強(qiáng)。在單內(nèi)核模式的系統(tǒng)中,操作系統(tǒng)所提供服務(wù)的流程為:應(yīng)用主程序使用指定的參數(shù)值執(zhí)行系統(tǒng)調(diào)用指令 (init x80),使CPU從用戶態(tài)(User Mode)切換到核心態(tài)(KernelModel),然后操作系統(tǒng)根據(jù)具體的參數(shù)值調(diào)用特定的系統(tǒng)調(diào)用服務(wù)程序,而這些服務(wù)程序則根據(jù)需要在底層的一些支持 函數(shù)以完成特定的功能。在完成了應(yīng)用程

2、序所需要的服務(wù) 后,操作系統(tǒng)又從核心態(tài)切換回應(yīng)用態(tài),返回到應(yīng)用程序中 繼續(xù)執(zhí)行后面的指令。因此概要地講,單內(nèi)核模式的內(nèi)核也 可以粗略地分為三個層次:調(diào)用服務(wù)的主程序?qū)?,?zhí)行系統(tǒng) 調(diào)用的服務(wù)層和支持系統(tǒng)調(diào)用的底層函數(shù)。2.2 Linux 內(nèi)核系統(tǒng)體系結(jié)構(gòu)Linux 內(nèi)核主要由 5 個模塊構(gòu)成,它們分別是:進(jìn)程調(diào)度模塊,內(nèi)存管理模塊,文件系統(tǒng)模塊,進(jìn)程間通信模塊和網(wǎng)絡(luò)接口模塊。進(jìn)程調(diào)度模塊用來負(fù)責(zé)控制進(jìn)程對CPU 資源的使用。 所采取的調(diào)度策略是各進(jìn)程能夠公平合理地訪問CPU,同時保證內(nèi)核能及時地執(zhí)行硬件操作。內(nèi)存管理模塊用于確保所有 進(jìn)程能夠安全地共享機(jī)器主內(nèi)存區(qū),同時,內(nèi)存管理模塊還 支持虛擬

3、內(nèi)存管理方式,使得 Linux 支持進(jìn)程使用比實(shí)際內(nèi) 存空間更多的內(nèi)存容量。并可以利用文件系統(tǒng)把暫時不用的 內(nèi)存數(shù)據(jù)塊會被交換到存儲設(shè)備上去,當(dāng)需要時再換回來。文件系統(tǒng)的模塊用于支持對外部設(shè)備的驅(qū)動和存儲。虛擬文 件系統(tǒng)模塊通過向所有的外部存儲設(shè)備提供一個通用的文 件接口,隱藏了各種硬件設(shè)備的不同細(xì)節(jié)。從而提供并支持 與其他操作系統(tǒng)兼容的多種文件系統(tǒng)格式。進(jìn)程間通信模塊 子系統(tǒng)用于支持多種進(jìn)程間的信息交換方式。網(wǎng)絡(luò)接口模塊 提供對多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持許多網(wǎng)絡(luò)硬件。這幾個模塊之間的依賴關(guān)系如下圖 由圖可以看出,所有的模塊都與進(jìn)程調(diào)度模塊存在依賴關(guān)系。因?yàn)樗鼈兌夹枰蕾囘M(jìn)程調(diào)度程序來掛起(

4、暫停 )或重新運(yùn)行它們的進(jìn)程。通常,一個模塊會在等待硬件操作期間 被掛起,而在操作作完后才繼續(xù)運(yùn)行。2.3中斷機(jī)制在使用 80x86 組成的 PC 機(jī)種,采用了兩片 8259A 可編程中斷控制芯片。每片可以管理 8 個中斷源。通過多片級聯(lián) 方式,能構(gòu)成最多管理 64個中斷向量的系統(tǒng)。在 PC/AT 系 列兼容機(jī)中,使用了兩片 8259A 芯片,共可管理 15 級中斷 向量。其級連示意圖見下面的圖。其中從芯片的 INT 引腳連 接到主芯片的 IR2 引腳上。主 8259A 芯片的端口基地址是0x20,從芯片是OxAO。在總線控制器控制下, 8259A 芯片可以處于編程狀態(tài)和操作狀態(tài)。 編程狀態(tài)是

5、 CPU 使用 INT 或 OUT 指令對 8259A芯片進(jìn)行初始化編程的狀態(tài)。一旦完成了初始化編程,芯片 即進(jìn)入操作狀態(tài),此時芯片即可隨時相應(yīng)外部設(shè)備提出的中斷請求 (IRQ0-IRQ15) 。通過中斷判優(yōu)選擇,芯片可將選中當(dāng)前最高優(yōu)先級的中斷請求作為中斷服務(wù)對象,并通過CPU引腳 INT 通知 CPU 外中斷請求的到來, CPU 響應(yīng)后,芯片 從數(shù)據(jù)總線 D7-D0 將編程設(shè)定的當(dāng)前服務(wù)對象的中斷號送出, CPU 由此獲取對應(yīng)的中斷向量值, 并執(zhí)行中斷服務(wù)程序。對于 Linux 內(nèi)核來說,中斷信號通常分為兩類:硬件Intel 公斷和軟件中斷 (異常 )。每個中斷是由 0-255 之間的一個

6、數(shù)組 來標(biāo)識。對于中斷 int0-int31 ,每個中斷的的功能由 司固定設(shè)定或者保留用, 屬于軟件中斷, 但 Intel 公司稱之為異常。因?yàn)檫@些中斷是在 CPU 執(zhí)行指令時探測到異常情況而 引起的。通常還可分為故障(Fault)和陷阱(traps)兩類。中斷,則將int32-int47 對應(yīng)于 8259A中斷控制芯片發(fā)出的硬件中斷請求int32-int255 可以由用戶自己設(shè)定。在 Linux 系統(tǒng)中 信號 IRQ0-IRQ15 ,并把程序編程發(fā)出的系統(tǒng)調(diào)用(system_call)中斷設(shè)置為 int128。2.4 系統(tǒng)定時在LinuxO.11內(nèi)核中,PC機(jī)的可編程定時芯片Intel825

7、3被設(shè)置成每隔 10ms 就發(fā)出一個時鐘中斷 (IRQ0) 信號。這個 時間節(jié)拍就是系統(tǒng)運(yùn)行的脈搏,我們稱之為 1 個系統(tǒng)滴答。因此每經(jīng)過一個滴答就會被調(diào)用一次時鐘中斷處理程序(timer_interrupt) 。該處理程序主要用來通過 jiffies 變量來累 計(jì)自系統(tǒng)啟動以來經(jīng)過的滴答數(shù)。每當(dāng)發(fā)生一次時鐘中斷該 值就增 1。然后從被中斷程序的段選擇符中取得當(dāng)前特權(quán)紀(jì)CPL 作為參數(shù)調(diào)用 do_timer() 函數(shù)。do_timer() 函數(shù)則根據(jù)特權(quán)級隊(duì)當(dāng)前進(jìn)程運(yùn)行時間做累計(jì)。如果 CPL=0 ,則表示進(jìn)程是運(yùn)行在內(nèi)核態(tài)時被中斷,因 此把進(jìn)程的內(nèi)核運(yùn)行時間統(tǒng)計(jì)值 stime 增 1 ,否則

8、把進(jìn)程用戶 態(tài)運(yùn)行時間統(tǒng)計(jì)值增 1。如果程序添加過定時器,則對定時器鏈表進(jìn)行處理。 若某個定時器時間到 (遞減后等于 0),則調(diào)用該定時器的處理函數(shù)。然后對當(dāng)前進(jìn)程運(yùn)行時間進(jìn)行處 理,把當(dāng)前進(jìn)程運(yùn)行時間減 1。如果此時當(dāng)前進(jìn)程時間片并還大于 0,表示其時間片還沒有用完, 于是就推出 do_timer()繼續(xù)運(yùn)行當(dāng)前進(jìn)程。如果此時進(jìn)程時間片已經(jīng)遞減為0,表示該進(jìn)程已經(jīng)用完了此次使用 CPU 的時間片,于是程序就會 根據(jù)被中斷程序的級別來確定進(jìn)一步處理的方法。若被中斷 的當(dāng)前進(jìn)程是工作的用戶態(tài)的 (特權(quán)級別大于 0),則 do_timer()就會調(diào)用調(diào)度程序schedule()切換到其他進(jìn)程去運(yùn)行

9、。如果被 中斷的當(dāng)前進(jìn)程工作在內(nèi)核態(tài),也即在內(nèi)核程序中運(yùn)行時被 中斷,則 do_timer() 會立即退出。因此這樣的處理方式?jīng)Q定 了 Linux 系統(tǒng)在內(nèi)核態(tài)運(yùn)行時不會被調(diào)度程序切換。內(nèi)核態(tài) 程序是不可搶占的,但當(dāng)處于用戶態(tài)程序中運(yùn)行時則是可以 被搶占的。2.5 Linux 進(jìn)程控制程序是一個可執(zhí)行的問題建,而進(jìn)程(p rocess)是 一個執(zhí)行中的程序?qū)嵗?。利用分時技術(shù),在 Linux 操作系統(tǒng)上同時 可以運(yùn)行多個進(jìn)程。 分時技術(shù)的基本原理是把 CPU 的運(yùn)行時 間劃分成一個個規(guī)定長度的時間片,讓每個進(jìn)程在一個時間 片內(nèi)運(yùn)行。當(dāng)進(jìn)程的時間片用完時系統(tǒng)就利用調(diào)度程序切換 到另一個進(jìn)程去運(yùn)行。

10、 因此實(shí)際上對于具體單個 CPU 的機(jī)器 來說某一個時刻只能運(yùn)行一個進(jìn)程。但由于每個進(jìn)程運(yùn)行的 時間片很短 (例如 15 個系統(tǒng)滴答 =150ms) ,所以表面看起來好 像所有進(jìn)程子阿同時運(yùn)行著。對于 Linux0.11 內(nèi)核來講, 系統(tǒng)最多可由 64 個進(jìn)程同時存在。除了第一個進(jìn)程是 "手工 "建立以外,其余的都是進(jìn)程使用系統(tǒng)調(diào)用 fork 創(chuàng)建的新進(jìn)程, 被創(chuàng)建的進(jìn)程成為子進(jìn)程(Child Process),創(chuàng)建者,則稱為父進(jìn)程 (parent process)。內(nèi)核程序使用進(jìn)程標(biāo)識號(p rocess ID, pid)來標(biāo)識每個進(jìn)程。進(jìn)程由可執(zhí)行的指令代碼,數(shù)據(jù)和堆棧

11、區(qū)組成。進(jìn)程中的代碼 和數(shù)據(jù)部分分別對應(yīng)一個可執(zhí)行文件中的代碼段,數(shù)據(jù)段。每個進(jìn)程只能執(zhí)行自己的代碼和訪問自己的數(shù)據(jù)及堆棧區(qū)。進(jìn)程之間相互之間的通信需要通過系統(tǒng)調(diào)用來進(jìn)行。對于只 有一個 CPU 的系統(tǒng),在某一個時刻只能有一個進(jìn)程正在運(yùn) 行。內(nèi)核通過進(jìn)程調(diào)度程序分時調(diào)度各個進(jìn)程運(yùn)行。Linux系統(tǒng)中,一個進(jìn)程可以在內(nèi)核態(tài)(Kerneo mode)或者用戶態(tài)(user mode)下執(zhí)行,因此Linux內(nèi)核堆棧和用于堆棧是分開的。用戶堆棧用于進(jìn)程在用戶態(tài)下臨時保存調(diào)用函 數(shù)的參數(shù),局部變量等數(shù)據(jù)。內(nèi)核堆棧則含有內(nèi)核程序執(zhí)行 函數(shù)調(diào)用時的信息。2.5.1 任務(wù)數(shù)據(jù)結(jié)構(gòu) 內(nèi)核程序通過進(jìn)程表對進(jìn)程進(jìn)行管

12、理,每個進(jìn)程在進(jìn)程表中占有一項(xiàng)。 在 Linux 系統(tǒng)中, 進(jìn)程表項(xiàng)是一個 task_struct任務(wù)結(jié)構(gòu)指針。任務(wù)數(shù)據(jù)結(jié)構(gòu)定義在頭文件include/linux/sched.h 中。有些書上稱其為進(jìn)程控制塊PCB(Process Control Block) 或者進(jìn)程描述符 PD(ProcessorDescriptor) 。其中保存著用于控制和管理進(jìn)程的所有信息。主要包括進(jìn)程當(dāng)前運(yùn)行的狀態(tài)信息,信號,進(jìn)程號,父進(jìn)程號,運(yùn)行時間累計(jì)值,正在使用的文件和本任務(wù)的局部描述符以及任務(wù)狀態(tài)段信息。該結(jié)構(gòu)每個字段的含義如下所示。當(dāng)一個進(jìn)程在執(zhí)行時,CPU 的所有寄存器中的值, 進(jìn)城的狀態(tài)以及堆棧中的內(nèi)容

13、被稱為該進(jìn)程的上下文。當(dāng)內(nèi)核需要切 換(switch)至另一個進(jìn)程時,它就需要保存當(dāng)前進(jìn)程的所有狀態(tài),也即保存當(dāng)前進(jìn)程的上下文, 以便在再次執(zhí)行該進(jìn)程時,能夠恢復(fù)到切換時的狀態(tài)執(zhí)行下去。在Linux 中,當(dāng)前進(jìn)程上下文均保存在進(jìn)程的任務(wù)數(shù)據(jù)結(jié)構(gòu)中。在發(fā)生中斷時,內(nèi) 核就在被中斷進(jìn)程的上下文中,在內(nèi)核狀態(tài)下執(zhí)行中斷服務(wù) 例程。但同時會保留所有需要用到的資源,以便中斷服務(wù)結(jié) 束時能恢復(fù)被中斷進(jìn)程的執(zhí)行。2.5.2 進(jìn)程運(yùn)行狀態(tài)個進(jìn)程在其生存期內(nèi),可處于一組不同的狀態(tài)下,稱為進(jìn)程狀態(tài)。見下圖 2-6 所示。進(jìn)程狀態(tài)保存在進(jìn)程任務(wù)結(jié) 狀態(tài)時,則稱奇處于睡眠等待狀態(tài)。在 Linux 系統(tǒng)中,睡眠 等待狀

14、態(tài)被分為可中斷的和不可中斷的等待狀態(tài)。構(gòu)的 state 字段中當(dāng)進(jìn)程正在等待系統(tǒng)中的資源而處于等待運(yùn)行狀態(tài) (TASK_RUNNING)當(dāng)進(jìn)程正在被 CPU 執(zhí)行,或已經(jīng)準(zhǔn)備就緒隨時可以由調(diào)度程序執(zhí)行,則稱該進(jìn)程為處于運(yùn)行狀態(tài)(running) 。進(jìn)程可 以在內(nèi)核態(tài)運(yùn)行,也可以在用戶態(tài)運(yùn)行。當(dāng)系統(tǒng)資源已經(jīng)可 用時,進(jìn)程就被喚醒而進(jìn)入準(zhǔn)備運(yùn)行狀態(tài),該狀態(tài)稱為就緒 態(tài)。這些狀態(tài)在內(nèi)核中表示方法相同,都被稱為處于TASK_RUNNING 狀態(tài)。可中斷睡眠狀態(tài) (TASK_INTERRUPTIBLE)當(dāng)進(jìn)程處于可中斷等待狀態(tài)時,系統(tǒng)不會調(diào)度該進(jìn)程執(zhí)口號,行。當(dāng)系統(tǒng)產(chǎn)生一個中斷或者釋放了進(jìn)程正在等待的資

15、源, 或者進(jìn)程收到一個信號, 都可以喚醒進(jìn)程轉(zhuǎn)換到就緒狀態(tài) ( 運(yùn) 行狀態(tài) )。不可中斷睡眠狀態(tài) (TASK_UNINTERRUPTIBLE)與可中斷睡眠狀態(tài)類似。但處于該狀態(tài)的進(jìn)程只有被使用 wake_up() 函數(shù)明確喚醒時才能被轉(zhuǎn)換到可運(yùn)行就緒狀態(tài)。暫停狀態(tài) (TASK_STOPPED)當(dāng)進(jìn)程收到信號 SIGSTOP,SIGTSTP,SIGTTIN 或SIGTTOU 時就會進(jìn)入暫停狀態(tài)。 可向其發(fā)送 SIGCONT 信號 狀態(tài)的轉(zhuǎn)換處理。處于該狀態(tài)的進(jìn)程將被作為進(jìn)程終止來處 理。讓進(jìn)程轉(zhuǎn)換到可運(yùn)行狀態(tài)。在 Linux0.11中,還為實(shí)現(xiàn)對該僵死狀態(tài) (TASK_ZOMBIE)當(dāng)進(jìn)程已停止運(yùn)行,但其父進(jìn)程還沒有詢問其狀態(tài)時,則稱該進(jìn)城處于僵死狀態(tài)。當(dāng)一個進(jìn)程的運(yùn)行時間片用完,系統(tǒng)就會使用調(diào)度程序強(qiáng)制 切換到其他的進(jìn)程去執(zhí)行。另外,如果進(jìn)程在內(nèi)核態(tài)執(zhí)行時 需要等待系統(tǒng)的某個資源,此時該進(jìn)城就會調(diào)用 sleep_on()或者 sleep_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論