字元装置驱动程式的进阶操作.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Ch5-字元裝置驅動程式的進階操作 Outline Introduction 5.1 ioctl 5.2 推延式I/O 5.3 poll與select 5.4 非同步通知 5.5 改變裝置的存取點 5.6 裝置檔的存取控制 5.7 回溯相容性 5.8 速查參考 5-Introduction 驅動程式除了讀寫動作之外,通常還需要提供各種控制硬體的能力,而控制動作通常是透過ioctl作業方法來實施。 不過,並非所有的裝置都採用ioctl控制方式,有的驅動程式採用了另一種控制技術(預先定義一組特殊序列來當成控制命令),例如:ttych-5.1.7 ioctl( )系統呼叫為驅動程式提供了一個下達“裝置特有的命令(device-specific command)”的管道。這類命令的定義與功能是隨硬體裝置而定: 設定暫存器的狀態 進入或離開某作業某作業模式 ioctl( )的作用:控制I/O通道 5.1-ioctl User-space的觀點來看,ioctl( )系統呼叫的函式原形如下: int ioctl (int fd, int cmd, …) fd : file descriptor,檔案描述單元 cmd : 控制命令 … : 並非代表不定量引數,而是一個可有可無的引數-習慣上表示為 char *argp(為了通過編譯時期的型別檢查type checking) ioctl作業方法會收到下列宣告的引數: int (*ioctl) (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) inode指標指向對應到應用程式傳來的fd… filp指標指向一個代表裝置節點的file結構 cmd的值等於ioctl( )系統呼叫的第二引數 如果應用程式發出的ioctl( )系統呼叫有第三個引數,則ioctl作業方法會收到一個unsigned long型別的arg引數,否則無意義 5.1-ioctl 由於編譯器無法檢查而外引數的型別,因此,當應用程式傳遞了一個無效引數給ioctl( ),驅動程式也要到執行期才會知道錯誤。這項缺點是ioctl系統定義使然,但卻是ioctl( )為了提供通用功能性的必然代價。 大部份驅動程式實作出來的ioctl作業方法都包含了一個switch敘述,並依據cmd引數來選擇正確的處理程序。 不同的命令(cmd)有不同的代表值,通常在標頭檔裡定義一組符號來代表各個命令值ex : scull驅動程式就在scull.h標頭檔裡宣告一組命令代號 5.1.1-選擇ioctl命令編號 編寫ioctl的具體程式之前,必須先為各個命令挑選對應的編號。最簡單的選擇“從1開始逐一分配”是行不通的。 系統上,每個命令的編號都必須是獨一無二的 : 以免正確命令被下達到錯誤裝置所造成的災難。 若沒有重複的ioctl命令編號,則搞錯對象的程式就會收到EINVAL錯誤,不至於…。 初版的linux採用16bits的編號 : 高八位元代表裝置個體的“魔數(magic number)” 低八位元則是供裝置內部使用的“序號(sequence number)” 同系統上,沒有相同魔數的裝置。同一裝置裡沒有重複的序號。clueless說:這樣的劃分是他一時的無知 5.1.1-選擇ioctl命令編號 新版的劃分法則: 查閱include/asm/ioctl.h(定義所要使用的各個位元欄,包括:類型, 魔數, 流水號, 傳輸方向) 查閱Documentation/ioctl-number.txt(列出所有已經分配給核心的魔術,及解釋了為何應該採用新法則) 新的劃分法使用四個位元欄位定義在linuxioctl.h type(magic number) : 自己挑選一個符合規定的數值,並用於整個驅動程式。欄位長度為_IOC_TYPEBITS(8-bits) number(ordinal number) : 可稱為序號,此欄位的長度為_IOC_NRBITS(8-bits) direction : 傳輸方向,代表資料的流向。包括(_IOC_NONE, _IOC_READ, _IOC_WRITE, _IOC_READ | _IOC_WRITE)。英站在應用程式的觀點來看。 size : 使用者資料量。此欄位的寬度隨硬體平台而定。(8-bits~14-bits)建議在8-bits以下來保持可移值性。 5.1.1-選擇ioctl命令編號 整數引數的傳遞方式有兩種,一是透過指標,二是直接給明確數值;ioctl( )的普遍慣例,應該採用指標來交換數值。 對於系統呼叫的回傳值有不成文的慣例:負值代表錯誤且被用來設定user-space的err

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档