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

正文內(nèi)容

高級(jí)字符驅(qū)動(dòng)操作說(shuō)明-wenkub

2023-05-03 04:29:26 本頁(yè)面
 

【正文】 ctl 命令的回答. 事情已經(jīng)改變, 但是 ftl 保留為一個(gè)獨(dú)立的系統(tǒng)調(diào)用.. 可對(duì)任何文件發(fā)出的(常規(guī), 設(shè)備, FIFO, 或者 socket) 的那些./* 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è)額外的這里沒(méi)有出現(xiàn)的命令.我們選擇實(shí)現(xiàn) 2 種方法傳遞整數(shù)參數(shù): 通過(guò)指針和通過(guò)明確的值(盡管, 由于一個(gè)已存在的慣例, ioclt 應(yīng)當(dāng)通過(guò)指針交換值). 類似地, 2 種方法被用來(lái)返回一個(gè)整數(shù)值:通過(guò)指針和通過(guò)設(shè)置返回值. 這個(gè)有效只要返回值是一個(gè)正的整數(shù)。 _IOC_READ 意思是從設(shè)備讀, 因此設(shè)備必須寫到用戶空間. 注意這個(gè)成員是一個(gè)位掩碼, 因此 _IOC_READ 和 _IOC_WRITE 可使用一個(gè)邏輯 AND 操作來(lái)抽取.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/ 中, 定義宏來(lái)幫助建立命令號(hào), 如下: _IO(type,nr)(給沒(méi)有參數(shù)的命令), _IOR(type, nre, datatype)(給從驅(qū)動(dòng)中讀數(shù)據(jù)的), _IOW(type,nr,datatype)(給寫數(shù)據(jù)), 和 _IOWR(type,nr,datatype)(給雙向傳送). type 和 number 成員作為參數(shù)被傳遞, 并且 size 成員通過(guò)應(yīng)用 sizeof 到 datatype 參數(shù)而得到.這個(gè)頭文件還定義宏, 可被用在你的驅(qū)動(dòng)中來(lái)解碼這個(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。inode 和 filp 指針是對(duì)應(yīng)應(yīng)用程序傳遞的文件描述符 fd 的值, 和傳遞給 open 方法的相同參數(shù). cmd 參數(shù)從用戶那里不改變地傳下來(lái), 并且可選的參數(shù) arg 參數(shù)以一個(gè) unsigned long 的形式傳遞, 不管它是否由用戶給定為一個(gè)整數(shù)或一個(gè)指針. 如果調(diào)用程序不傳遞第 3 個(gè)參數(shù), 被驅(qū)動(dòng)操作收到的 arg 值是無(wú)定義的. 因?yàn)轭愋蜋z查在這個(gè)額外參數(shù)上被關(guān)閉, 編譯器不能警告你如果一個(gè)無(wú)效的參數(shù)被傳遞給 ioctl, 并且任何關(guān)聯(lián)的錯(cuò)誤將難以查找.如果你可能想到的, 大部分 ioctl 實(shí)現(xiàn)包括一個(gè)大的 switch 語(yǔ)句來(lái)根據(jù) cmd 參數(shù), 選擇正確的做法. 不同的命令有不同的數(shù)值, 它們常常被給予符號(hào)名來(lái)簡(jiǎn)化編碼. 符號(hào)名通過(guò)一個(gè)預(yù)處理定義來(lái)安排. 定制的驅(qū)動(dòng)常常聲明這樣的符號(hào)在它們的頭文件中。 用戶空間必須常常能夠請(qǐng)求, 例如, 設(shè)備鎖上它的門, 彈出它的介質(zhì), 報(bào)告錯(cuò)誤信息, 改變波特率, 或者自我銷毀. 這些操作常常通過(guò) ioctl 方法來(lái)支持, 它通過(guò)相同名子的系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn).在用戶空間, ioctl 系統(tǒng)調(diào)用有下面的原型:int ioctl(int fd, unsigned long cmd, ...)?!秶?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份資料《銷售經(jīng)理學(xué)院》56套講座+ 14350份資料《銷售人員培訓(xùn)學(xué)院》72套講座+ 4879份資料(20080928 16:28) 分類: 第 6 章 高級(jí)字符驅(qū)動(dòng)操作在第 3 章, 我們建立了一個(gè)完整的設(shè)備驅(qū)動(dòng), 用戶可用來(lái)寫入和讀取. 但是一個(gè)真正的設(shè)備常常提供比同步讀和寫更多的功能. 現(xiàn)在我們已裝備有調(diào)試工具如果發(fā)生錯(cuò)誤, 并且一個(gè)牢固的并發(fā)的理解來(lái)幫助避免事情進(jìn)入錯(cuò)誤 我們可安全地前進(jìn)并且創(chuàng)建一個(gè)更高級(jí)的驅(qū)動(dòng).本章檢查幾個(gè)你需要理解的概念來(lái)編寫全特性的字符設(shè)備驅(qū)動(dòng). 我們從實(shí)現(xiàn) ioctl 系統(tǒng)調(diào)用開始, 它是用作設(shè)備控制的普通接口. 接著我們進(jìn)入各種和用戶空間同步的方法。 這個(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)橛脩舫绦蚩纱嫒∷鼈冎荒芡ㄟ^(guò)硬件的門. 因此, 原型中的點(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)用的方法。 為 scull 聲明它們. 用戶程序必須, 當(dāng)然, 包含那個(gè)頭文件來(lái)存取這些符號(hào)..k39。 如同你現(xiàn)在所知道的, 在從任何系統(tǒng)調(diào)用返回時(shí), 一個(gè)正值被保留(如同我們?cè)?read 和 write 中見到的), 而一個(gè)負(fù)值被看作一個(gè)錯(cuò)誤并且被用來(lái)在用戶空間設(shè)置 errno.[]exchange和shift操作對(duì)于 scull 沒(méi)有特別的用處. 我們實(shí)現(xiàn)exchange來(lái)顯示驅(qū)動(dòng)如何結(jié)合獨(dú)立的操作到單個(gè)的原子的操作, 并且shift來(lái)連接tell和query. 有時(shí)需要象這樣的原子的測(cè)試和設(shè)置操作, 特別地, 當(dāng)應(yīng)用程序需要設(shè)置和釋放鎖.命令的明確的序號(hào)沒(méi)有特別的含義. 它只用來(lái)區(qū)分命令. 實(shí)際上, 你甚至可使用相同的序號(hào)給一個(gè)讀命令和一個(gè)寫命令, 因?yàn)閷?shí)際的 ioctl 號(hào)在方向位是不同的, 但是你沒(méi)有理由這樣做. 我們選擇在任何地方不使用命令的序號(hào)除了聲明中, 因此我們不分配一個(gè)返回值給它. 這就是為什么明確的號(hào)出現(xiàn)在之前給定的定義中. 這個(gè)例子展示了一個(gè)使用命令號(hào)的方法, 但是你有自由不這樣做.除了少數(shù)幾個(gè)預(yù)定義的命令(馬上就討論), ioctl 的 cmd 參數(shù)的值當(dāng)前不被內(nèi)核使用, 并且在將來(lái)也很不可能. 因此, 你可以, 如果你覺(jué)得懶, 避免前面展示的復(fù)雜的聲明并明確聲明一組調(diào)整數(shù)字. 另一方面, 如果你做了, 你不會(huì)從使用這些位段中獲益, 并且你會(huì)遇到困難如果你曾提交你的代碼來(lái)包含在主線內(nèi)核中. 頭文件linux/ 是這個(gè)老式方法的例子, 使用 16位的調(diào)整值來(lái)定義 ioctl 命令. 那個(gè)源代碼依靠調(diào)整數(shù)因?yàn)槭褂媚莻€(gè)時(shí)候遵循的慣例, 不是由于懶惰. 現(xiàn)在改變它可能導(dǎo)致無(wú)理由的不兼容.. 只對(duì)常規(guī)文件發(fā)出的那些.使用 ioctl 參數(shù)在看 scull 驅(qū)動(dòng)的 ioctl 代碼之前, 我們需要涉及的另一點(diǎn)是如何使用這個(gè)額外的參數(shù). 如果它是一個(gè)整數(shù), 就容易: 它可以直接使用. 如果它是一個(gè)指針, 但是, 必須小心些.當(dāng)用一個(gè)指針引用用戶空間, 我們必須確保用戶地址是有效的. 試圖存取一個(gè)沒(méi)驗(yàn)證過(guò)的用戶提供的指針可能導(dǎo)致不正確的行為, 一個(gè)內(nèi)核 oops, 系統(tǒng)崩潰, 或者安全問(wèn)題. 它是驅(qū)動(dòng)的責(zé)任來(lái)對(duì)每個(gè)它使用的用戶空間地址進(jìn)行正確的檢查, 并且返回一個(gè)錯(cuò)誤如果它是無(wú)效的.在第 3 章, 我們看了 copy_from_user 和 copy_to_user 函數(shù), 它們可用來(lái)安全地移動(dòng)數(shù)據(jù)到和從用戶空間. 這些函數(shù)也可用在 ioctl 方法中, 但是 ioctl 調(diào)用常常包含小數(shù)據(jù)項(xiàng), 可通過(guò)其他方法更有效地操作. 開始, 地址校驗(yàn)(不傳送數(shù)據(jù))由函數(shù) access_ok 實(shí)現(xiàn), 它定義在 asm/:int access_ok(int type, const void *addr, unsigned long size)。/* * extract the type and number bitfields, and don39。 is useroriented, while * access_ok is kerneloriented, so the concept of read and * write is reversed */if (_IOC_DIR(cmd) amp。if (err) return EFAULT。兼容性和受限操作存取一個(gè)設(shè)備由設(shè)備文件上的許可權(quán)控制, 并且驅(qū)動(dòng)正常地不涉及到許可權(quán)的檢查. 但是, 有些情形, 在保證給任何用戶對(duì)設(shè)備的讀寫許可的地方, 一些控制操作仍然應(yīng)當(dāng)被拒絕. 例如, 不是所有的磁帶驅(qū)動(dòng)器的用戶都應(yīng)當(dāng)能夠設(shè)置它的缺省塊大小, 并且一個(gè)已經(jīng)被給予對(duì)一個(gè)磁盤設(shè)備讀寫權(quán)限的用戶應(yīng)當(dāng)仍然可能被拒絕來(lái)格式化它. 在這樣的情況下, 驅(qū)動(dòng)必須進(jìn)行額外的檢查來(lái)確保用戶能夠進(jìn)行被請(qǐng)求的操作.傳統(tǒng)上 unix 系統(tǒng)對(duì)超級(jí)用戶帳戶限制了特權(quán)操作. 這意味著特權(quán)是一個(gè)全有或全無(wú)的東西 超級(jí)用戶可能任意做任何事情, 但是所有其他的用戶被高度限制了. Linux 內(nèi)核提供了一個(gè)更加靈活的系統(tǒng), 稱為能力. 一個(gè)基于能力的系統(tǒng)丟棄了全有或全無(wú)模式, 并且打破特權(quán)操作為獨(dú)立的子類. 這種方式, 一個(gè)特殊的用戶(或者是程序)可被授權(quán)來(lái)進(jìn)行一個(gè)特定的特權(quán)操作而不必泄漏進(jìn)行其他的, 無(wú)關(guān)的操作的能力. 內(nèi)核在許可權(quán)管理上排他地使用能力, 并且輸出 2 個(gè)系統(tǒng)調(diào)用 capget 和 capset, 來(lái)允許它們被從用戶空間管理.全部能力可在 linux/ 中找到. 這些是對(duì)系統(tǒng)唯一可用的能力。在這個(gè)任務(wù)缺乏一個(gè)更加特定的能力時(shí), CAP_SYS_ADMIN 被選擇來(lái)做這個(gè)測(cè)試..case SCULL_IOCSQUANTUM: /* Set: arg points to the value */ if (! capable (CAP_SYS_ADMIN)) return EPERM。 scull_quantum = arg。case SCULL_IOCUANTUM: /* Query: return it (it39。 retval = __get_user(scull_quantum, (int __user *)arg)。 tmp = scull_quantum。}return retval。 /* Set by pointer */ioctl(fd,SCULL_IOCTQUANTUM, quantum)。 /* Get by return value */ioctl(fd,SCULL_IOCXQUANTUM, amp。不用 ioctl 的設(shè)備控制有時(shí)控制設(shè)備最好是通過(guò)寫控制序列到設(shè)備自身來(lái)實(shí)現(xiàn). 例如, 這個(gè)技術(shù)用在控制臺(tái)驅(qū)動(dòng)中, 這里所謂的 escape 序列被用來(lái)移動(dòng)光標(biāo), 改變?nèi)笔〉念伾? 或者進(jìn)行其他的配置任務(wù). 這樣實(shí)現(xiàn)設(shè)備控制的好處是用戶可僅僅通過(guò)寫數(shù)據(jù)控制設(shè)備, 不必使用(或者有時(shí)候?qū)?只為配置設(shè)備而建立的程序. 當(dāng)設(shè)備可這樣來(lái)控制, 發(fā)
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1