<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 嵌入式Linux設備驅動開發(fā)之:塊設備驅動編程

          嵌入式Linux設備驅動開發(fā)之:塊設備驅動編程

          作者: 時間:2013-09-13 來源:網(wǎng)絡 收藏

          本文引用地址:http://www.ex-cimer.com/article/257109.htm

          11.4塊編程

          塊設備通常指一些需要以塊(如512字節(jié))的方式寫入的設備,如IDE硬盤、SCSI硬盤、光驅等。它的驅動程序的編寫過程與字符型程序的編寫有很大的區(qū)別。

          編程接口相對復雜,不如字符設備明晰易用。塊設備驅動程序對整個系統(tǒng)的性能影響較大,速度和效率是設計塊設備驅動程要重點考慮的問題。系統(tǒng)中使用緩沖區(qū)與訪問請求的優(yōu)化管理(合并與重新排序)來提高系統(tǒng)性能。

          1.編程流程說明

          塊設備驅動程序的編寫流程同字符設備驅動程序的編寫流程很類似,也包括了注冊和使用兩部分。但與字符驅動設備所不同的是,塊設備驅動程序包括一個request請求隊列。它是當內核安排一次數(shù)據(jù)傳輸時在列表中的一個請求隊列,以最大化系統(tǒng)性能為原則進行排序。在后面的讀寫操作時會詳細講解這個函數(shù),圖11.5為塊設備驅動程序的流程圖,請讀者注意與字符設備驅動程序的區(qū)別。

          圖11.5塊設備驅動程序流程圖

          2.重要數(shù)據(jù)結構

          每個塊設備物理實體由一個gendisk結構體來表示(在/linux/genhd.h>中定義),每個gendisk可以支持多個分區(qū)。

          每個gendisk中包含了本物理實體的全部信息以及操作函數(shù)接口。整個塊設備的注冊過程是圍繞gendisk來展開的。在驅動程序中需要初始化的gendisk的一些成員如下所示。

          structgendisk

          {

          intmajor;/*主設備號*/

          intfirst_minor;/*第一個次設備號*/

          intminors;/*次設備號個數(shù),一個塊設備至少需要使用一個次設備號,而且塊設

          備的每個分區(qū)都需要一個次設備號,因此這個成員等于1,則表明該塊

          設備是不可被分區(qū)的,否則可以包含minors–1個分區(qū)。*/

          chardisk_name[32];/*塊設備名稱,在/proc/partions中顯示*/

          structhd_struct**part;/*分區(qū)表*/

          structblock_device_operations*fops;/*塊設備操作接口,與字符設備的

          file_operations結構對應*/

          structrequest_queue*queue;/*I/O請求隊列*/

          void*private_data;/*指向驅動程序私有數(shù)據(jù)*/

          sector_tcapacity;/*塊設備可包含的扇區(qū)數(shù)*/

          ……/*其他省略*/

          };

          與字符設備驅動程序一樣,塊設備驅動程序也包含一個在linux/fs.h>中定義的block_device_operations結構,其定義如下所示。

          structblock_device_operations

          {

          int(*open)(structinode*,structfile*);

          int(*release)(structinode*,structfile*);

          int(*ioctl)(structinode*,structfile*,unsigned,unsignedlong);

          long(*unlocked_ioctl)(structfile*,unsigned,unsignedlong);

          long(*compat_ioctl)(structfile*,unsigned,unsignedlong);

          int(*direct_access)(structblock_device*,sector_t,unsignedlong*);

          int(*media_changed)(structgendisk*);

          int(*revalidate_disk)(structgendisk*);

          int(*getgeo)(structblock_device*,structhd_geometry*);

          structmodule*owner;

          };

          從該結構的定義中,可以看出塊設備并不提供read()、write()等函數(shù)接口。對塊設備的讀寫請求都是以異步方式發(fā)送到設備相關的request隊列之中。

          linux相關文章:linux教程



          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();