亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? (ldd) ch03-字符設備驅動程序(轉載).txt

?? 獻給ARM初學者
?? TXT
?? 第 1 頁 / 共 4 頁
字號:
(LDD) Ch03-字符設備驅動程序(轉載)

第3章 字符設備驅動程序
       
       
      本章的目標是編寫一個完整的字符設備驅動程序。由于這類驅動程序適合于大多數簡單
      的硬件設備,我們首先開放一個字符設備驅動程序。字符也相對比較好理解,比如說塊
      設備驅動程序。我們的最終目標是寫一個模塊化的字符設備驅動程序,但本章我們不再
      講述有關模塊化的問題。
       
      本章通篇都是從一個真實的設備驅動程序截取出的代碼塊:這個設備就是scull,是“Si
      mple Character Utility for Loading Localities”的縮寫。盡管scull是一個設備,
      但它卻是操作內存的字符設備。這種情況的一個副作用就是,只要涉及scull,“設備”
      這個詞就可以同“scull使用的內存區”互換使用。
       
      scull的優點是,由于每臺電腦都有內存,所以它與硬件無關。scull用kmalloc分配內存
      ,而且僅僅操作內存。任何人都可以編譯和運行scull,而且scull可以移植到所有Linux

      ,而且僅僅操作內存。任何人都可以編譯和運行scull,而且scull可以移植到所有Linux
      支持的平臺上。但另一方面,除了演示內核于字符設備驅動程序間的交互過程,可以讓
      用戶運行某些測試例程外,scull做不了“有用的”事。
       
      scull的設計
      編寫設備驅動程序的第一步就是定義驅動程序提供給用戶程序的能力(“機制”)。由
      于我們的“設備”是電腦內存的一部分,我做什么都可以。它可以是順便存取設備,也
      可以是隨機存取設備,可以是一個設備,也可以是多個,等等。
       
      為了是scull更有用,可以成為編寫真實設備的驅動程序的模板,我將向你展示如何在電
      腦的內存之上實現若干設備抽象操作,每一種操作都有自己的特點。
       
      scull的源碼實現如下設備。由模塊實現的每一種設備都涉及一種類型:
       
      scull0-3
       
      4個設備,共保護了4片內存區,都是全局性的和持久性的。“全局性”是指,如果打開
      設備多次,所有打開它的文件描述符共享其中的數據。“持久性”是指,如果設備關閉
      后再次打開,數據不丟失。由于可以使用常用命令訪問這個設備,如cp,cat以及shell
      I/O重定向等,這個設備操作非常有趣;本章將深入探討它的內部結構。
       
      scullpipe0-3
       

       
      4個“fifo”設備,操作起來有點象管道。一個進程讀取另一個進程寫入的數據。如果有
      多個進程讀同一個設備,他們彼此間競爭數據。通過scullpipe的內部結構可以了解阻塞
      型和非阻塞型讀/寫是如何實現的;沒有中斷也會出現這樣的情況。盡管真實的驅動程序
      利用中斷與它們的設備同步,但阻塞型和非阻塞型操作是非常重要的內容,從概念上講
      與中斷處理(第9章,中斷處理,介紹)無關。
       
      scullsingle
       
      scullpriv
       
      sculluid
       
      scullwuid
       
      這些設備與scull0相似,但在何時允許open操作時都不同方式的限制。第一個(scullsi
      ngle)只允許一次一個進程使用驅動程序,而scullpriv對每個虛擬控制臺是私有的(每
      個設備對虛擬控制臺是私有的)。sculluid和scullwuid可以多次打開,但每次只能有一
      個用戶;如果另一個用戶鎖住了設備,前者返回-EBUSY,而后者則實現為阻塞型open。
      通過這些可以展示如何實現不同的訪問策略。
       
      每一個scull設備都展示了驅動程序不同的功能,而且都不同的難度。本章主要講解scul
      l0-3的內部結構;第5章,字符設備驅動程序的擴展操作,將介紹更復雜的設備: “一

      l0-3的內部結構;第5章,字符設備驅動程序的擴展操作,將介紹更復雜的設備: “一
      個樣例實現:scullpipe”介紹scullpipe,“設備文件的訪問控制”介紹其他設備。
       
      主設備號和次設備號
      通過訪問文件系統的名字(或“節點”)訪問字符設備,通常這些文件位于/dev目錄。
      設備文件是特殊文件,這一點可以通過ls -l輸出的第一列中的“c”標明,它說明它們
      是字符節點。/dev下還有塊設備,但它們的第一列是“b”;盡管如下介紹的某些內容也
      同樣適用于塊設備,現在我們只關注字符設備。如果你執行ls命令,在設備文件條目的
      最新修改日期前你會看到兩個數(用逗號分隔),這個位置通常顯示文件長度。這些數
      就是相應設備的主設備號和次設備號。下面的列表給出了我使用的系統上的一些設備。
      它們的主設備號是10,1和4,而次設備號是0,3,5,64-65和128-129。
       
      (代碼)
       
      主設備號標識設備對應的驅動程序。例如,/dev/null和/dev/zero都有驅動程序1管理,
      而所有的tty和pty都由驅動程序4管理。內核利用主設備號將設備與相應的驅動程序對應
      起來。
       
      次設備號只由設備驅動程序使用;內核的其他部分不使用它,僅將它傳遞給驅動程序。
      一個驅動程序控制若干個設備并不為奇(如上面的例子所示)――次順便號提供了一種
      區分它們的方法。
       
      向系統增加一個驅動程序意味著要賦予它一個主設備號。這一賦值過程應該在驅動程序

      向系統增加一個驅動程序意味著要賦予它一個主設備號。這一賦值過程應該在驅動程序
      (模塊)的初始化過程中完成,它調用如下函數,這個函數定義在<linux/fs.h>:
       
      (代碼)
       
      返回值是錯誤碼。當出錯時返回一個負值;成功時返回零或正值。參數major是所請求的
      主設備號,name是你的設備的名字,它將在/proc/devices中出現,fops是一個指向跳轉
      表的指針,利用這個跳轉表完成對設備函數的調用,本章稍后將在“文件操作”一節中
      介紹這些函數。
       
      主設備號是一個用來索引靜態字符設備數組的整數。在1.2.13和早期的2.x內核中,這個
      數組有64項,而2.0.6到2.1.11的內核則升至128。由于只有設備才處理次設備號,regis
      ter_chrdev不傳遞次設備號。
       
      一旦設備已經注冊到內核表中,無論何時操作與你的設備驅動程序的主設備號匹配的設
      備文件,內核都會通過在fops跳轉表索引調用驅動程序中的正確函數。
       
      接下來的問題就是如何給程序一個它們可以請求你的設備驅動程序的名字。這個名字必
      須插入到/dev目錄中,并與你的驅動程序的主設備號和次設備號相連。
       
      在文件系統上創建一個設備節點的命令是mknod,而且你必須是超級用戶才能創建設備。
      除了要創建的節點名字外,該命令還帶三個參數。例如,命令:
       

       
      (代碼)
       
      創建一個字符設備(c),主設備號是127,次設備號是0。由于歷史原因,次設備號應該
      在0-255范圍內,有時它們存儲在一個字節中。存在很多原因擴展可使用的次設備號的范
      圍,但就現在而言,仍然有8位限制。
       
      動態分配主設備號
      某些主設備號已經靜態地分配給了大部分公用設備。在內核源碼樹的Documentation/dev
      ice.txt文件中可以找到這些設備的列表。由于許多數字已經分配了,為新設備選擇一個
      唯一的號碼是很困難的――不同的設備要不主設備號多得多。
       
      很幸運(或是感謝某些人天才),你可以動態分配主設備號了。如果你調用register_ch
      rdev時的major為零的話,這個函數就會選擇一個空閑號碼并做為返回值返回。主設備號
      總是正的,因此不會和錯誤碼混淆。
       
      我強烈推薦你不要隨便選擇一個一個當前不用的設備號做為主設備號,而使用動態分配
      機制獲取你的主設備號。
       
      動態分配的缺點是,由于分配給你的主設備號不能保證總是一樣的,無法事先創建設備
      節點。然而這不是什么問題,這是因為一旦分配了設備號,你就可以從/proc/devices讀
      到。為了加載一個設備驅動程序,對insmod的調用被替換為一個簡單的腳本,它通過/pr
      oc/devices獲得新分配的主設備號,并創建節點。

      oc/devices獲得新分配的主設備號,并創建節點。
       
      /proc/devices一般如下所示:
       
      (代碼)
       
      加載動態分配主設備號驅動程序的腳本可以利用象awk這類工具從/proc/devices中獲取
      信息,并在/dev中創建文件。
       
      下面這個腳本,scull_load,是scull發行中的一部分。使用以模塊形式發行的驅動程序
      的用戶可以在/etc/rc.d/rc.local中調用這個腳本,或是在需要模塊時手工調用。此外
      還有另一種方法:使用kerneld。這個方法和其他模塊的高級功能將在第11章“Kerneld
      和高級模塊化”中介紹。
       
      (代碼)
       
      這個腳本同樣可以適用于其他驅動程序,只要重新定義變量和調整mknod那幾行就可以了
      。上面那個腳本創建4個設備,4是scull源碼中的默認值。
       
      腳本的最后兩行看起來有點怪怪的:為什么要改變設備的組和權限呢?原因是這樣的,
      由root創建的節點自然也屬于root。默認權限位只允許root對其有寫訪問權,而其他只
      有讀權限。正常情況下,設備節點需要不同的策略,因此需要進行某些修改。通常允許
      一組用戶訪問對設備,但實現細節卻依賴于設備和系統管理員。安全是個大問題,這超

      一組用戶訪問對設備,但實現細節卻依賴于設備和系統管理員。安全是個大問題,這超
      出了本書的范圍。scull_load中的chmod和chgrp那兩行僅僅是最為處理權限問題的一點
      提示。稍后,在第5章的“設備文件的訪問控制”一節中將介紹sculluid源碼,展示設備
      驅動程序如何實現自己的設備訪問授權。
       
      如果重復地創建和刪除/dev節點似乎有點過分的話,有一個解決的方法。如果你看了內
      核源碼fs/devices.c的話,你可以看到動態設備號是從127(或63)之后開始的,你可以
      用127做為主設備號創建一個長命節點,同時可以避免在每次相關設備加載時調用腳本。
      如果你使用了幾個動態設備,或是新版本的內核改變了動態分配的特性,這個技巧就不
      能用了。(如果內核發生了修改,基于內核內部結構編寫的代碼并不能保證繼續可以工
      作。)不管怎樣,由于開發期間模塊要不斷地加載 托對 ,你會發現這一技術在開發期
      間還是很有用的。
       
      就我看來,分配主設備號的最佳方式是,默認采用動態分配,同時留給你在加載時,甚
      至是編譯時,指定主設備號的余地。使用我建議的代碼將與自動端口探測的代碼十分相
      似。scull的實現使用了一個全局變量,scull_major,來保存所選擇的設備號。該變量
      的默認值是SCULL_MAJOR,在所發行的源碼中為0,即“選擇動態分配”。用戶可以使用
      這個默認值或選擇某個特定的主設備號,既可以在編譯前修改宏定義,也可以在ins_mod
      命令行中指定。最后,通過使用scull_load腳本,用戶可以在scull_load中命令行中將
      參數傳遞給insmod。
       

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品久久久久久久久老牛影院| 成人视屏免费看| 亚洲欧美日韩人成在线播放| 国产欧美1区2区3区| 久久久久九九视频| 国产婷婷色一区二区三区在线| 日韩精品资源二区在线| 91精品国产综合久久久蜜臀粉嫩| 欧美精选一区二区| 欧美一区二区三区人| 日韩一级精品视频在线观看| 91精品国产91久久久久久一区二区 | 国产亚洲精品久| 久久久久久久电影| 国产精品久久久久久久久图文区 | 樱花草国产18久久久久| 亚洲免费在线视频| 日韩高清一区在线| 极品美女销魂一区二区三区 | 麻豆91在线看| 国产精品91一区二区| 成人动漫一区二区| 欧美午夜精品免费| 日韩一区二区影院| 国产亚洲视频系列| 中文字幕一区二区三区不卡| 一区二区三区在线播| 三级久久三级久久久| 国产美女在线精品| 欧美丝袜第三区| 久久久亚洲综合| 亚洲视频电影在线| 蜜桃91丨九色丨蝌蚪91桃色| 成人午夜大片免费观看| 欧美色图片你懂的| 国产喷白浆一区二区三区| 一个色妞综合视频在线观看| 麻豆成人久久精品二区三区小说| jvid福利写真一区二区三区| 欧美福利视频导航| 亚洲视频一区二区免费在线观看| 人人狠狠综合久久亚洲| www.欧美色图| 精品国产一区二区三区忘忧草 | 看片的网站亚洲| 99久精品国产| 久久精品这里都是精品| 三级在线观看一区二区| aaa欧美大片| 久久人人爽爽爽人久久久| 亚洲亚洲精品在线观看| 国产一二三精品| 日韩视频在线观看一区二区| 一级做a爱片久久| 成人一二三区视频| 精品国产乱码久久久久久久久 | 麻豆精品一区二区三区| 91黄视频在线| 国产精品国产a| 国产91精品一区二区麻豆亚洲| 欧美一区二区精品在线| 午夜精品视频一区| 精品国产精品一区二区夜夜嗨| 一区二区三区中文在线| 99re这里只有精品首页| 日本一区二区不卡视频| 国产精品2024| 久久久亚洲欧洲日产国码αv| 美女在线观看视频一区二区| 337p亚洲精品色噜噜噜| 亚洲午夜精品17c| 色噜噜狠狠成人网p站| 亚洲午夜久久久久| 欧美日韩一区在线观看| 亚洲图片欧美色图| 欧美综合一区二区| 亚洲一区在线电影| 欧美日韩久久久久久| 午夜精品久久久久久久99樱桃| 色狠狠av一区二区三区| 亚洲精品免费播放| 欧美三级电影在线看| 日韩高清国产一区在线| 欧美一区二区三区视频免费| 久久成人麻豆午夜电影| 精品国产一区二区亚洲人成毛片 | 国产美女精品一区二区三区| 久久综合色一综合色88| 国产成人免费av在线| 亚洲同性gay激情无套| 91免费在线看| 午夜精品福利一区二区三区av| 制服丝袜成人动漫| 国产一区二区三区精品视频| 国产精品麻豆99久久久久久| 91黄色激情网站| 日本亚洲一区二区| 国产欧美日韩在线观看| 色网综合在线观看| 天天做天天摸天天爽国产一区| 精品1区2区在线观看| 成人av电影在线网| 亚洲r级在线视频| 精品国产自在久精品国产| 99久久99精品久久久久久| 亚洲不卡在线观看| 久久久午夜精品理论片中文字幕| 99视频精品在线| 日韩av电影免费观看高清完整版 | 国产日韩精品视频一区| 欧美日韩一卡二卡三卡 | 亚洲黄色在线视频| 欧美二区三区的天堂| 国产精品538一区二区在线| 一区二区三区加勒比av| 精品粉嫩超白一线天av| youjizz久久| 久久99精品国产.久久久久久| 亚洲日本丝袜连裤袜办公室| 日韩一卡二卡三卡国产欧美| av高清久久久| 韩国三级在线一区| 亚洲第一会所有码转帖| 中文字幕精品一区| 精品人伦一区二区色婷婷| 欧美伊人久久大香线蕉综合69 | 欧美日韩高清在线播放| 国产成人精品三级麻豆| 日韩精品高清不卡| 亚洲精品网站在线观看| 欧美高清一级片在线观看| 日韩精品最新网址| 欧美电影影音先锋| 欧美在线观看18| 色诱视频网站一区| 丁香另类激情小说| 国产成人亚洲精品狼色在线| 裸体一区二区三区| 天天av天天翘天天综合网色鬼国产| 日韩理论片一区二区| 中文字幕精品三区| 国产丝袜在线精品| 久久亚洲综合av| 精品久久人人做人人爱| 日韩一区和二区| 制服丝袜av成人在线看| 欧美人与性动xxxx| 欧美精品在线视频| 91麻豆精品国产91久久久使用方法| 91久久精品一区二区三区| 91麻豆视频网站| 91网站最新地址| 91久久线看在观草草青青| 一本久久a久久免费精品不卡| 色综合天天天天做夜夜夜夜做| 波多野结衣亚洲一区| 91香蕉视频mp4| 91福利在线免费观看| 欧美少妇xxx| 欧美一区二区黄| 久久午夜电影网| 国产亚洲欧美色| 国产精品久久久久精k8| 亚洲天堂久久久久久久| 亚洲一区二区三区免费视频| 欧美成人艳星乳罩| 亚洲综合色视频| 国产在线一区观看| 国产精品国产三级国产有无不卡| 欧美一卡2卡三卡4卡5免费| 国产aⅴ精品一区二区三区色成熟| 色婷婷久久久亚洲一区二区三区| 精品欧美久久久| 亚洲成人动漫av| 91在线观看高清| 亚洲国产精品t66y| 久久99久国产精品黄毛片色诱| 欧美午夜影院一区| 中文字幕亚洲欧美在线不卡| 国产又粗又猛又爽又黄91精品| 欧美日韩在线播放| 亚洲精品久久7777| www.欧美精品一二区| 国产欧美1区2区3区| 精品一区二区三区免费毛片爱| 欧美三级蜜桃2在线观看| 亚洲精品菠萝久久久久久久| 国产.精品.日韩.另类.中文.在线.播放| 欧美一区二区三区色| 天天色综合天天| 欧美精品九九99久久| 午夜精品福利在线| 欧美日韩精品电影| 午夜精品123| 777亚洲妇女| 日韩av二区在线播放| 欧美一区二区视频在线观看2020| 性做久久久久久| 欧美猛男男办公室激情| 亚洲国产日产av|