1.1. 驅(qū)動(dòng)程序的角色

2018-02-24 15:49 更新

1.1.?驅(qū)動(dòng)程序的角色

作為一個(gè)程序員, 你能夠?qū)δ愕尿?qū)動(dòng)作出你自己的選擇, 并且在所需的編程時(shí)間和結(jié)果的靈活性之間, 選擇一個(gè)可接受的平衡. 盡管說(shuō)一個(gè)驅(qū)動(dòng)是"靈活"的, 聽起來(lái)有些奇怪, 但是我們喜歡這個(gè)字眼, 因?yàn)樗鼜?qiáng)調(diào)了一個(gè)驅(qū)動(dòng)程序的角色是提供機(jī)制, 而不是策略.

機(jī)制和策略的區(qū)分是其中一個(gè)在 Unix 設(shè)計(jì)背后的最好觀念. 大部分的編程問(wèn)題其實(shí)可以劃分為 2 部分:" 提供什么能力"(機(jī)制) 和 "如何使用這些能力"(策略). 如果這兩方面由程序的不同部分來(lái)表達(dá), 或者甚至由不同的程序共同表達(dá), 軟件包是非常容易開發(fā)和適應(yīng)特殊的需求.

例如, 圖形顯示的 Unix 管理劃分為 X 服務(wù)器, 它理解硬件以及提供了統(tǒng)一的接口給用戶程序, 還有窗口和會(huì)話管理器, 它實(shí)現(xiàn)了一個(gè)特別的策略, 而對(duì)硬件一無(wú)所知. 人們可以在不同的硬件上使用相同的窗口管理器, 而且不同的用戶可以在同一臺(tái)工作站上運(yùn)行不同的配置. 甚至完全不同的桌面環(huán)境, 例如 KDE 和 GNOME, 可以在同一系統(tǒng)中共存. 另一個(gè)例子是 TCP/IP 網(wǎng)絡(luò)的分層結(jié)構(gòu): 操作系統(tǒng)提供 socket 抽象層, 它對(duì)要傳送的數(shù)據(jù)而言不實(shí)現(xiàn)策略, 而不同的服務(wù)器負(fù)責(zé)各種服務(wù)( 以及它們的相關(guān)策略). 而且, 一個(gè)服務(wù)器, 例如 ftpd 提供文件傳輸機(jī)制, 同時(shí)用戶可以使用任何他們喜歡的客戶端; 無(wú)論命令行還是圖形客戶端都存在, 并且任何人都能編寫一個(gè)新的用戶接口來(lái)傳輸文件.

在驅(qū)動(dòng)相關(guān)的地方, 機(jī)制和策略之間的同樣的區(qū)分都適用. 軟驅(qū)驅(qū)動(dòng)是不含策略的--它的角色僅僅是將磁盤表現(xiàn)為一個(gè)數(shù)據(jù)塊的連續(xù)陣列. 系統(tǒng)的更高級(jí)部分提供了策略, 例如誰(shuí)可以存取軟驅(qū)驅(qū)動(dòng), 這個(gè)軟驅(qū)是直接存取還是要通過(guò)一個(gè)文件系統(tǒng), 以及用戶是否可以加載文件系統(tǒng)到這個(gè)軟驅(qū). 因?yàn)椴煌沫h(huán)境常常需要不同的使用硬件的方式, 盡可能對(duì)策略透明是非常重要的.

在編寫驅(qū)動(dòng)時(shí), 程序員應(yīng)當(dāng)特別注意這個(gè)基礎(chǔ)的概念: 編寫內(nèi)核代碼來(lái)存取硬件, 但是不能強(qiáng)加特別的策略給用戶, 因?yàn)椴煌挠脩粲胁煌男枨? 驅(qū)動(dòng)應(yīng)當(dāng)做到使硬件可用, 將所有關(guān)于如何使用硬件的事情留給應(yīng)用程序. 一個(gè)驅(qū)動(dòng), 這樣, 就是靈活的, 如果它提供了對(duì)硬件能力的存取, 沒(méi)有增加約束. 然而, 有時(shí)必須作出一些策略的決定. 例如, 一個(gè)數(shù)字 I/O 驅(qū)動(dòng)也許只提供對(duì)硬件的字符存取, 以便避免額外的代碼處理單個(gè)位.

