新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux系統設備驅動程序的開發

        嵌入式Linux系統設備驅動程序的開發

        作者: 時間:2012-05-08 來源:網絡 收藏

        引言

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

        是一個遵循POSIX標準的免費操作。具有BSD和SYSV的擴展特性。與其他操作相比,以其可應用于多種硬件平臺、內核高效穩定、源碼開放、軟件豐富、網絡通信和文件管理機制完善等優良特性而正被作為研究熱點,越來越多的研究人員采用平臺來自己的產品。Linux在Linux內核源代碼中占有很大比例,從2.0、2.2到 2.4版本的內核,源代碼的長度日益增加,其實主要是在增加。

        的編寫

        設備驅動程序是linux內核的一部分,是操作系統內核和機器硬件之間的接口,它由一組函數和一些私有數據組成,是連接應用程序與具體硬件的橋梁。Linux的一個基本特點是它對硬件設備的管理抽象化,系統中的每一個設備都用一個特殊的文件來表示。所有的硬件設備都像普通的文件一樣看待,使用與操作系統相同的標準系統來進行打開、讀寫和關閉。

        在Linux 操作系統下有3類主要的設備文件類型:塊設備、字符設備、網絡設備。字符設備是指存取時沒有緩存的設備。可像文件一樣訪問字符設備,字符設備驅動程序負責實現這些行為。系統的控制臺和并口就是字符設備的例子,它們可以很好地用“流”來描述。塊設備是文件系統的宿主,如磁盤。 Linux允許像字符設備那樣讀取塊設備——允許一次傳輸任意數目的字節。結果是,字符設備和塊設備讀取數方式一致。而網絡設備不同于字符設備和塊設備, 它面向的上一層不是文件系統而是網絡協議層,是通過BSD套接口訪問數據。與設備相對應的是三類設備驅動程序,字符設備驅動程序、塊設備驅動程序、網絡設備驅動程序。

        字符設備驅動程序、塊設備驅動程序與網絡設備驅動程序的結構體是不同的。

        在linux 源代碼linux/ include / linux/ fs. h中定義了字符設備和塊設備驅動程序中必須使用的file_operations結構,每個設備驅動都實現這個接口所定義的部分或全部函數。隨著內核的不斷升級, file_operations結構也越來越大,不同的版本的內核會稍有不同。file_operations定義如下:

        struct file_operations{

        int( * lseek) ( struct inode * , struct file * , off_t , int) ; int( *release) ( struct inode * , struct file * ) ;

        int( * read) ( struct inode * , struct file * , char * , int) ; int( * fsync) ( struct inode *, struct file * ) ;

        int( *write) ( struct inode * , struct file * , const char *, int) ; int( * fasync) ( struct inode * , struct file *, int) ;

        int( * readdir) ( struct inode , struct file , void * , dilldir) ; int( *check_media_change) ( kdev_t dev) ;

        int(*select) ( struct inode *, struct file * , int, select_table * ) ; int( * revalidate) ( kdev_t dev) ; };

        int ( * ioctl) ( struct inode * , struct file *, unsigned int, unsigned long) ;

        int( *mmap) ( struct inode * , struct file * , struct vm_area_struct * ) ;

        int( * open) ( struct inode *, struct file *) ;

        應用程序只有通過對設備文件的open、release、read、write、ioctl等才能訪問字符設備和塊設備。用戶自己定義好 file_operations結構后,編寫出設備實際所需要的各操作函數,對于不需要的操作函數用NULL初始化,這些操作函數將被注冊到內核,當應用程序對設備相應的設備文件進行文件操作時,內核會找到相應的操作函數,并進行調用。如果操作函數使用NULL,操作函數就進行默認處理。

        對于字符設備而言,llseek( ),read( ),write(),ioctl( ),open( ),release( )這些函數是不可缺的;對于塊設備,open( ),release( ),ioctl(),check_media_change( ),revalidate( )是不可缺少的。

        網絡設備結構體 net_device 定義在 includelinuxnetdevice.h 里,如下所示:

        struct net_device

        {

        char name ; int (*init)(struct

        net_device *dev);

        unsigned short flags ; int (*open)

        (struct net_device *dev);

        unsigned long base_addr; int

        (*stop)(struct net_device *dev)

        unsigned int irq ; int

        (*hard_start_xmit)(struct sk_buff *skb,

        unsigned char dev_addr; struct

        net_device *dev);

        unsigned char addr_len; int

        (*set_mac_address)( struct net_device

        unsigned long trans_start; *dev,void* addr);

        ……

        }

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泉州市| 大关县| 莎车县| 兴化市| 东丰县| 民丰县| 盘山县| 罗城| 长沙县| 舒兰市| 泾阳县| 涡阳县| 贡嘎县| 湾仔区| 京山县| 开化县| 龙井市| 昆山市| 阿拉善盟| 安溪县| 土默特右旗| 界首市| 四子王旗| 崇文区| 静海县| 噶尔县| 闽清县| 额尔古纳市| 图木舒克市| 蒲江县| 句容市| 宜宾县| 垦利县| 鄯善县| 伊宁县| 时尚| 赣榆县| 民县| 波密县| 嘉义市| 无极县|