在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:塊設(shè)備驅(qū)動(dòng)編程

            嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)之:塊設(shè)備驅(qū)動(dòng)編程

            作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

            本文引用地址:http://www.biyoush.com/article/257109.htm

            11.4塊編程

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

            編程接口相對(duì)復(fù)雜,不如字符設(shè)備明晰易用。塊設(shè)備驅(qū)動(dòng)程序?qū)φ麄€(gè)系統(tǒng)的性能影響較大,速度和效率是設(shè)計(jì)塊設(shè)備驅(qū)動(dòng)程要重點(diǎn)考慮的問(wèn)題。系統(tǒng)中使用緩沖區(qū)與訪問(wèn)請(qǐng)求的優(yōu)化管理(合并與重新排序)來(lái)提高系統(tǒng)性能。

            1.編程流程說(shuō)明

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

            圖11.5塊設(shè)備驅(qū)動(dòng)程序流程圖

            2.重要數(shù)據(jù)結(jié)構(gòu)

            每個(gè)塊設(shè)備物理實(shí)體由一個(gè)gendisk結(jié)構(gòu)體來(lái)表示(在/linux/genhd.h>中定義),每個(gè)gendisk可以支持多個(gè)分區(qū)。

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

            structgendisk

            {

            intmajor;/*主設(shè)備號(hào)*/

            intfirst_minor;/*第一個(gè)次設(shè)備號(hào)*/

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

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

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

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

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

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

            file_operations結(jié)構(gòu)對(duì)應(yīng)*/

            structrequest_queue*queue;/*I/O請(qǐng)求隊(duì)列*/

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

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

            ……/*其他省略*/

            };

            與字符設(shè)備驅(qū)動(dòng)程序一樣,塊設(shè)備驅(qū)動(dòng)程序也包含一個(gè)在linux/fs.h>中定義的block_device_operations結(jié)構(gòu),其定義如下所示。

            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;

            };

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

            linux相關(guān)文章:linux教程



            上一頁(yè) 1 2 下一頁(yè)

            評(píng)論


            相關(guān)推薦

            推薦視頻

            更多>>

            技術(shù)專區(qū)

            關(guān)閉