3.1. scull 的設(shè)計

2018-02-24 15:49 更新

3.1.?scull 的設(shè)計

編寫驅(qū)動的第一步是定義驅(qū)動將要提供給用戶程序的能力(機制).因為我們的"設(shè)備"是計算機內(nèi)存的一部分, 我們可自由做我們想做的事情. 它可以是一個順序的或者隨機存取的設(shè)備, 一個或多個設(shè)備, 等等.

為使 scull 作為一個模板來編寫真實設(shè)備的真實驅(qū)動, 我們將展示給你如何在計算機內(nèi)存上實現(xiàn)幾個設(shè)備抽象, 每個有不同的個性.

scull 源碼實現(xiàn)下面的設(shè)備. 模塊實現(xiàn)的每種設(shè)備都被引用做一種類型.

scull0 到 scull3
4 個設(shè)備, 每個由一個全局永久的內(nèi)存區(qū)組成. 全局意味著如果設(shè)備被多次打開, 設(shè)備中含有的數(shù)據(jù)由所有打開它的文件描述符共享. 永久意味著如果設(shè)備關(guān)閉又重新打開, 數(shù)據(jù)不會丟失. 這個設(shè)備用起來有意思, 因為它可以用慣常的命令來存取和測試, 例如 cp, cat, 以及 I/O 重定向.

scullpipe0 到 scullpipe3
4 個 FIFO (先入先出) 設(shè)備, 行為象管道. 一個進程讀的內(nèi)容來自另一個進程所寫的. 如果多個進程讀同一個設(shè)備, 它們競爭數(shù)據(jù). scullpipe 的內(nèi)部將展示阻塞讀寫和非阻塞讀寫如何實現(xiàn), 而不必采取中斷. 盡管真實的驅(qū)動使用硬件中斷來同步它們的設(shè)備, 阻塞和非阻塞操作的主題是重要的并且與中斷處理是分開的.(在第 10 章涉及).

scullsinglescullprivsculluidscullwuid
這些設(shè)備與 scull0 相似, 但是在什么時候允許打開上有一些限制. 第一個( snullsingle) 只允許一次一個進程使用驅(qū)動, 而 scullpriv 對每個虛擬終端(或者 X 終端會話)是私有的, 因為每個控制臺/終端上的進程有不同的內(nèi)存區(qū). sculluid 和 scullwuid 可以多次打開, 但是一次只能是一個用戶; 前者返回一個"設(shè)備忙"錯誤, 如果另一個用戶鎖著設(shè)備, 而后者實現(xiàn)阻塞打開. 這些 scull 的變體可能看來混淆了策略和機制, 但是它們值得看看, 因為一些實際設(shè)備需要這類管理.

每個 scull 設(shè)備演示了驅(qū)動的不同特色, 并且呈現(xiàn)了不同的難度. 本章涉及 scull0 到 scull3 的內(nèi)部; 更高級的設(shè)備在第 6 章涉及. scullpipe 在"一個阻塞 I/O 例子"一節(jié)中描述, 其他的在"設(shè)備文件上的存取控制"中描述.

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號