W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
以 LInux 的方式看待設(shè)備可區(qū)分為 3 種基本設(shè)備類型. 每個模塊常常實現(xiàn) 3 種類型中的 1 種, 因此可分類成字符模塊, 塊模塊, 或者一個網(wǎng)絡(luò)模塊. 這種將模塊分成不同類型或類別的方法并非是固定不變的; 程序員可以選擇建立在一個大塊代碼中實現(xiàn)了不同驅(qū)動的巨大模塊. 但是, 好的程序員, 常常創(chuàng)建一個不同的模塊給每個它們實現(xiàn)的新功能, 因為分解是可伸縮性和可擴張性的關(guān)鍵因素.
3 類驅(qū)動如下:
既然不是一個面向流的設(shè)備, 一個網(wǎng)絡(luò)接口就不象 /dev/tty1 那么容易映射到文件系統(tǒng)的一個結(jié)點上. Unix 的提供對接口的存取的方式仍然是通過分配一個名子給它們( 例如 eth0 ), 但是這個名子在文件系統(tǒng)中沒有對應(yīng)的入口. 內(nèi)核與網(wǎng)絡(luò)設(shè)備驅(qū)動間的通訊與字符和塊設(shè)備驅(qū)動所用的完全不同. 不用 read 和 write, 內(nèi)核調(diào)用和報文傳遞相關(guān)的函數(shù).
字符設(shè)備
一個字符( char ) 設(shè)備是一種可以當(dāng)作一個字節(jié)流來存取的設(shè)備( 如同一個文件 ); 一個字符驅(qū)動負責(zé)實現(xiàn)這種行為. 這樣的驅(qū)動常常至少實現(xiàn) open, close, read, 和 write 系統(tǒng)調(diào)用. 文本控制臺( /dev/console )和串口( /dev/ttyS0 及其友 )是字符設(shè)備的例子, 因為它們很好地展現(xiàn)了流的抽象. 字符設(shè)備通過文件系統(tǒng)結(jié)點來存取, 例如 /dev/tty1 和 /dev/lp0. 在一個字符設(shè)備和一個普通文件之間唯一有關(guān)的不同就是, 你經(jīng)??梢栽谄胀ㄎ募幸苼硪迫? 但是大部分字符設(shè)備僅僅是數(shù)據(jù)通道, 你只能順序存取.然而, 存在看起來象數(shù)據(jù)區(qū)的字符設(shè)備, 你可以在里面移來移去. 例如, frame grabber 經(jīng)常這樣, 應(yīng)用程序可以使用 mmap 或者 lseek 存取整個要求的圖像.
塊設(shè)備
如同字符設(shè)備, 塊設(shè)備通過位于 /dev 目錄的文件系統(tǒng)結(jié)點來存取. 一個塊設(shè)備(例如一個磁盤)應(yīng)該是可以駐有一個文件系統(tǒng)的. 在大部分的 Unix 系統(tǒng), 一個塊設(shè)備只能處理這樣的 I/O 操作, 傳送一個或多個長度經(jīng)常是 512 字節(jié)( 或一個更大的 2 的冪的數(shù) )的整塊. Linux, 相反, 允許應(yīng)用程序讀寫一個塊設(shè)備象一個字符設(shè)備一樣 -- 它允許一次傳送任意數(shù)目的字節(jié). 結(jié)果就是, 塊和字符設(shè)備的區(qū)別僅僅在內(nèi)核在內(nèi)部管理數(shù)據(jù)的方式上, 并且因此在內(nèi)核/驅(qū)動的軟件接口上不同. 如同一個字符設(shè)備, 每個塊設(shè)備都通過一個文件系統(tǒng)結(jié)點被存取的, 它們之間的區(qū)別對用戶是透明的. 塊驅(qū)動和字符驅(qū)動相比, 與內(nèi)核的接口完全不同.
網(wǎng)絡(luò)接口
任何網(wǎng)絡(luò)事務(wù)都通過一個接口來進行, 就是說, 一個能夠與其他主機交換數(shù)據(jù)的設(shè)備. 通常, 一個接口是一個硬件設(shè)備, 但是它也可能是一個純粹的軟件設(shè)備, 比如環(huán)回接口. 一個網(wǎng)絡(luò)接口負責(zé)發(fā)送和接收數(shù)據(jù)報文, 在內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的驅(qū)動下, 不必知道單個事務(wù)是如何映射到實際的被發(fā)送的報文上的. 很多網(wǎng)絡(luò)連接( 特別那些使用 TCP 的)是面向流的, 但是網(wǎng)絡(luò)設(shè)備卻常常設(shè)計成處理報文的發(fā)送和接收. 一個網(wǎng)絡(luò)驅(qū)動對單個連接一無所知; 它只處理報文.
有其他的劃分驅(qū)動模塊的方式, 與上面的設(shè)備類型是正交的. 通常, 某些類型的驅(qū)動與給定類型設(shè)備的其他層的內(nèi)核支持函數(shù)一起工作. 例如, 你可以說 USB 模塊, 串口模塊, SCSI 模塊, 等等. 每個 USB 設(shè)備由一個 USB 模塊驅(qū)動, 與 USB 子系統(tǒng)一起工作, 但是設(shè)備自身在系統(tǒng)中表現(xiàn)為一個字符設(shè)備( 比如一個 USB 串口 ), 一個塊設(shè)備( 一個 USB 內(nèi)存讀卡器 ), 或者一個網(wǎng)絡(luò)設(shè)備( 一個 USB 以太網(wǎng)接口 ).
另外的設(shè)備驅(qū)動類別近來已經(jīng)添加到內(nèi)核中, 包括 FireWire 驅(qū)動和 I2O 驅(qū)動. 以它們處理 USB 和 SCSI 驅(qū)動相同的方式, 內(nèi)核開發(fā)者集合了類別范圍內(nèi)的特性, 并把它們輸出給驅(qū)動實現(xiàn)者, 以避免重復(fù)工作和 bug, 因此簡化和加強了編寫類似驅(qū)動的過程.
在設(shè)備驅(qū)動之外, 別的功能, 不論硬件和軟件, 在內(nèi)核中都是模塊化的. 一個普通的例子是文件系統(tǒng). 一個文件系統(tǒng)類型決定了在塊設(shè)備上信息是如何組織的, 以便能表示一棵目錄與文件的樹. 這樣的實體不是設(shè)備驅(qū)動, 因為沒有明確的設(shè)備與信息擺放方式相聯(lián)系; 文件系統(tǒng)類型卻是一種軟件驅(qū)動, 因為它將低級數(shù)據(jù)結(jié)構(gòu)映射為高級的數(shù)據(jù)結(jié)構(gòu). 文件系統(tǒng)決定一個文件名多長, 以及在一個目錄入口中存儲每個文件的什么信息. 文件系統(tǒng)模塊必須實現(xiàn)最低級的系統(tǒng)調(diào)用, 來存取目錄和文件, 通過映射文件名和路徑( 以及其他信息, 例如存取模式 )到保存在數(shù)據(jù)塊中的數(shù)據(jù)結(jié)構(gòu). 這樣的一個接口是完全與數(shù)據(jù)被傳送來去磁盤( 或其他介質(zhì) )相互獨立, 這個傳送是由一個塊設(shè)備驅(qū)動完成的.
如果你考慮一個 Unix 系統(tǒng)是多么依賴下面的文件系統(tǒng), 你會認(rèn)識到這樣的一個軟件概念對系統(tǒng)操作是至關(guān)重要的. 解碼文件系統(tǒng)信息的能力處于內(nèi)核層級中最低級, 并且是最重要的; 甚至如果你為你的新 CD-ROM 編寫塊驅(qū)動, 如果你對上面的數(shù)據(jù)不能運行 ls 或者 cp 就毫無用處. Linux 支持一個文件系統(tǒng)模塊的概念, 其軟件接口聲明了不同操作, 可以在一個文件系統(tǒng)節(jié)點, 目錄, 文件和超級塊上進行操作. 對一個程序員來說, 居然需要編寫一個文件系統(tǒng)模塊是非常不常見的, 因為官方內(nèi)核已經(jīng)包含了大部分重要的文件系統(tǒng)類型的代碼.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: