嵌入式Linux系統設備驅動(dòng)程序的開(kāi)發(fā)
引言
本文引用地址:http://dyxdggzs.com/article/171494.htmLinux是一個(gè)遵循POSIX標準的免費操作系統。具有BSD和SYSV的擴展特性。與其他操作系統相比,嵌入式Linux系統以其可應用于多種硬件平臺、內核高效穩定、源碼開(kāi)放、軟件豐富、網(wǎng)絡(luò )通信和文件管理機制完善等優(yōu)良特性而正被作為研究熱點(diǎn),越來(lái)越多的研究人員采用Linux平臺來(lái)開(kāi)發(fā)自己的產(chǎn)品。Linux設備驅動(dòng)程序在Linux內核源代碼中占有很大比例,從2.0、2.2到 2.4版本的內核,源代碼的長(cháng)度日益增加,其實(shí)主要是設備驅動(dòng)程序在增加。
設備驅動(dòng)程序的編寫(xiě)
設備驅動(dòng)程序是linux內核的一部分,是操作系統內核和機器硬件之間的接口,它由一組函數和一些私有數據組成,是連接應用程序與具體硬件的橋梁。Linux的一個(gè)基本特點(diǎn)是它對硬件設備的管理抽象化,系統中的每一個(gè)設備都用一個(gè)特殊的文件來(lái)表示。所有的硬件設備都像普通的文件一樣看待,使用與操作系統相同的標準系統來(lái)進(jìn)行打開(kāi)、讀寫(xiě)和關(guān)閉。
在Linux 操作系統下有3類(lèi)主要的設備文件類(lèi)型:塊設備、字符設備、網(wǎng)絡(luò )設備。字符設備是指存取時(shí)沒(méi)有緩存的設備??上裎募粯釉L(fǎng)問(wèn)字符設備,字符設備驅動(dòng)程序負責實(shí)現這些行為。系統的控制臺和并口就是字符設備的例子,它們可以很好地用“流”來(lái)描述。塊設備是文件系統的宿主,如磁盤(pán)。 Linux允許像字符設備那樣讀取塊設備——允許一次傳輸任意數目的字節。結果是,字符設備和塊設備讀取數方式一致。而網(wǎng)絡(luò )設備不同于字符設備和塊設備, 它面向的上一層不是文件系統而是網(wǎng)絡(luò )協(xié)議層,是通過(guò)BSD套接口訪(fǎng)問(wèn)數據。與設備相對應的是三類(lèi)設備驅動(dòng)程序,字符設備驅動(dòng)程序、塊設備驅動(dòng)程序、網(wǎng)絡(luò )設備驅動(dòng)程序。
字符設備驅動(dòng)程序、塊設備驅動(dòng)程序與網(wǎng)絡(luò )設備驅動(dòng)程序的結構體是不同的。
在linux 源代碼linux/ include / linux/ fs. h中定義了字符設備和塊設備驅動(dòng)程序中必須使用的file_operations結構,每個(gè)設備驅動(dòng)都實(shí)現這個(gè)接口所定義的部分或全部函數。隨著(zhù)內核的不斷升級, file_operations結構也越來(lái)越大,不同的版本的內核會(huì )稍有不同。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 *) ;
應用程序只有通過(guò)對設備文件的open、release、read、write、ioctl等才能訪(fǎng)問(wèn)字符設備和塊設備。用戶(hù)自己定義好 file_operations結構后,編寫(xiě)出設備實(shí)際所需要的各操作函數,對于不需要的操作函數用NULL初始化,這些操作函數將被注冊到內核,當應用程序對設備相應的設備文件進(jìn)行文件操作時(shí),內核會(huì )找到相應的操作函數,并進(jìn)行調用。如果操作函數使用NULL,操作函數就進(jìn)行默認處理。
對于字符設備而言,llseek( ),read( ),write(),ioctl( ),open( ),release( )這些函數是不可缺的;對于塊設備,open( ),release( ),ioctl(),check_media_change( ),revalidate( )是不可缺少的。
網(wǎng)絡(luò )設備結構體 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操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論