設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)_第1頁(yè)
設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)_第2頁(yè)
設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)_第3頁(yè)
設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)_第4頁(yè)
設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)13.3.2 設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn) 塊設(shè)備驅(qū)動(dòng)程序軟件。MINIX在頭文件driver.h中定義了塊設(shè)備驅(qū)動(dòng)程序需要用到的結(jié)構(gòu)定義,它們包括:driver結(jié)構(gòu):保存各驅(qū)動(dòng)程序執(zhí)行I/O操作所需調(diào)用函數(shù)的地址;13.3.2 設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn) 驅(qū)動(dòng)程序庫(kù)可移植性是在MINIX中得到了相當(dāng)?shù)闹匾?,MINIX的目標(biāo)是當(dāng)它被移植到一臺(tái)機(jī)器上時(shí),應(yīng)該能夠使用這臺(tái)機(jī)器上原先運(yùn)行的操作系統(tǒng)采用的分區(qū)表格式。在IBM兼容機(jī)上,硬盤分區(qū)的標(biāo)準(zhǔn)由MS-DOS的fdisk命令確定。MINIX包含了支持IBM兼容機(jī)分區(qū)的源代碼,為了方便移植,這些與平臺(tái)有關(guān)但是與具體硬件無(wú)關(guān)的代碼沒(méi)有被放在driver.

2、c文件中,而是單獨(dú)的放在drvlib.h和drvlib.c文件中。13.3.2 設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn) RAM盤在MINIX中存在一個(gè)RAM盤的概念,簡(jiǎn)而言之就是保存一局部?jī)?nèi)存作為磁盤來(lái)使用,對(duì)于用戶來(lái)說(shuō),它就像一個(gè)磁盤一樣。RAM盤的驅(qū)動(dòng)程序?qū)嶋H上由四個(gè)緊密聯(lián)系的局部組成,也就是具有以下四個(gè)次設(shè)備:0:/dev/ram:真正的RAM盤,它的大小和基址在MINIX啟動(dòng)時(shí)由FS確定;1:/dev/mem:用于讀寫物理內(nèi)存,通常讀出的是起始于內(nèi)存零地址的內(nèi)容,寫操作那么會(huì)改寫中斷向量;2:/dev/kmem:用于讀寫內(nèi)核內(nèi)存,與1的功能類似;3:/dev/null:負(fù)責(zé)接收數(shù)據(jù)并把數(shù)據(jù)拋棄掉。13.3

3、.2 設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)2MINIX的系統(tǒng)任務(wù)MINIX中將文件管理和內(nèi)存管理摒棄在內(nèi)核之外,禁止它們把信息寫入內(nèi)核.所以,如果內(nèi)存管理系統(tǒng)想把消息通知給內(nèi)核時(shí),就需要借助于一個(gè)第三者對(duì)內(nèi)核表?yè)碛写嫒?quán)的內(nèi)核任務(wù)的幫助,這個(gè)任務(wù)一般被稱之為系統(tǒng)任務(wù)。系統(tǒng)任務(wù)和I/O任務(wù)十分類似,它們都實(shí)現(xiàn)了一個(gè)接口,具有相同的權(quán)限,都被鏈入內(nèi)核中,所不同的僅僅是系統(tǒng)任務(wù)不控制具體I/O設(shè)備,它所效勞的對(duì)象是系統(tǒng)中大局部的內(nèi)部組件。 13.3.2 設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)系統(tǒng)任務(wù)的18種消息: 13.4 內(nèi)存管理 13.4.1內(nèi)存管理概述由于MINIX是專門設(shè)計(jì)在IBM兼容機(jī)等微型機(jī)上運(yùn)行的操作系統(tǒng),因此它的內(nèi)存管理

4、(MM)是比較簡(jiǎn)單的,不分頁(yè),也不交換:MM保存一張按照地址順序排列的空閑地址列表,當(dāng)系統(tǒng)調(diào)用FORK和EXEC請(qǐng)求內(nèi)存時(shí),MM利用首次適配算法找到一塊足夠大的空閑內(nèi)存分配給程序使用。而一旦程序裝入內(nèi)存那么一直在原位置運(yùn)行到結(jié)束。可以說(shuō),內(nèi)存管理的主要工作就是操作進(jìn)程表和空閑地址列表這兩張表格,以及處理系統(tǒng)調(diào)用FORK和EXEC。13.4.1內(nèi)存管理概述1內(nèi)存的消息處理和I/O相仿,MM在系統(tǒng)初始化以后進(jìn)入自己的主循環(huán),等待消息,一旦收到消息就進(jìn)行處理并發(fā)送應(yīng)答消息。13.4.1內(nèi)存管理概述與MM通信的消息類型、入口參數(shù)和應(yīng)答: 13.4.1內(nèi)存管理概述2系統(tǒng)調(diào)用下面我們來(lái)看看系統(tǒng)調(diào)用FORK

