freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第6章第硬件和設(shè)備驅(qū)動程序(編輯修改稿)

2025-02-07 16:22 本頁面
 

【文章內(nèi)容簡介】 相關(guān)的文件操作如打開、讀寫與關(guān)閉。 ? 當(dāng)打開代表字符設(shè)備的字符特殊文件時(如 /dev/cua0),核心必須作好準備以便調(diào)用相應(yīng)字符設(shè)備驅(qū)動的文件操作例程。與普通的目錄和文件一樣,每個字符特殊文件用一個虛擬文件系統(tǒng)( Virtual File System, VFS)的節(jié)點( inode)表示。每個字符特殊文件使用的 VFS inode和所有設(shè)備特殊文件一樣,包含著設(shè)備的主從標(biāo)志符。這個VFS inode由底層的文件系統(tǒng)來建立(如 EXT2),其信息來源于設(shè)備相關(guān)文件名稱所在文件系統(tǒng)。 ? 每個 VFS inode和一組文件操作相關(guān)聯(lián) ,它們根據(jù) inode代表的文件系統(tǒng)對像變化而不同。當(dāng)創(chuàng)建一個代表字符相關(guān)文件的 VFS inode時,其文件操作被設(shè)置為默認的字符設(shè)備操作。 ? 字符設(shè)備只有一個文件操作:打開文件操作。當(dāng)應(yīng)用打開字符特殊文件時,通用文件打開操作使用設(shè)備的主標(biāo)志符來索引此 chrdevs數(shù)組,以便得到那些文件操作函數(shù)指針。同時建立起描述此字符特殊文件的 file結(jié)構(gòu) ,使其文件操作指針指向此設(shè)備驅(qū)動中的文件操作指針集合。這樣所有應(yīng)用對它進行的文件操作都被映射到此字符設(shè)備的文件操作集合上。 ? 當(dāng)代表某個字符設(shè)備的設(shè)備特殊文件被打開時,內(nèi)核負責(zé)進行一些設(shè)置工作,以便能夠調(diào)用正確的設(shè)備操作例程。和其他普通的文件或目錄一樣,設(shè)備文件也由 VFS 索引節(jié)點代表。 VFS 索引節(jié)點中包含設(shè)備的主設(shè)備號和次設(shè)備號,每個 VFS 節(jié)點和一組文件操作函數(shù)的指針關(guān)聯(lián)。系統(tǒng)在建立一個代表字符設(shè)備文件的 VFS 索引節(jié)點時,該 VFS 節(jié)點的文件操作函數(shù)指針被設(shè)置為默認的字符設(shè)備操作函數(shù)指針。這時實際只有一個文件操作函數(shù)被定義,即文件的打開操作。應(yīng)用程序打開某個字符特殊文件時,該打開操作將使用 VFS 節(jié)點中的主設(shè)備號在 chrdevs 數(shù)組中檢索相應(yīng)的設(shè)備操作函數(shù)地址,同時在進程的文件數(shù)據(jù)結(jié)構(gòu)中建立一個 file 結(jié)構(gòu),該結(jié)構(gòu)的文件操作函數(shù)指針指向設(shè)備驅(qū)動程序定義的設(shè)備操作函數(shù)指針。此后,應(yīng)用程序在該設(shè)備特殊文件上進行的讀取、寫入等操作就映射到了特定的字符設(shè)備操作。 ? 2. 塊設(shè)備 ? 和字符設(shè)備類似, Linux 內(nèi)核利用 blkdevs 數(shù)組記錄所有的塊設(shè)備,每個數(shù)組元素也是一個 device_struct 結(jié)構(gòu)體,主設(shè)備也當(dāng)作數(shù)組索引使用。在 device_struct 結(jié)構(gòu)體中,塊設(shè)備驅(qū)動程序為通常的文件操作提供接口。除此之外,塊設(shè)備在內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)比字符設(shè)備要復(fù)雜一些,主要是因為內(nèi)核為塊設(shè)備提供緩沖區(qū)高速緩存,實際的讀寫操作由緩沖區(qū)緩存協(xié)調(diào)調(diào)用,因此,還需要驅(qū)動程序為緩沖區(qū)緩存提供接口。為此,內(nèi)核利用 blk_dev 數(shù)組(圖 )定義這些接口。訪問該數(shù)組的索引仍然是主設(shè)備號,每個塊設(shè)備驅(qū)動程序在 blk_dev 數(shù)組的相應(yīng)位置填充 dlk_dev_struct 結(jié)構(gòu)。blk_dev_struct 結(jié)構(gòu)包含一個處理請求的函數(shù)地址,以及一個指向 request 結(jié)構(gòu)體的指針。實際上,多個 request 結(jié)構(gòu)形成了一個鏈表,而每個 request 結(jié)構(gòu)代表由緩沖區(qū)高速緩存請求設(shè)備讀取或?qū)懭氲恼埱笮畔ⅰ? ? 每當(dāng)緩沖區(qū)緩存要從注冊設(shè)備中讀取數(shù)據(jù)或向設(shè)備寫入數(shù)據(jù)時,緩沖區(qū)緩存就會在 blk_dev_struct 中添加一個 request 結(jié)構(gòu)。從圖 可看出,每個 request 結(jié)構(gòu)中包含一個指向 buffer_head 結(jié)構(gòu)的指針,每個 buffer_head 結(jié)構(gòu)定義要讀取或?qū)懭氲臄?shù)據(jù)塊。進行讀寫操作時, buffer_head 結(jié)構(gòu)由緩沖區(qū)緩存鎖定,這時,等待該緩沖區(qū)操作結(jié)束的進程被阻塞。當(dāng)請求被添加到空的請求隊列時,驅(qū)動程序的請求函數(shù)( request_fn)被調(diào)用,由該函數(shù)完成請求隊列的處理。 圖 ? 當(dāng)驅(qū)動程序完成請求處理之后,它從 request 結(jié)構(gòu)中移去 buffer_head 結(jié)構(gòu)并標(biāo)志該結(jié)構(gòu)包含新數(shù)據(jù),然后解鎖 buffer_head 結(jié)構(gòu)。對 buffer_head 結(jié)構(gòu)的解鎖將喚醒所有正在等待該操作完成的進程。 ? request 結(jié)構(gòu)并不是動態(tài)分配的,每次需要新的 request 時,該結(jié)構(gòu)從一個大的靜態(tài) all_request 鏈表中取得,對應(yīng)的請求被處理之后,該結(jié)構(gòu)標(biāo)志為空閑的 request 結(jié)構(gòu)。 ? 和普通文件操作接口一樣 , 每個塊設(shè)備驅(qū)動必須為 buffer cache提供接口。每個塊設(shè)備驅(qū)動將填充其在 blk_dev數(shù)組中的 blk_dev_struct結(jié)構(gòu)入口。數(shù)組的索引值還是此設(shè)備的主設(shè)備號。這個 blk_dev_struct結(jié)構(gòu)包含請求過程的地址以及指向請求數(shù)據(jù)結(jié)構(gòu)鏈表的指針,每個代表一個從 buffer cache中來讓設(shè)備進行數(shù)據(jù)讀寫的請求。 ? 每當(dāng) buffer cache希望從一個已注冊設(shè)備中讀寫數(shù)據(jù)塊時 ,它會將 request結(jié)構(gòu)添加到其 blk_dev_struct中。圖 表示每個請求有指向一個或多個 buffer_hear結(jié)構(gòu)的指針,每個請求讀寫一塊數(shù)據(jù)。如 buffer cache對buffer_head結(jié)構(gòu)上鎖 , 則進程會等待到對此緩沖的塊操作完成。每個 request結(jié)構(gòu)都從靜態(tài)鏈表 all_requests中分配。如果此請求被加入到空請求鏈表中 ,則將調(diào)用驅(qū)動請求函數(shù)以啟動此請求隊列的處理 ,否則該設(shè)備驅(qū)動將簡單地處理請求鏈表上的 request 。 ? 一旦設(shè)備驅(qū)動完成了請求則它必須將每個 buffer_heard結(jié)構(gòu)從 request結(jié)構(gòu)中清除,將它們標(biāo)記成已更新狀態(tài)并解鎖之。對 buffer_head的解鎖將喚醒所有等待此塊操作完成的睡眠進程。如解析文件名稱時 ,EXT2文件系統(tǒng)必須從包含此文件系統(tǒng)的設(shè)備中讀取包含下個 EXT2目錄入口的數(shù)據(jù)塊。在設(shè)備驅(qū)動被喚醒后,在 buffer_head上睡眠的進程將包含此目錄入口。 request數(shù)據(jù)結(jié)構(gòu)被標(biāo)記成空閑以便被其它塊請求使用。 ? 塊設(shè)備也支持以文件方式訪問。系統(tǒng)對塊設(shè)備特殊文件提供了非常類似于字符特殊文件的文件操作機制。 Linux在blkdevs數(shù)組中維護所有已注冊的塊設(shè)備。像 chrdevs數(shù)組一樣, blkdevs也使用設(shè)備的主設(shè)備號進行索引。其入口也是 device_struct結(jié)構(gòu)。和字符設(shè)備不同的是,塊設(shè)備分成不同的類別,例如 SCSI設(shè)備和 IDE設(shè)備。它們將以各自類別登記到 Linux核心中并為核心提供文件操作功能。某類塊設(shè)備的設(shè)備驅(qū)動為此類型設(shè)備提供了類別相關(guān)的接口。如 SCSI設(shè)備驅(qū)動必須為 SCSI子系統(tǒng)提供接口,以便 SCSI子系統(tǒng)能用它來為核心提供對此設(shè)備的文件操作。 ? 3. 網(wǎng)絡(luò)設(shè)備 ? 網(wǎng)絡(luò)設(shè)備,即 Linux的網(wǎng)絡(luò)子系統(tǒng),是一個發(fā)送與接收數(shù)據(jù)包的實體。它一般是一個像以太網(wǎng)卡的物理設(shè)備。 有些網(wǎng)絡(luò)設(shè)備如 loopback設(shè)備僅僅是一個用來向自身發(fā)送數(shù)據(jù)的軟件。每個網(wǎng)絡(luò)設(shè)備都用一個 device結(jié)構(gòu)來 表示。網(wǎng)絡(luò)設(shè)備驅(qū)動在核心啟動初始化網(wǎng)絡(luò)時將這些受控設(shè)備登記到 Linux中。 device數(shù)據(jù)結(jié)構(gòu)中包含有有關(guān) 設(shè)備的信息以及用來支持各種網(wǎng)絡(luò)協(xié)議的函數(shù)地址指針。這些函數(shù)主要用來使用網(wǎng)絡(luò)設(shè)備傳輸數(shù)據(jù)。設(shè)備使用 標(biāo)準網(wǎng)絡(luò)支持機制來將接收到的數(shù)據(jù)傳遞到適當(dāng)?shù)膮f(xié)議層。所有傳輸與接收到的網(wǎng)絡(luò)數(shù)據(jù)用一個 sk_buff結(jié)構(gòu)表示,這些靈活的數(shù)據(jù)結(jié)構(gòu)使得網(wǎng)絡(luò)協(xié)議頭可以更容易的添加與刪除。網(wǎng)絡(luò)協(xié)議層如何使用網(wǎng)絡(luò)設(shè)備以及 如何使用 sk_buff來交換數(shù)據(jù)將在網(wǎng)絡(luò)一章中詳細描述。本章只討論 device數(shù)據(jù)結(jié)構(gòu)及如何發(fā)現(xiàn)與初始化網(wǎng)絡(luò)。 ? ( 1)網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu) device ? 網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu) device中包含以下有關(guān)網(wǎng)絡(luò)設(shè)備的信息: ? Name :與使用 mknod命令創(chuàng)建的塊設(shè)備特殊文件與字符設(shè)備特殊文件不同,網(wǎng)絡(luò)設(shè)備特殊文件僅在于系統(tǒng) 網(wǎng)絡(luò)設(shè)備發(fā)現(xiàn)與初始化時建立。它們使用標(biāo)準的命名方法,每個名字代表一種類型的設(shè)備。多個 相同類型設(shè)備將從 0開始記數(shù)。這樣以太網(wǎng)設(shè)備被命名為 /dev/eth0,/dev/eth1,/dev/eth2 等等。 一些常見的網(wǎng)絡(luò)設(shè)備如下: ? Bus Information :這些信息被設(shè)備驅(qū)動用來控制設(shè)備。irq號表示設(shè)備使用的中斷號。base address指任何設(shè)備在I/O 內(nèi)存中的控制與狀態(tài)寄存器地址。 DMA通道指此網(wǎng)絡(luò)設(shè)備使用的 DMA通道號。所有這些信息在設(shè)備初 始化時設(shè)置。 /dev/ethN 以太網(wǎng)設(shè)備 /dev/slN SLIP設(shè)備 /dev/pppN PPP 設(shè)備 /dev/lo Loopback 設(shè)備 ? Interface Flags :它們描述了網(wǎng)絡(luò)設(shè)備的屬性與功能: IFF_UP 接口已經(jīng)建立并運行 IFF_BROADCAST 設(shè)備中的廣播地址有效 IFF_DEBUG 設(shè)備調(diào)試被使能 IFF_LOOPBACK 一個 loopback設(shè)備 IFF_POINTTOPOINT 點到點連接( SLIP和 PPP) IFF_NOTRAILERS 無網(wǎng)絡(luò)追蹤者 IFF_RUNNING 資源已被分配 IFF_NOARP 不支持 ARP協(xié)議 IFF_PROMISC 設(shè)備處于混亂的接收模式,無論包地址怎樣它都將接收 IFF_ALLMULTI 接收所有的 IP多播幀 IFF_MULTICAST 可以接收 IP多播幀 ? Protocol Information :每個設(shè)備描述它可以被網(wǎng)絡(luò)協(xié)議層如何使用: mtu :指不包括任何鏈路層頭在內(nèi)的,網(wǎng)絡(luò)可傳送的最大包大小。這個值被協(xié)議層用來選擇適當(dāng) 大小的包進行發(fā)送。 Family :這個 family域表示設(shè)備支持的協(xié)議族。所有Linux網(wǎng)絡(luò)設(shè)備的族是 AF_INET,互聯(lián)網(wǎng)地址族。 Type :這個硬件接口類型描述網(wǎng)絡(luò)設(shè)備連接的介質(zhì)類型。Linux網(wǎng)絡(luò)設(shè)備可以支持多種不同類型的 介質(zhì)。包括以太網(wǎng)、 ,令牌環(huán), Slip, PPP和 Apple Localtalk。 Addresses :結(jié)構(gòu)中包含大量網(wǎng)絡(luò)設(shè)備相關(guān)的地址,包括 IP地址。 Packet Queue :指網(wǎng)絡(luò)設(shè)備上等待傳輸?shù)?sk_buff包隊列。 Support Functions :每個設(shè)備支持一組標(biāo)準的例程,它們被協(xié)議層作為設(shè)備鏈路層的接口而調(diào)用。如傳輸建立和幀傳輸 例程以及添加標(biāo)準幀頭以及收集統(tǒng)計數(shù)據(jù)的例程。這些統(tǒng)計數(shù)據(jù)可以使用 ifconfig命令來觀察。 ? ( 2) . 網(wǎng)絡(luò)設(shè)備的初始化 ? 網(wǎng)絡(luò)設(shè)備驅(qū)動可以像其它 Linux設(shè)備驅(qū)動一樣建立到 Linux核心中。每個潛在的網(wǎng)絡(luò)設(shè)備由一個被 dev_base 鏈表指針指向的網(wǎng)絡(luò)設(shè)備鏈表內(nèi)部的 device結(jié)構(gòu)表示。當(dāng)網(wǎng)絡(luò)層需要某個特定工作執(zhí)行時。它將調(diào)用大量網(wǎng) 絡(luò)服務(wù)例程中的一個,這些例程的地址被保存在 device結(jié)構(gòu)內(nèi)部。初始化時每個 device結(jié)構(gòu)僅包含一個初始化或者檢測例程的地址。 ? 對于網(wǎng)絡(luò)設(shè)備驅(qū)動有兩個問題需要解決。首先,不是每個連接到核心中的網(wǎng)絡(luò)設(shè)備驅(qū)動都有設(shè)備要控制。其次雖然底層的設(shè)備驅(qū)動迥然不同,但系統(tǒng)中的以太網(wǎng)設(shè)備總是命名為 /dev/eth0和 /dev/eth1?;煜W(wǎng)絡(luò)設(shè)備這個問題很容易解決。當(dāng)每個網(wǎng)絡(luò)設(shè)備的初始化例程被調(diào)用時,將得到一個指示是否存在當(dāng)前控制器實例的狀態(tài)信息。如果驅(qū)動找不到任何設(shè)備,它那個由 dev_base指向的 device鏈表將被刪除。如果驅(qū)動找到了設(shè)備,則它將用設(shè)備相關(guān)信息以及網(wǎng)絡(luò)設(shè)備驅(qū)動中支撐函數(shù)的地址指針來填充此 device數(shù)據(jù)結(jié)構(gòu)。 ? 第二個問題是要為以太網(wǎng)設(shè)備動態(tài)分配設(shè)備特殊文件的標(biāo)準名/dev/ethN找到解決方法。在設(shè)備鏈表中有 8個標(biāo)準入口;從 eth0到eth7。它們使用相同的初始化例程,此初始化過程將依次嘗試這些被建立到核心中的以太網(wǎng)設(shè)備驅(qū)動,直到找到一個設(shè)備。當(dāng)驅(qū)動找到該以太網(wǎng)設(shè)備時,它將填充對應(yīng)的 ethN設(shè)備結(jié)構(gòu)。同時,此網(wǎng)絡(luò)設(shè)備驅(qū)動初始化其控制的物理硬件,并找出使用的 IRQ號以及 DMA通道等信息。如果驅(qū)動找到了此網(wǎng)絡(luò)設(shè)備的多個實例,它將建立多個/dev/ethN device數(shù)據(jù)結(jié)構(gòu)。一旦所有 8個標(biāo)準 /dev/ethN被分配完畢,則不再檢測其它的以太網(wǎng)設(shè)備。 編寫 Linux下的設(shè)備驅(qū)動程序 ? Linux核心與設(shè)備驅(qū)動之間必須有一個以標(biāo)準方式進行互操作的接口。每一類設(shè)備驅(qū)動:字符設(shè)備、塊設(shè)備 及網(wǎng)絡(luò)設(shè)備都提供了通用接口,以便在需要時為核心提供服務(wù)。這種通用接口使得核心可以以相同的方式來對待不同的設(shè)備及設(shè)備驅(qū)動。如 SCSI和 IDE硬盤的區(qū)別很大,但 Linux對它們使用相
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1