W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
編寫驅(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è)備文件上的存取控制"中描述.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: