<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:塊設備驅動(dòng)編程

嵌入式Linux設備驅動(dòng)開(kāi)發(fā)之:塊設備驅動(dòng)編程

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

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

11.4塊編程

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

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

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

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

圖11.5塊設備驅動(dòng)程序流程圖

2.重要數據結構

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

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

structgendisk

{

intmajor;/*主設備號*/

intfirst_minor;/*第一個(gè)次設備號*/

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

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

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

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

structhd_struct**part;/*分區表*/

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

file_operations結構對應*/

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

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

sector_tcapacity;/*塊設備可包含的扇區數*/

……/*其他省略*/

};

與字符設備驅動(dòng)程序一樣,塊設備驅動(dòng)程序也包含一個(gè)在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()等函數接口。對塊設備的讀寫(xiě)請求都是以異步方式發(fā)送到設備相關(guān)的request隊列之中。

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



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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>