新聞中心

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

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

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

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

        11.4塊編程

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

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

        1.編程流程說明

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

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

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

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

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

        structgendisk

        {

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

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

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

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

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

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

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

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

        file_operations結(jié)構(gòu)對應*/

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

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

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

        ……/*其他省略*/

        };

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

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



        上一頁 1 2 下一頁

        評論


        相關(guān)推薦

        推薦視頻

        更多>>

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

        關(guān)閉
        主站蜘蛛池模板: 湘潭县| 阿瓦提县| 上栗县| 雅江县| 遂川县| 手游| 高唐县| 商都县| 西宁市| 凤城市| 辉南县| 扶余县| 东丰县| 怀宁县| 集贤县| 台州市| 东阳市| 永清县| 和林格尔县| 聊城市| 宁都县| 沙河市| 九龙县| 横峰县| 尼勒克县| 舟曲县| 宁都县| 弥渡县| 浮梁县| 富平县| 虹口区| 平安县| 乌拉特后旗| 平武县| 阳城县| 嫩江县| 茌平县| 宾川县| 清水县| 高台县| 黄大仙区|