<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

3.塊設備注冊和初始化

塊設備的初始化過(guò)程要比字符設備復雜,它既需要像字符設備一樣在加載內核時(shí)完成一定的工作,還需要在內核編譯時(shí)增加一些內容。塊程序初始化時(shí),由驅動(dòng)程序的init()完成。

塊設備的初始化過(guò)程如圖11.6所示。

圖11.6塊程序初始化過(guò)程

(1)向內核注冊。

使用register_blkdev()函數對設備進(jìn)行注冊。

intregister_blkdev(unsignedintmajor,constchar*name);

其中參數major為要注冊的塊設備的主設備號,如果其值等于0,則系統動(dòng)態(tài)分配并返回主設備號。參數name為設備名,在/proc/devices中顯示。如果出錯,則該函數返回負值。

與其對應的塊設備的注銷(xiāo)函數為unregister_blkdev(),其格式如下所示。

intunregister_blkdev(unsignedintmajor,constchar*name);

其參數必須與注冊函數中的參數相同。如果出錯則返回負值。

(2)申請并初始化請求隊列。

這一步要調用blk_init_queue()函數來(lái)申請并初始化請求隊列,其格式如下所示。

structrequest_queue*blk_init_queue(request_fn_proc*rfn,spinlock_t*lock)

其中參數rfn是請求隊列的處理函數指針,它負責執行塊設備的讀、寫(xiě)請求。參數lock為自旋鎖,用于控制對所分配的隊列的訪(fǎng)問(wèn)。

(3)初始化并注冊gendisk結構。

內核提供的gendisk結構相關(guān)函數如表11-16所示。

表11-16 gendisk結構相關(guān)函數

函數格式

說(shuō)明

structgendisk*alloc_disk(intminors)

動(dòng)態(tài)分配gendisk結構,參數為次設備號的個(gè)數

voidadd_disk(structgendisk*disk)

向系統注冊gendisk結構

voiddel_gendisk(structgendisk*disk)

從系統注銷(xiāo)gendisk結構

首先使用alloc_disk()函數動(dòng)態(tài)分配gendisk結構,接下來(lái),對gendisk結構的主設備號(major)、次設備號相關(guān)成員(first_minor和minors)、塊設備操作函數(fops)、請求隊列(queue)、可包含的扇區數(capacity)以及設備名稱(chēng)(disk_name)等成員進(jìn)行初始化。

在完成對gendisk的分配和初始化之后,調用add_disk()函數向系統注冊塊設備。在卸載gendisk結構的時(shí)候,要調用del_gendisk()函數。

4.塊設備請求處理

中一般要實(shí)現一個(gè)請求隊列處理函數來(lái)處理隊列中的請求。從塊設備的運行流程,可知請求處理是塊設備的基本處理單位,也是最核心的部分。對塊設備的讀寫(xiě)操作被封裝到了每一個(gè)請求中。

已經(jīng)提過(guò)調用blk_init_queue()函數來(lái)申請并初始化請求隊列。表11-17列出了一些與請求處理相關(guān)的函數。

表11-17 請求處理相關(guān)函數

函數格式

說(shuō)明

request_queue_t*blk_alloc_queue(intgfp_mask)

分配請求隊列

request_queue_t*blk_init_queue
(request_fn_proc*rfn,spinlock_t*lock)

分配并初始化請求隊列

structrequest*blk_get_request
(request_queue_t*q,intrw,intgfp_mask)

從隊列中獲取一個(gè)請求

voidblk_requeue_request(request_queue_t*q,structrequest*rq)

將請求再次加入隊列

voidblk_queue_max_sectors
(request_queue_t*q,unsignedshortmax_sectors)

設置最大訪(fǎng)問(wèn)扇區數

voidblk_queue_max_phys_segments
(request_queue_t*q,unsignedshortmax_segments)

設置最大物理段數

voidend_request(structrequest*req,intuptodate)

結束本次請求處理

voidblk_queue_hardsect_size
(request_queue_t*q,unsignedshortsize)

設置物理扇區大小

以上簡(jiǎn)單地介紹了的最基本的概念和流程。更深入的內容不是本書(shū)的重點(diǎn),有興趣的讀者可以參考其他書(shū)籍。

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>