5、、EXEC和BRK的處理過(guò)程。 FORK。執(zhí)行FORK的過(guò)程很簡(jiǎn)單,收到FORK調(diào)用的請(qǐng)求后,MM就檢查進(jìn)程表中是否存在空閑位置,如果存在,就嘗試為新建立的子進(jìn)程分配內(nèi)存,隨后就將內(nèi)存地址等信息填入一個(gè)空閑的進(jìn)程表項(xiàng),最后發(fā)出通知公布建立了一個(gè)新進(jìn)程。進(jìn)程的終止那么更復(fù)雜一些,當(dāng)進(jìn)程自己退出或被信號(hào)殺死并且被父進(jìn)程通過(guò)WAIT調(diào)用觀察到以后,該進(jìn)程才會(huì)真正被刪除,如果第二個(gè)條件沒(méi)有滿足,子進(jìn)程就會(huì)被掛起,這種狀態(tài)在MINIX中稱為“僵死。13.4.1內(nèi)存管理概述 EXEC。這個(gè)調(diào)用負(fù)責(zé)內(nèi)存映像的更新,包括設(shè)置新堆棧,它也是MINIX中最復(fù)雜的系統(tǒng)調(diào)用。EXEC的復(fù)雜主要是由兩個(gè)方面的因素決定的

6、:次數(shù)眾多的檢測(cè):EXEC執(zhí)行時(shí)十分謹(jǐn)慎,為了保證有足夠內(nèi)存容納新映像,必須進(jìn)行檢測(cè)。設(shè)置初始堆棧:我們通常用庫(kù)函數(shù)execve來(lái)調(diào)用EXEC,這個(gè)函數(shù)包含三個(gè)參數(shù):被執(zhí)行文件名的地址指針;一個(gè)指針數(shù)組的地址指針,數(shù)組中的元素分別指向一個(gè)參數(shù);第三個(gè)參數(shù)同樣是一個(gè)指針數(shù)組的地址指針。13.4.1內(nèi)存管理概述 BRK。BRK調(diào)用可以調(diào)整數(shù)據(jù)段的上限。有兩個(gè)過(guò)程都可以調(diào)用BRK:brk過(guò)程以數(shù)據(jù)段的絕對(duì)長(zhǎng)度為參數(shù);sbrk以當(dāng)前長(zhǎng)度的增量為參數(shù),計(jì)算出絕對(duì)長(zhǎng)度后調(diào)用BRK。執(zhí)行BRK所完成的工作就是檢查地址空間是否夠用,并根據(jù)情況調(diào)整表格,然后通知內(nèi)核。13.4.1內(nèi)存管理概述 3. 內(nèi)存數(shù)據(jù)結(jié)構(gòu)

7、主要了解兩個(gè)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu):進(jìn)程表和空閑表。 進(jìn)程表。MINIX中,內(nèi)核、FS和MM都擁有各自的進(jìn)程表,每局部的進(jìn)程表包含本局部必需的域,同時(shí),三張進(jìn)程表是對(duì)應(yīng)的,也就是說(shuō),三張表的第n個(gè)表項(xiàng)指的都是同一個(gè)進(jìn)程。也正是由于這個(gè)原因,三張表必須被同步更新。 空閑表。定義在alloc.h文件中的空閑表按照內(nèi)存地址遞增的順序列出空閑塊??臻e表的表項(xiàng)主要包含三個(gè)域:空閑塊組的基地址、空閑塊組的大小及指向下一個(gè)空閑塊組的指針。表項(xiàng)以單向鏈表的形式鏈接。13.4.2 實(shí)現(xiàn)1. 頭文件與主程序MM中的table.c文件的主要作用是為全局變量效勞,在table.c被編譯時(shí),它會(huì)自動(dòng)為下面將介紹到的一些全局變量

