3.1. scull 的設(shè)計(jì)

2018-02-24 15:49 更新

3.1.?scull 的設(shè)計(jì)

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

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)