<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 嵌入式Linux系統(tǒng)設(shè)備驅(qū)動程序的開發(fā)

          嵌入式Linux系統(tǒng)設(shè)備驅(qū)動程序的開發(fā)

          作者: 時間:2012-05-08 來源:網(wǎng)絡(luò) 收藏

          引言

          本文引用地址:http://www.ex-cimer.com/article/171494.htm

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

          的編寫

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

          在Linux 操作系統(tǒng)下有3類主要的設(shè)備文件類型:塊設(shè)備、字符設(shè)備、網(wǎng)絡(luò)設(shè)備。字符設(shè)備是指存取時沒有緩存的設(shè)備??上裎募粯釉L問字符設(shè)備,字符設(shè)備驅(qū)動程序負責(zé)實現(xiàn)這些行為。系統(tǒng)的控制臺和并口就是字符設(shè)備的例子,它們可以很好地用“流”來描述。塊設(shè)備是文件系統(tǒng)的宿主,如磁盤。 Linux允許像字符設(shè)備那樣讀取塊設(shè)備——允許一次傳輸任意數(shù)目的字節(jié)。結(jié)果是,字符設(shè)備和塊設(shè)備讀取數(shù)方式一致。而網(wǎng)絡(luò)設(shè)備不同于字符設(shè)備和塊設(shè)備, 它面向的上一層不是文件系統(tǒng)而是網(wǎng)絡(luò)協(xié)議層,是通過BSD套接口訪問數(shù)據(jù)。與設(shè)備相對應(yīng)的是三類設(shè)備驅(qū)動程序,字符設(shè)備驅(qū)動程序、塊設(shè)備驅(qū)動程序、網(wǎng)絡(luò)設(shè)備驅(qū)動程序。

          字符設(shè)備驅(qū)動程序、塊設(shè)備驅(qū)動程序與網(wǎng)絡(luò)設(shè)備驅(qū)動程序的結(jié)構(gòu)體是不同的。

          在linux 源代碼linux/ include / linux/ fs. h中定義了字符設(shè)備和塊設(shè)備驅(qū)動程序中必須使用的file_operations結(jié)構(gòu),每個設(shè)備驅(qū)動都實現(xiàn)這個接口所定義的部分或全部函數(shù)。隨著內(nèi)核的不斷升級, file_operations結(jié)構(gòu)也越來越大,不同的版本的內(nèi)核會稍有不同。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 *) ;

          應(yīng)用程序只有通過對設(shè)備文件的open、release、read、write、ioctl等才能訪問字符設(shè)備和塊設(shè)備。用戶自己定義好 file_operations結(jié)構(gòu)后,編寫出設(shè)備實際所需要的各操作函數(shù),對于不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊到內(nèi)核,當(dāng)應(yīng)用程序?qū)υO(shè)備相應(yīng)的設(shè)備文件進行文件操作時,內(nèi)核會找到相應(yīng)的操作函數(shù),并進行調(diào)用。如果操作函數(shù)使用NULL,操作函數(shù)就進行默認處理。

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

          網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)體 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操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();