8、保存存儲(chǔ)空間。內(nèi)存管理局部有許多自己使用的頭文件,這些頭文件有的和其它局部的頭文件具有相同的名字,但由于它們位于不同的目錄下為不同的局部效勞,所以編譯使用時(shí)不會(huì)出現(xiàn)錯(cuò)誤。13.4.2 實(shí)現(xiàn) 頭文件。在內(nèi)存管理器MM中存在著一個(gè)私有的頭文件mm.h,可以將它理解為MM范圍內(nèi)的主控頭文件,它囊括了位于/usr/include及其子目錄中的所有頭文件,以及/kernel/kernel.h中包含的大局部頭文件。MM中每個(gè)文件的編譯都需要引用mm.h。 主程序。MM的主程序也位于main.c中,執(zhí)行的過(guò)程和I/O任務(wù)的主程序類似。首先調(diào)用mm_init,mm_init通過(guò)過(guò)程sys_getmap來(lái)獲得內(nèi)

9、核的內(nèi)存使用信息,為所有第二層及第三層的進(jìn)程初始化進(jìn)程表項(xiàng),同時(shí)也為init進(jìn)程初始化進(jìn)程表項(xiàng)。 13.4.2 實(shí)現(xiàn)2. 系統(tǒng)調(diào)用的實(shí)現(xiàn) FORK。FORK調(diào)用由文件forkexit.c中的do_fork過(guò)程來(lái)實(shí)現(xiàn)。 EXIT。由過(guò)程do_mm_exit接收調(diào)用,然后具體工作交由mm_exit完成。 WAIT。WAIT和WAITPID調(diào)用都由過(guò)程do_waitpid完成。 EXEC。過(guò)程do_exec負(fù)責(zé)執(zhí)行本調(diào)用。 BRK。BRK調(diào)用的處理代碼位于break.c中,由過(guò)程do_brk完成。 13.4.2 實(shí)現(xiàn)3.信號(hào)處理的實(shí)現(xiàn)MINIX中所有信號(hào)及與信號(hào)有關(guān)的系統(tǒng)調(diào)用都被包含在文件signa

10、l.c中,具體功能如下所示:ALARM:經(jīng)過(guò)一段時(shí)間后向自己發(fā)送ALARM消息;KILL:給別的進(jìn)程發(fā)出信號(hào)指示其下一步的動(dòng)作;PAUSE:在收到下一個(gè)信號(hào)前掛起自己;REBOOT:發(fā)出信號(hào)終止所有的進(jìn)程;SIGACTION:改變調(diào)用進(jìn)程對(duì)將來(lái)收到信號(hào)的響應(yīng)方式;SIGPROCMASK:改變阻塞信號(hào)的集合;SIGSUSPEND:改變阻塞信號(hào)集合后執(zhí)行PAUSE調(diào)用;SIGPENDING:對(duì)未處理的阻塞信號(hào)進(jìn)行檢查;SIGRETURN:處理完信號(hào)后進(jìn)行清理工作。13.4.2 實(shí)現(xiàn)4其它的系統(tǒng)調(diào)用 MM還有幾個(gè)很簡(jiǎn)單但是又必需的系統(tǒng)調(diào)用,MINIX把它們單獨(dú)放在一個(gè)文件getset.c中,由過(guò)程d

11、o_getset執(zhí)行:GETUID:返回有效的用戶標(biāo)號(hào);GETGID:返回有效的分組號(hào);GETPID:返回父子進(jìn)程的進(jìn)程號(hào);SETUID:設(shè)置調(diào)用者有效的用戶號(hào);SETGID:設(shè)置調(diào)用者的有效分組號(hào);SETSID:創(chuàng)立新的會(huì)話并返回進(jìn)程號(hào);GETPGRP:返回進(jìn)程的分組標(biāo)識(shí)。13.5 文件系統(tǒng) 13.5.1文件系統(tǒng)概述 MINIX文件系統(tǒng)(FS)的功能包括兩個(gè)方面的內(nèi)容:站在用戶的角度,文件系統(tǒng)使得用戶可以知道文件由什么組成、如何命名以及可以怎樣操作文件??梢岳斫鉃槲募到y(tǒng)為用戶和文件間提供了一個(gè)接口。從系統(tǒng)的角度來(lái)考慮,文件系統(tǒng)的功能包括:決定以怎樣的方式存儲(chǔ)文件和目錄,包括分配空間和釋放空

