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

正文內(nèi)容

高級字符驅(qū)動操作說明-wenkub

2023-05-03 04:29:26 本頁面
 

【正文】 ctl 命令的回答. 事情已經(jīng)改變, 但是 ftl 保留為一個獨立的系統(tǒng)調(diào)用.. 可對任何文件發(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真正的源文件定義幾個額外的這里沒有出現(xiàn)的命令.我們選擇實現(xiàn) 2 種方法傳遞整數(shù)參數(shù): 通過指針和通過明確的值(盡管, 由于一個已存在的慣例, ioclt 應(yīng)當(dāng)通過指針交換值). 類似地, 2 種方法被用來返回一個整數(shù)值:通過指針和通過設(shè)置返回值. 這個有效只要返回值是一個正的整數(shù)。 _IOC_READ 意思是從設(shè)備讀, 因此設(shè)備必須寫到用戶空間. 注意這個成員是一個位掩碼, 因此 _IOC_READ 和 _IOC_WRITE 可使用一個邏輯 AND 操作來抽取.size 涉及到的用戶數(shù)據(jù)的大小. 這個成員的寬度是依賴體系的, 但是常常是 13 或者 14 位. 你可為你的特定體系在宏 _IOC_SIZEBITS 中找到它的值. 你使用這個 size 成員不是強(qiáng)制的 內(nèi)核不檢查它 但是它是一個好主意. 正確使用這個成員可幫助檢測用戶空間程序的錯誤并使你實現(xiàn)向后兼容, 如果你曾需要改變相關(guān)數(shù)據(jù)項的大小. 如果你需要更大的數(shù)據(jù)結(jié)構(gòu), 但是, 你可忽略這個 size 成員. 我們很快見到如何使用這個成員.頭文件 asm/, 它包含在 linux/ 中, 定義宏來幫助建立命令號, 如下: _IO(type,nr)(給沒有參數(shù)的命令), _IOR(type, nre, datatype)(給從驅(qū)動中讀數(shù)據(jù)的), _IOW(type,nr,datatype)(給寫數(shù)據(jù)), 和 _IOWR(type,nr,datatype)(給雙向傳送). type 和 number 成員作為參數(shù)被傳遞, 并且 size 成員通過應(yīng)用 sizeof 到 datatype 參數(shù)而得到.這個頭文件還定義宏, 可被用在你的驅(qū)動中來解碼這個號: _IOC_DIR(nr), _IOC_TYPE(nr), _IOC_NR(nr), 和 _IOC_SIZE(nr). 我們不進(jìn)入任何這些宏的細(xì)節(jié), 因為頭文件是清楚的, 并且在本節(jié)稍后有例子代碼展示.這里是一些 ioctl 命令如何在 scull 被定義的. 特別地, 這些命令設(shè)置和獲得驅(qū)動的可配置參數(shù)./* Use 39。inode 和 filp 指針是對應(yīng)應(yīng)用程序傳遞的文件描述符 fd 的值, 和傳遞給 open 方法的相同參數(shù). cmd 參數(shù)從用戶那里不改變地傳下來, 并且可選的參數(shù) arg 參數(shù)以一個 unsigned long 的形式傳遞, 不管它是否由用戶給定為一個整數(shù)或一個指針. 如果調(diào)用程序不傳遞第 3 個參數(shù), 被驅(qū)動操作收到的 arg 值是無定義的. 因為類型檢查在這個額外參數(shù)上被關(guān)閉, 編譯器不能警告你如果一個無效的參數(shù)被傳遞給 ioctl, 并且任何關(guān)聯(lián)的錯誤將難以查找.如果你可能想到的, 大部分 ioctl 實現(xiàn)包括一個大的 switch 語句來根據(jù) cmd 參數(shù), 選擇正確的做法. 不同的命令有不同的數(shù)值, 它們常常被給予符號名來簡化編碼. 符號名通過一個預(yù)處理定義來安排. 定制的驅(qū)動常常聲明這樣的符號在它們的頭文件中。 用戶空間必須常常能夠請求, 例如, 設(shè)備鎖上它的門, 彈出它的介質(zhì), 報告錯誤信息, 改變波特率, 或者自我銷毀. 這些操作常常通過 ioctl 方法來支持, 它通過相同名子的系統(tǒng)調(diào)用來實現(xiàn).在用戶空間, ioctl 系統(tǒng)調(diào)用有下面的原型:int ioctl(int fd, unsigned long cmd, ...)?!秶鴮W(xué)智慧、易經(jīng)》46套講座《人力資源學(xué)院》56套講座+27123份資料《各階段員工培訓(xùn)學(xué)院》77套講座+ 324份資料《員工管理企業(yè)學(xué)院》67套講座+ 8720份資料《工廠生產(chǎn)管理學(xué)院》52套講座+ 13920份資料《財務(wù)管理學(xué)院》53套講座+ 17945份資料《銷售經(jīng)理學(xué)院》56套講座+ 14350份資料《銷售人員培訓(xùn)學(xué)院》72套講座+ 4879份資料(20080928 16:28) 分類: 第 6 章 高級字符驅(qū)動操作在第 3 章, 我們建立了一個完整的設(shè)備驅(qū)動, 用戶可用來寫入和讀取. 但是一個真正的設(shè)備常常提供比同步讀和寫更多的功能. 現(xiàn)在我們已裝備有調(diào)試工具如果發(fā)生錯誤, 并且一個牢固的并發(fā)的理解來幫助避免事情進(jìn)入錯誤 我們可安全地前進(jìn)并且創(chuàng)建一個更高級的驅(qū)動.本章檢查幾個你需要理解的概念來編寫全特性的字符設(shè)備驅(qū)動. 我們從實現(xiàn) ioctl 系統(tǒng)調(diào)用開始, 它是用作設(shè)備控制的普通接口. 接著我們進(jìn)入各種和用戶空間同步的方法。 這個原型由于這些點而凸現(xiàn)于 Unix 系統(tǒng)調(diào)用列表, 這些點常常表示函數(shù)有數(shù)目不定的參數(shù). 在實際系統(tǒng)中, 但是, 一個系統(tǒng)調(diào)用不能真正有變數(shù)目的參數(shù). 系統(tǒng)調(diào)用必須有一個很好定義的原型, 因為用戶程序可存取它們只能通過硬件的門. 因此, 原型中的點不表示一個變數(shù)目的參數(shù), 而是一個單個可選的參數(shù), 傳統(tǒng)上標(biāo)識為 char *argp. 這些點在那里只是為了阻止在編譯時的類型檢查. 第 3 個參數(shù)的實際特點依賴所發(fā)出的特定的控制命令( 第 2 個參數(shù) ). 一些命令不用參數(shù), 一些用一個整數(shù)值, 以及一些使用指向其他數(shù)據(jù)的指針. 使用一個指針是傳遞任意數(shù)據(jù)到 ioctl 調(diào)用的方法。 為 scull 聲明它們. 用戶程序必須, 當(dāng)然, 包含那個頭文件來存取這些符號..k39。 如同你現(xiàn)在所知道的, 在從任何系統(tǒng)調(diào)用返回時, 一個正值被保留(如同我們在 read 和 write 中見到的), 而一個負(fù)值被看作一個錯誤并且被用來在用戶空間設(shè)置 errno.[]exchange和shift操作對于 scull 沒有特別的用處. 我們實現(xiàn)exchange來顯示驅(qū)動如何結(jié)合獨立的操作到單個的原子的操作, 并且shift來連接tell和query. 有時需要象這樣的原子的測試和設(shè)置操作, 特別地, 當(dāng)應(yīng)用程序需要設(shè)置和釋放鎖.命令的明確的序號沒有特別的含義. 它只用來區(qū)分命令. 實際上, 你甚至可使用相同的序號給一個讀命令和一個寫命令, 因為實際的 ioctl 號在方向位是不同的, 但是你沒有理由這樣做. 我們選擇在任何地方不使用命令的序號除了聲明中, 因此我們不分配一個返回值給它. 這就是為什么明確的號出現(xiàn)在之前給定的定義中. 這個例子展示了一個使用命令號的方法, 但是你有自由不這樣做.除了少數(shù)幾個預(yù)定義的命令(馬上就討論), ioctl 的 cmd 參數(shù)的值當(dāng)前不被內(nèi)核使用, 并且在將來也很不可能. 因此, 你可以, 如果你覺得懶, 避免前面展示的復(fù)雜的聲明并明確聲明一組調(diào)整數(shù)字. 另一方面, 如果你做了, 你不會從使用這些位段中獲益, 并且你會遇到困難如果你曾提交你的代碼來包含在主線內(nèi)核中. 頭文件linux/ 是這個老式方法的例子, 使用 16位的調(diào)整值來定義 ioctl 命令. 那個源代碼依靠調(diào)整數(shù)因為使用那個時候遵循的慣例, 不是由于懶惰. 現(xiàn)在改變它可能導(dǎo)致無理由的不兼容.. 只對常規(guī)文件發(fā)出的那些.使用 ioctl 參數(shù)在看 scull 驅(qū)動的 ioctl 代碼之前, 我們需要涉及的另一點是如何使用這個額外的參數(shù). 如果它是一個整數(shù), 就容易: 它可以直接使用. 如果它是一個指針, 但是, 必須小心些.當(dāng)用一個指針引用用戶空間, 我們必須確保用戶地址是有效的. 試圖存取一個沒驗證過的用戶提供的指針可能導(dǎo)致不正確的行為, 一個內(nèi)核 oops, 系統(tǒng)崩潰, 或者安全問題. 它是驅(qū)動的責(zé)任來對每個它使用的用戶空間地址進(jìn)行正確的檢查, 并且返回一個錯誤如果它是無效的.在第 3 章, 我們看了 copy_from_user 和 copy_to_user 函數(shù), 它們可用來安全地移動數(shù)據(jù)到和從用戶空間. 這些函數(shù)也可用在 ioctl 方法中, 但是 ioctl 調(diào)用常常包含小數(shù)據(jù)項, 可通過其他方法更有效地操作. 開始, 地址校驗(不傳送數(shù)據(jù))由函數(shù) access_ok 實現(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。兼容性和受限操作存取一個設(shè)備由設(shè)備文件上的許可權(quán)控制, 并且驅(qū)動正常地不涉及到許可權(quán)的檢查. 但是, 有些情形, 在保證給任何用戶對設(shè)備的讀寫許可的地方, 一些控制操作仍然應(yīng)當(dāng)被拒絕. 例如, 不是所有的磁帶驅(qū)動器的用戶都應(yīng)當(dāng)能夠設(shè)置它的缺省塊大小, 并且一個已經(jīng)被給予對一個磁盤設(shè)備讀寫權(quán)限的用戶應(yīng)當(dāng)仍然可能被拒絕來格式化它. 在這樣的情況下, 驅(qū)動必須進(jìn)行額外的檢查來確保用戶能夠進(jìn)行被請求的操作.傳統(tǒng)上 unix 系統(tǒng)對超級用戶帳戶限制了特權(quán)操作. 這意味著特權(quán)是一個全有或全無的東西 超級用戶可能任意做任何事情, 但是所有其他的用戶被高度限制了. Linux 內(nèi)核提供了一個更加靈活的系統(tǒng), 稱為能力. 一個基于能力的系統(tǒng)丟棄了全有或全無模式, 并且打破特權(quán)操作為獨立的子類. 這種方式, 一個特殊的用戶(或者是程序)可被授權(quán)來進(jìn)行一個特定的特權(quán)操作而不必泄漏進(jìn)行其他的, 無關(guān)的操作的能力. 內(nèi)核在許可權(quán)管理上排他地使用能力, 并且輸出 2 個系統(tǒng)調(diào)用 capget 和 capset, 來允許它們被從用戶空間管理.全部能力可在 linux/ 中找到. 這些是對系統(tǒng)唯一可用的能力。在這個任務(wù)缺乏一個更加特定的能力時, CAP_SYS_ADMIN 被選擇來做這個測試..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è)備自身來實現(xiàn). 例如, 這個技術(shù)用在控制臺驅(qū)動中, 這里所謂的 escape 序列被用來移動光標(biāo), 改變?nèi)笔〉念伾? 或者進(jìn)行其他的配置任務(wù). 這樣實現(xiàn)設(shè)備控制的好處是用戶可僅僅通過寫數(shù)據(jù)控制設(shè)備, 不必使用(或者有時候?qū)?只為配置設(shè)備而建立的程序. 當(dāng)設(shè)備可這樣來控制, 發(fā)
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1