你也可以從不同的角度看你的驅(qū)動(dòng): 它是一個(gè)存在于應(yīng)用程序和實(shí)際設(shè)備間的軟件層. 驅(qū)動(dòng)的這種特權(quán)的角色允許驅(qū)動(dòng)程序員y嚴(yán)密地選擇設(shè)備應(yīng)該如何表現(xiàn): 不同的驅(qū)動(dòng)可以提供不同的能力, 甚至是同一個(gè)設(shè)備. 實(shí)際的驅(qū)動(dòng)設(shè)計(jì)應(yīng)當(dāng)是在許多不同考慮中的平衡. 例如, 一個(gè)單個(gè)設(shè)備可能由不同的程序并發(fā)使用, 驅(qū)動(dòng)程序員有完全的自由來(lái)決定如何處理并發(fā)性. 你能在設(shè)備上實(shí)現(xiàn)內(nèi)存映射而不依賴它的硬件能力, 或者你能提供一個(gè)用戶庫(kù)來(lái)幫助應(yīng)用程序員在可用的原語(yǔ)之上實(shí)現(xiàn)新策略, 等等. 一個(gè)主要的考慮是在展現(xiàn)給用戶盡可能多的選項(xiàng), 和你不得不花費(fèi)的編寫驅(qū)動(dòng)的時(shí)間之間做出平衡, 還有需要保持事情簡(jiǎn)單以避免錯(cuò)誤潛入.

對(duì)策略透明的驅(qū)動(dòng)有一些典型的特征. 這些包括支持同步和異步操作, 可以多次打開的能力, 利用硬件全部能力, 沒(méi)有軟件層來(lái)"簡(jiǎn)化事情"或者提供策略相關(guān)的操作. 這樣的驅(qū)動(dòng)不但對(duì)他們的最終用戶好用, 而且證明也是易寫易維護(hù)的. 成為策略透明的實(shí)際是一個(gè)共同的目標(biāo), 對(duì)軟件設(shè)計(jì)者來(lái)說(shuō).

許多設(shè)備驅(qū)動(dòng), 確實(shí), 是與用戶程序一起發(fā)行的, 以便幫助配置和存取目標(biāo)設(shè)備. 這些程序包括簡(jiǎn)單的工具到完全的圖形應(yīng)用. 例子包括 tunelp 程序, 它調(diào)整并口打印機(jī)驅(qū)動(dòng)如何操作, 還有圖形的 cardctl 工具, 它是 PCMCIA 驅(qū)動(dòng)包的一部分. 經(jīng)常會(huì)提供一個(gè)客戶庫(kù), 它提供了不需要驅(qū)動(dòng)自身實(shí)現(xiàn)的功能.

本書的范圍是內(nèi)核, 因此我們盡力不涉及策略問(wèn)題, 應(yīng)用程序, 以及支持庫(kù). 有時(shí)我們談?wù)摬煌牟呗砸约叭绾沃С炙麄? 但是我們不會(huì)進(jìn)入太多有關(guān)使用設(shè)備的程序的細(xì)節(jié), 或者是他們強(qiáng)加的策略的細(xì)節(jié). 但是, 你應(yīng)當(dāng)理解, 用戶程序是一個(gè)軟件包的構(gòu)成部分, 并且就算是對(duì)策略透明的軟件包在發(fā)行時(shí)也會(huì)帶有配置文件, 來(lái)對(duì)底層的機(jī)制應(yīng)用缺省的動(dòng)作.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)