freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

高級(jí)字符驅(qū)動(dòng)操作說明-展示頁(yè)

2025-04-27 04:29本頁(yè)面
  

【正文】 些命令, 當(dāng)用到你的設(shè)備時(shí), 在你自己的文件操作被調(diào)用之前被解碼. 因此, 如果你選擇相同的號(hào)給一個(gè)你的 ioctl命令, 你不會(huì)看到任何的給那個(gè)命令的請(qǐng)求, 并且應(yīng)用程序獲得某些不期望的東西, 因?yàn)樵?ioctl 號(hào)之間的沖突.預(yù)定義命令分為 3 類: 如同你現(xiàn)在所知道的, 在從任何系統(tǒng)調(diào)用返回時(shí), 一個(gè)正值被保留(如同我們?cè)?read 和 write 中見到的), 而一個(gè)負(fù)值被看作一個(gè)錯(cuò)誤并且被用來在用戶空間設(shè)置 errno.[]exchange和shift操作對(duì)于 scull 沒有特別的用處. 我們實(shí)現(xiàn)exchange來顯示驅(qū)動(dòng)如何結(jié)合獨(dú)立的操作到單個(gè)的原子的操作, 并且shift來連接tell和query. 有時(shí)需要象這樣的原子的測(cè)試和設(shè)置操作, 特別地, 當(dāng)應(yīng)用程序需要設(shè)置和釋放鎖.命令的明確的序號(hào)沒有特別的含義. 它只用來區(qū)分命令. 實(shí)際上, 你甚至可使用相同的序號(hào)給一個(gè)讀命令和一個(gè)寫命令, 因?yàn)閷?shí)際的 ioctl 號(hào)在方向位是不同的, 但是你沒有理由這樣做. 我們選擇在任何地方不使用命令的序號(hào)除了聲明中, 因此我們不分配一個(gè)返回值給它. 這就是為什么明確的號(hào)出現(xiàn)在之前給定的定義中. 這個(gè)例子展示了一個(gè)使用命令號(hào)的方法, 但是你有自由不這樣做.除了少數(shù)幾個(gè)預(yù)定義的命令(馬上就討論), ioctl 的 cmd 參數(shù)的值當(dāng)前不被內(nèi)核使用, 并且在將來也很不可能. 因此, 你可以, 如果你覺得懶, 避免前面展示的復(fù)雜的聲明并明確聲明一組調(diào)整數(shù)字. 另一方面, 如果你做了, 你不會(huì)從使用這些位段中獲益, 并且你會(huì)遇到困難如果你曾提交你的代碼來包含在主線內(nèi)核中. 頭文件linux/ 是這個(gè)老式方法的例子, 使用 16位的調(diào)整值來定義 ioctl 命令. 那個(gè)源代碼依靠調(diào)整數(shù)因?yàn)槭褂媚莻€(gè)時(shí)候遵循的慣例, 不是由于懶惰. 現(xiàn)在改變它可能導(dǎo)致無理由的不兼容..k39。k39。 一個(gè)更好的位段劃分僅在后來被設(shè)想. 不幸的是, 許多驅(qū)動(dòng)仍然使用老傳統(tǒng). 它們不得不: 改變命令編碼會(huì)破壞大量的二進(jìn)制程序,并且這不是內(nèi)核開發(fā)者愿意見到的.根據(jù) Linux 內(nèi)核慣例來為你的驅(qū)動(dòng)選擇 ioctl 號(hào), 你應(yīng)當(dāng)首先檢查 include/asm/ 和 Documentation/. 這個(gè)頭文件定義你將使用的位段: type(魔數(shù)), 序號(hào), 傳輸方向, 和參數(shù)大小. 文件列舉了在內(nèi)核中使用的魔數(shù),[] 因此你將可選擇你自己的魔數(shù)并且避免交疊. 這個(gè)文本文件也列舉了為什么應(yīng)當(dāng)使用慣例的原因.定義 ioctl 命令號(hào)的正確方法使用 4 個(gè)位段, 它們有下列的含義. 這個(gè)列表中介紹的新符號(hào)定義在 linux/.type 魔數(shù). 只是選擇一個(gè)數(shù)(在參考了 )并且使用它在整個(gè)驅(qū)動(dòng)中. 這個(gè)成員是 8 位寬(_IOC_TYPEBITS). number 序(順序)號(hào). 它是 8 位(_IOC_NRBITS)寬. direction 數(shù)據(jù)傳送的方向,如果這個(gè)特殊的命令涉及數(shù)據(jù)傳送. 可能的值是 _IOC_NONE(沒有數(shù)據(jù)傳輸), _IOC_READ, _IOC_WRITE, 和 _IOC_READ|_IOC_WRITE (數(shù)據(jù)在2個(gè)方向被傳送). 數(shù)據(jù)傳送是從應(yīng)用程序的觀點(diǎn)來看待的。 為 scull 聲明它們. 用戶程序必須, 當(dāng)然, 包含那個(gè)頭文件來存取這些符號(hào).. 例如, 考慮運(yùn)行在 32位模式的一個(gè)用戶進(jìn)程的 64位 系統(tǒng). 結(jié)果, 有很大的壓力來實(shí)現(xiàn)混雜的控制操作, 只通過任何其他的方法. 可能的選擇包括嵌入命令到數(shù)據(jù)流(本章稍后我們將討論這個(gè)方法)或者使用虛擬文件系統(tǒng), 要么是 sysfs 要么是設(shè)備特定的文件系統(tǒng). (我們將在 14 章看看 sysfs). 但是, 事實(shí)是 ioctl 常常是最容易的和最直接的選擇,對(duì)于真正的設(shè)備操作.ioctl 驅(qū)動(dòng)方法有和用戶空間版本不同的原型:int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)。 這個(gè)原型由于這些點(diǎn)而凸現(xiàn)于 Unix 系統(tǒng)調(diào)用列表, 這些點(diǎn)常常表示函數(shù)有數(shù)目不定的參數(shù). 在實(shí)際系統(tǒng)中, 但是, 一個(gè)系統(tǒng)調(diào)用不能真正有變數(shù)目的參數(shù). 系統(tǒng)調(diào)用必須有一個(gè)很好定義的原型, 因?yàn)橛脩舫绦蚩纱嫒∷鼈冎荒芡ㄟ^硬件的門. 因此, 原型中的點(diǎn)不表示一個(gè)變數(shù)目的參數(shù), 而是一個(gè)單個(gè)可選的參數(shù), 傳統(tǒng)上標(biāo)識(shí)為 char *argp. 這些點(diǎn)在那里只是為了阻止在編譯時(shí)的類型檢查. 第 3 個(gè)參數(shù)的實(shí)際特點(diǎn)依賴所發(fā)出的特定的控制命令( 第 2 個(gè)參數(shù) ). 一些命令不用參數(shù), 一些用一個(gè)整數(shù)值, 以及一些使用指向其他數(shù)據(jù)的指針. 使用一個(gè)指針是傳遞任意數(shù)據(jù)到 ioctl 調(diào)用的方法。ioctl 接口大部分驅(qū)動(dòng)需要 除了讀寫設(shè)備的能力 通過設(shè)備驅(qū)動(dòng)進(jìn)行各種硬件控制的能力. 大部分設(shè)備可進(jìn)行超出簡(jiǎn)單的數(shù)據(jù)傳輸之外的操作。《銷售經(jīng)理學(xué)院》56套講座+ 14350份資料《銷售人員培訓(xùn)學(xué)院》72套講座+ 4879份資料(20080928 16:28) 分類: 第 6 章 高級(jí)字符驅(qū)動(dòng)操作在第 3 章, 我們建立了一個(gè)完整的設(shè)備驅(qū)動(dòng), 用戶可用來寫入和讀取. 但是一個(gè)真正的設(shè)備常常提供比同步讀和寫更多的功能. 現(xiàn)在我們已裝備有調(diào)試工具如果發(fā)生錯(cuò)誤, 并且一個(gè)牢固的并發(fā)的理解來幫助避免事情進(jìn)入錯(cuò)誤 我們可安全地前進(jìn)并且創(chuàng)建一個(gè)更高級(jí)的驅(qū)動(dòng).本章檢查幾個(gè)你需要理解的概念來編寫全特性的字符設(shè)備驅(qū)動(dòng). 我們從實(shí)現(xiàn) ioctl 系統(tǒng)調(diào)用開始, 它是用作設(shè)備控制的普通接口. 接著我們進(jìn)入各種和用戶空間同步的方法。高級(jí)字符驅(qū)動(dòng)操作說明作者:日期:n更多企業(yè)學(xué)院: 《中小企業(yè)管理全能版》183套講座+89700份資料《總經(jīng)理、高層管理》49套講座+16388份資料《中層管理學(xué)院》46套講座+6020份資料《國(guó)學(xué)智慧、易經(jīng)》46套講座《人力資源學(xué)院》56套講座+27123份資料《各階段員工培訓(xùn)學(xué)院》77套講座+ 324份資料《員工管理企業(yè)學(xué)院》67套講座+ 8720份資料《工廠生產(chǎn)管理學(xué)院》52套講座+ 13920份資料《財(cái)務(wù)管理學(xué)院》53套講座+ 17945份資料 在本章結(jié)尾, 你有一個(gè)充分的認(rèn)識(shí)對(duì)于如何使進(jìn)程睡眠(并且喚醒它們), 實(shí)現(xiàn)非阻塞的 I/O, 并且通知用戶空間當(dāng)你的設(shè)備可用來讀或?qū)? 我們以查看如何在驅(qū)動(dòng)中實(shí)現(xiàn)幾個(gè)不同的設(shè)備存取策略來結(jié)束.這里討論的概念通過 scull 驅(qū)動(dòng)的幾個(gè)修改版本來演示. 再一次, 所有的都使用內(nèi)存中的虛擬設(shè)備來實(shí)現(xiàn), 因此你可自己試驗(yàn)這些代碼而不必使用任何特別的硬件. 到此為止, 你可能在想親手使用真正的硬件, 但是那將必須等到第 9 章.. 用戶空間必須常常能夠請(qǐng)求, 例如, 設(shè)備鎖上它的門, 彈出它的介質(zhì), 報(bào)告錯(cuò)誤信息, 改變波特率, 或者自我銷毀. 這些操作常常通過 ioctl 方法來支持, 它通過相同名子的系統(tǒng)調(diào)用來實(shí)現(xiàn).在用戶空間, ioctl 系統(tǒng)調(diào)用有下面的原型:int ioctl(int fd, unsigned long cmd, ...)。 設(shè)備接著可與用戶空間交換任何數(shù)量的數(shù)據(jù).ioctl 調(diào)用的非結(jié)構(gòu)化特性使它在內(nèi)核開發(fā)者中失寵. 每個(gè) ioctl 命令, 基本上, 是一個(gè)單獨(dú)的, 常常無文檔的系統(tǒng)調(diào)用, 并且沒有方法以任何類型的全面的方式核查這些調(diào)用. 也難于使非結(jié)構(gòu)化的 ioctl 參數(shù)在所有系統(tǒng)上一致工作。inode 和 filp 指針是對(duì)應(yīng)應(yīng)用程序傳遞的文件描述符 fd 的值, 和傳遞給 open 方法的相同參數(shù). cmd 參數(shù)從用戶那里不改變地傳下來, 并且可選的參數(shù) arg 參數(shù)以一個(gè) unsigned long 的形式傳遞, 不管它是否由用戶給定為一個(gè)整數(shù)或一個(gè)指針. 如果調(diào)用程序不傳遞第 3 個(gè)參數(shù), 被驅(qū)動(dòng)操作收到的 arg 值是無定義的. 因?yàn)轭愋蜋z查在這個(gè)額外參數(shù)上被關(guān)閉, 編譯器不能警告你如果一個(gè)無效的參數(shù)被傳遞給 ioctl, 并且任何關(guān)聯(lián)的錯(cuò)誤將難以查找.如果你可能想到的, 大部分 ioctl 實(shí)現(xiàn)包括一個(gè)大的 switch 語(yǔ)句來根據(jù) cmd 參數(shù), 選擇正確的做法. 不同的命令有不同的數(shù)值, 它們常常被給予符號(hào)名來簡(jiǎn)化編碼. 符號(hào)名通過一個(gè)預(yù)處理定義來安排. 定制的驅(qū)動(dòng)常常聲明這樣的符號(hào)在它們的頭文件中。選擇 ioctl 命令在為 ioctl 編寫代碼之前, 你需要選擇對(duì)應(yīng)命令的數(shù)字. 許多程序員的第一個(gè)本能的反應(yīng)是選擇一組小數(shù)從0或1開始, 并且從此開始向上. 但是, 有充分的理由不這樣做. ioctl 命令數(shù)字應(yīng)當(dāng)在這個(gè)系統(tǒng)是唯一的, 為了阻止向錯(cuò)誤的設(shè)備發(fā)出正確的命令而引起的錯(cuò)誤. 這樣的不匹配不會(huì)不可能發(fā)生, 并且一個(gè)程序可能發(fā)現(xiàn)它自己試圖改變一個(gè)非串口輸入系統(tǒng)的波特率, 例如一個(gè) FIFO 或者一個(gè)音頻設(shè)備. 如果這樣的 ioctl 號(hào)是唯一的, 這個(gè)應(yīng)用程序得到一個(gè) EINVAL 錯(cuò)誤而不是繼續(xù)做不應(yīng)當(dāng)做的事情.為幫助程序員創(chuàng)建唯一的 ioctl 命令代碼, 這些編碼已被劃分為幾個(gè)位段. Linux 的第一個(gè)版本使用 16位數(shù): 高 8 位是關(guān)聯(lián)這個(gè)設(shè)備的魔數(shù), 低 8 位是一個(gè)順序號(hào), 在設(shè)備內(nèi)唯一. 這樣做是因?yàn)?Linus 是無能的(他自己的話)。 _IOC_READ 意思是從設(shè)備讀, 因此設(shè)備必須寫到用戶空間. 注意這個(gè)成員是一個(gè)位掩碼, 因此 _IOC_READ 和 _IOC_WRITE 可使用一個(gè)邏輯 AND 操作來抽取.size 涉及到的用戶數(shù)據(jù)的大小. 這個(gè)成員的寬度是依賴體系的, 但是常常是 13 或者 14 位. 你可為你的特定體系在宏 _IOC_SIZEBITS 中找到它的值. 你使用這個(gè) size 成員不是強(qiáng)制的 內(nèi)核不檢查它 但是它是一個(gè)好主意. 正確使用這個(gè)成員可幫助檢測(cè)用戶空間程序的錯(cuò)誤并使你實(shí)現(xiàn)向后兼容, 如果你曾需要改變相關(guān)數(shù)據(jù)項(xiàng)的大小. 如果你需要更大的數(shù)據(jù)結(jié)構(gòu), 但是, 你可忽略這個(gè) size 成員. 我們很快見到如何使用這個(gè)成員.頭文件 asm/, 它包含在 linux/ 中, 定義宏來幫助建立命令號(hào), 如下: _IO(type,nr)(給沒有參數(shù)的命令), _IOR(type, nre, datatype)(給從驅(qū)動(dòng)中讀數(shù)據(jù)的), _IOW(type,nr,datatype)(給寫數(shù)據(jù)), 和 _IOWR(type,nr,datatype)(給雙向傳送). type 和 number 成員作為參數(shù)被傳遞, 并且 size 成員通過應(yīng)用 sizeof 到 datatype 參數(shù)而得到.這個(gè)頭文件還定義宏, 可被用在你的驅(qū)動(dòng)中來解碼這個(gè)號(hào): _IOC_DIR(nr), _IOC_TYPE(nr), _IOC_NR(nr), 和 _IOC_SIZE(nr). 我們不進(jìn)入任何這些宏的細(xì)節(jié), 因?yàn)轭^文件是清楚的, 并且在本節(jié)稍后有例子代碼展示.這里是一些 ioctl 命令如何在 scull 被定義的. 特別地, 這些命令設(shè)置和獲得驅(qū)動(dòng)的可配置參數(shù)./* Use 39。 as magic number */define SCULL_IOC_MAGIC 39。/* Please use a different 8bit number in your code */define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)/* * S means Set through a ptr, * T means Tell directly with the argument value * G means Get: reply by setting through a pointer * Q means Query: response is on the return value * X means eXchange: switch G and S atomically * H means sHift: switch T and Q atomically */define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, int)define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)define SCULL_IOCUANTUM _IO(SCULL_IOC_MAGIC, 7)define SCULL_IOCSET _IO(SCULL_IOC_MAGIC, 8)define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC, 11)define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)define SCULL_IOC_MAXNR 14真正的源文件定義幾個(gè)額外的這里沒有出現(xiàn)的命令.我們選
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1