12、間的過(guò)程;管理磁盤空間,比方是以鏈接表或是以位圖的方式記錄空閑存儲(chǔ)空間等等。本節(jié)中將詳細(xì)介紹以上這些功能怎樣實(shí)現(xiàn)。13.5.1文件系統(tǒng)概述1.消息MINIX文件系統(tǒng)接收的消息種類比較多,一共有39種,其中兩個(gè)是異常消息。其中以下圖列出的前面31種來(lái)自用戶進(jìn)程。后面6種來(lái)自系統(tǒng)調(diào)用,它們由MM先處理,然后調(diào)用FS完成其余工作。 13.5.1文件系統(tǒng)概述13.5.1文件系統(tǒng)概述13.5.1文件系統(tǒng)概述2. i節(jié)點(diǎn)和位圖在MINIX里為了改進(jìn)順序讀取文件時(shí)的性能,要確保同一文件的所有磁盤塊都位于同一個(gè)柱面上,為此引入了區(qū)段的概念,一個(gè)區(qū)段包含了多個(gè)塊。MINIX中為每個(gè)文件建立了一個(gè)索引表,表中存儲(chǔ)

13、了文件屬性和各個(gè)塊在磁盤上的地址,這個(gè)索引表被稱為i節(jié)點(diǎn)。MINIX使用位圖來(lái)記錄空閑的i節(jié)點(diǎn)和區(qū)段,保存位圖的磁盤塊被稱為位圖塊。當(dāng)創(chuàng)立一個(gè)文件時(shí),F(xiàn)S在位圖塊中查找第一個(gè)空閑的i節(jié)點(diǎn),在這個(gè)i節(jié)點(diǎn)被分配后,就修改指針指向下一個(gè)節(jié)點(diǎn)。 13.5.1文件系統(tǒng)概述3. 目錄管理目錄管理是文件系統(tǒng)的一個(gè)重要功能,我們查找一個(gè)文件,實(shí)際上就是先在目錄樹中找到文件名,然后通過(guò)對(duì)應(yīng)的i節(jié)點(diǎn)在磁盤上找到文件數(shù)據(jù)。 目錄查找過(guò)程: 13.5.1文件系統(tǒng)概述4管道和設(shè)備文件管道和設(shè)備文件與普通文件的最大不同在于,普通文件的操作通常很快就能完成,而管道有時(shí)那么需要等待幾個(gè)小時(shí)才能有進(jìn)程把數(shù)據(jù)寫進(jìn)來(lái)。而調(diào)用設(shè)備文

14、件的進(jìn)程,為了等待終端或其它設(shè)備上的I/O,時(shí)間也是不能確定的。 FS通過(guò)不發(fā)送信號(hào)的方式使得等待應(yīng)答信號(hào)的調(diào)用進(jìn)程被阻塞,一旦有別的進(jìn)程修改了管道的狀態(tài)使得被掛起的進(jìn)程可以運(yùn)行,F(xiàn)S就會(huì)設(shè)置一個(gè)標(biāo)志。到下一次主循環(huán)時(shí),F(xiàn)S提取以前保存在進(jìn)程表中的各項(xiàng)參數(shù),繼續(xù)執(zhí)行先前被掛起的進(jìn)程。13.5.2 實(shí)現(xiàn)1頭文件及全局變量 FS使用的數(shù)據(jù)結(jié)構(gòu)和表,這些在頭文件中得到定義。const.h:定義了表長(zhǎng)、標(biāo)志位等一些文件系統(tǒng)中使用的常量的值;glo.h:和內(nèi)存管理中的glo.h文件一樣,定義了一些全局變量;proto.h:提供了ANSI標(biāo)準(zhǔn)C編譯器所支持的函數(shù)原型;type.h:定義了i節(jié)點(diǎn)在磁盤上的組

15、織結(jié)構(gòu)。 13.5.2 實(shí)現(xiàn)2表格管理及其使用塊、超級(jí)塊及i節(jié)點(diǎn)是文件系統(tǒng)中最重要的存儲(chǔ)結(jié)構(gòu),對(duì)它們的管理和使用是通過(guò)一系列的過(guò)程來(lái)實(shí)現(xiàn)的。 用于管理塊的過(guò)程有:alloc_zone:用于在區(qū)段位圖中查找空閑區(qū)段,并將其分配給文件;flushall:通常被系統(tǒng)調(diào)用SYNC所調(diào)用,刷新某設(shè)備的緩沖,同時(shí)將其中內(nèi)容寫回設(shè)備;get_block:取要讀寫的塊,先檢查高速緩存,假設(shè)找到就直接返回指針,否那么就將其讀入緩存;put_block:釋放由get_block請(qǐng)求得到的塊;13.5.2 實(shí)現(xiàn)free_zone:負(fù)責(zé)將不再使用的區(qū)段歸還給空閑區(qū)段位圖,以區(qū)段位圖和位號(hào)為參數(shù)調(diào)用free_bit;r

16、w_block:提供了一個(gè)簡(jiǎn)單的磁盤界面,負(fù)責(zé)在內(nèi)存和磁盤間傳送塊;invalidate:刪除某個(gè)設(shè)備在高速緩存中用過(guò)的所有塊;rw_scattered:以設(shè)備標(biāo)志符、緩沖區(qū)指針數(shù)組的指針、數(shù)組長(zhǎng)度及讀寫標(biāo)志為參數(shù),執(zhí)行在設(shè)備上讀/寫分散數(shù)據(jù)的任務(wù);rm_lru:只被get_block調(diào)用,負(fù)責(zé)從LRU鏈中刪除一個(gè)塊。13.5.2 實(shí)現(xiàn)用于超級(jí)塊管理的過(guò)程略少一些,下面的五個(gè)過(guò)程用于超級(jí)塊和位圖的管理:alloc_bit:從區(qū)段位圖或i節(jié)點(diǎn)位圖中分配一位,通常被alloc_inode或alloc_zone以循環(huán)嵌套的方式調(diào)用;free_bit:從區(qū)段位圖或i節(jié)點(diǎn)位圖中釋放一位,首先計(jì)算哪一個(gè)位

17、圖塊包含了要釋放的位,調(diào)用get_block將這個(gè)位圖塊讀入內(nèi)存,將相應(yīng)位置0,再調(diào)用put_block將該塊寫回磁盤;get_super:用于在超級(jí)塊表中搜索特定設(shè)備;mounted:關(guān)閉塊設(shè)備時(shí)調(diào)用,以一個(gè)指向設(shè)備i節(jié)點(diǎn)的指針為參數(shù),返回報(bào)告這個(gè)i節(jié)點(diǎn)是否在被掛裝的文件系統(tǒng)上。Read_super:在讀超級(jí)塊時(shí)調(diào)用,檢查所讀出的文件系統(tǒng)的版本號(hào),并進(jìn)行相應(yīng)的轉(zhuǎn)換。13.5.2 實(shí)現(xiàn)用于管理i節(jié)點(diǎn)的過(guò)程有:get_inode:將一個(gè)i節(jié)點(diǎn)讀入內(nèi)存,首先搜索inode表,假設(shè)找到那么將指針?lè)祷兀患僭O(shè)不在內(nèi)存中那么調(diào)用rw_inode將其讀入;put_inode:返回不再使用的i節(jié)點(diǎn),并把計(jì)數(shù)器

18、icount減1;alloc_inode:為新文件分配i節(jié)點(diǎn);wipe_inode:將i節(jié)點(diǎn)中某些域去除,同時(shí)也負(fù)責(zé)局部初始化i節(jié)點(diǎn)的工作;free_inode:釋放i節(jié)點(diǎn);update_times:從系統(tǒng)時(shí)鐘獲得時(shí)間,同步修改i節(jié)點(diǎn)中的時(shí)間域;rw_inode:負(fù)責(zé)在內(nèi)存和磁盤間傳送i節(jié)點(diǎn);old_icopy:轉(zhuǎn)換要執(zhí)行寫操作的i節(jié)點(diǎn)內(nèi)容;new_icopy:對(duì)由i節(jié)點(diǎn)讀入的數(shù)據(jù)進(jìn)行轉(zhuǎn)換;dup_inode:向其它進(jìn)程標(biāo)明某個(gè)進(jìn)程正在使用i節(jié)點(diǎn)。13.5.2 實(shí)現(xiàn)3.管道管道文件的代碼在文件pipe.c中,它和普通文件在很多方面都類似,我們主要看看它們的不同之處。PIPE調(diào)用通過(guò)過(guò)程do_pipe創(chuàng)立一個(gè)擁有權(quán)屬于系統(tǒng)的管道,并保存在指定的管道設(shè)備上。Do_pipe負(fù)責(zé)為管道分配一個(gè)i節(jié)點(diǎn),同時(shí)返回兩個(gè)文件描述符。Pipe_check過(guò)程利用release過(guò)程來(lái)判斷能否喚醒那些被掛起的過(guò)程。除此之外,它也利用函數(shù)suspend將調(diào)用參數(shù)保存在進(jìn)程表中同時(shí)將dont_reply置為TRUE,從而使進(jìn)程掛起,以便進(jìn)行各種檢查,保證對(duì)管道的操作能夠完成。過(guò)程do_unpause用于處理MM向FS發(fā)送的消息,假設(shè)這條消息的目標(biāo)進(jìn)程被阻塞,那么do_unpause負(fù)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論