Linux網(wǎng)卡驅動(dòng)程序編寫(xiě)
工作需要寫(xiě)了我們公司一塊網(wǎng)卡的Linux驅動(dòng)程序。經(jīng)歷一個(gè)從無(wú)到有的過(guò)程,深感技術(shù)交流的重要。Linux作為挑戰微軟壟斷的強有力武器,日益受到大家的喜愛(ài)。真希望她能在中國迅速成長(cháng)。把程序文檔貼出來(lái),希望和大家探討Linux技術(shù)和應用,促進(jìn)Linux在中國的普及。
本文引用地址:http://dyxdggzs.com/article/149108.htmLinux操作系統網(wǎng)絡(luò )驅動(dòng)程序編寫(xiě)
一.Linux系統設備驅動(dòng)程序概述
1.1Linux設備驅動(dòng)程序分類(lèi)
1.2編寫(xiě)驅動(dòng)程序的一些基本概念
二.Linux系統網(wǎng)絡(luò )設備驅動(dòng)程序
2.1網(wǎng)絡(luò )驅動(dòng)程序的結構
2.2網(wǎng)絡(luò )驅動(dòng)程序的基本方法
2.3網(wǎng)絡(luò )驅動(dòng)程序中用到的數據結構
2.4常用的系統支持
三.編寫(xiě)Linux網(wǎng)絡(luò )驅動(dòng)程序中可能遇到的問(wèn)題
3.1中斷共享
3.2硬件發(fā)送忙時(shí)的處理
3.3流量控制(flowcontrol)
3.4調試
四.進(jìn)一步的閱讀
五.雜項
一.Linux系統設備驅動(dòng)程序概述
1.1Linux設備驅動(dòng)程序分類(lèi)
Linux設備驅動(dòng)程序在Linux的內核源代碼中占有很大的比例,源代碼的長(cháng)度日益增加,主要是驅動(dòng)程序的增加。在Linux內核的不斷升級過(guò)程中,驅動(dòng)程序的結構還是相對穩定。在2.0.xx到2.2.xx的變動(dòng)里,驅動(dòng)程序的編寫(xiě)做了一些改變,但是從2.0.xx的驅動(dòng)到2.2.xx的移植只需做少量的工作。
Linux系統的設備分為字符設備(chardevice),塊設備(blockdevice)和網(wǎng)絡(luò )設備(networkdevice)三種。字符設備是指存取時(shí)沒(méi)有緩存的設備。塊設備的讀寫(xiě)都有緩存來(lái)支持,并且塊設備必須能夠隨機存取(randomaccess),字符設備則沒(méi)有這個(gè)要求。典型的字符設備包括鼠標,鍵盤(pán),串行口等。塊設備主要包括硬盤(pán)軟盤(pán)設備,CD-ROM等。一個(gè)文件系統要安裝進(jìn)入操作系統必須在塊設備上。
網(wǎng)絡(luò )設備在Linux里做專(zhuān)門(mén)的處理。Linux的網(wǎng)絡(luò )系統主要是基于BSDunix的socket機制。在系統和驅動(dòng)程序之間定義有專(zhuān)門(mén)的數據結構(sk_buff)進(jìn)行數據的傳遞。系統里支持對發(fā)送數據和接收數據的緩存,提供流量控制機制,提供對多協(xié)議的支持。
1.2編寫(xiě)驅動(dòng)程序的一些基本概念
無(wú)論是什么操作系統的驅動(dòng)程序,都有一些通用的概念。操作系統提供給驅動(dòng)程序的支持也大致相同。下面簡(jiǎn)單介紹一下網(wǎng)絡(luò )設備驅動(dòng)程序的一些基本要求。
1.2.1發(fā)送和接收
這是一個(gè)網(wǎng)絡(luò )設備最基本的功能。一塊網(wǎng)卡所做的無(wú)非就是收發(fā)工作。所以驅動(dòng)程序里要告訴系統你的發(fā)送函數在哪里,系統在有數據要發(fā)送時(shí)就會(huì )調用你的發(fā)送程序。還有驅動(dòng)程序由于是直接操縱硬件的,所以網(wǎng)絡(luò )硬件有數據收到最先能得到這個(gè)數據的也就是驅動(dòng)程序,它負責把這些原始數據進(jìn)行必要的處理然后送給系統。這里,操作系統必須要提供兩個(gè)機制,一個(gè)是找到驅動(dòng)程序的發(fā)送函數,一個(gè)是驅動(dòng)程序把收到的數據送給系統。
1.2.2中斷
中斷在現代計算機結構中有重要的地位。操作系統必須提供驅動(dòng)程序響應中斷的能力。一般是把一個(gè)中斷處理程序注冊到系統中去。操作系統在硬件中斷發(fā)生后調用驅動(dòng)程序的處理程序。Linux支持中斷的共享,即多個(gè)設備共享一個(gè)中斷。
1.2.3時(shí)鐘
在實(shí)現驅動(dòng)程序時(shí),很多地方會(huì )用到時(shí)鐘。如某些協(xié)議里的超時(shí)處理,沒(méi)有中斷機制的硬件的輪詢(xún)等。操作系統應為驅動(dòng)程序提供定時(shí)機制。一般是在預定的時(shí)間過(guò)了以后回調注冊的時(shí)鐘函數。在網(wǎng)絡(luò )驅動(dòng)程序中,如果硬件沒(méi)有中斷功能,定時(shí)器可以提供輪詢(xún)(poll)方式對硬件進(jìn)行存取?;蛘呤菍?shí)現某些協(xié)議時(shí)需要的超時(shí)重傳等。
二.Linux系統網(wǎng)絡(luò )設備驅動(dòng)程序
2.1網(wǎng)絡(luò )驅動(dòng)程序的結構
所有的Linux網(wǎng)絡(luò )驅動(dòng)程序遵循通用的接口。設計時(shí)采用的是面向對象的方法。一個(gè)設備就是一個(gè)對象(device結構),它內部有自己的數據和方法。每一個(gè)設備的方法被調用時(shí)的第一個(gè)參數都是這個(gè)設備對象本身。這樣這個(gè)方法就可以存取自身的數據(類(lèi)似面向對象程序設計時(shí)的this引用)。
一個(gè)網(wǎng)絡(luò )設備最基本的方法有初始化、發(fā)送和接收。
----------------------------------------
|deliverpackets||receivepacketsqueue|
|(dev_queue_xmit())||them(netif_rx())|
----------------------------------------
||/
/||
-------------------------------------------------------
|methodsandvariables(initialize,open,close,hard_xmit,|
|interrupthandler,config,resources,status...)|
-------------------------------------------------------
||/
/||
---------------------------------------
|sendtohardware||receivcefromhardware|
---------------------------------------
||/
/||
-----------------------------------------------------
|hardwaremedia|
-----------------------------------------------------
初始化程序完成硬件的初始化、device中變量的初始化和系統資源的申請。發(fā)送程序是在驅動(dòng)程序的上層協(xié)議層有數據要發(fā)送時(shí)自動(dòng)調用的。一般驅動(dòng)程序中不對發(fā)送數據進(jìn)行緩存,而是直接使用硬件的發(fā)送功能把數據發(fā)送出去。接收數據一般是通過(guò)硬件中斷來(lái)通知的。在中斷處理程序里,把硬件幀信息填入一個(gè)skbuff結構中,然后調用netif_rx()傳遞給上層處理。
2.2網(wǎng)絡(luò )驅動(dòng)程序的基本方法
網(wǎng)絡(luò )設備做為一個(gè)對象,提供一些方法供系統訪(fǎng)問(wèn)。正是這些有統一接口的方法,掩蔽了硬件的具體細節,讓系統對各種網(wǎng)絡(luò )設備的訪(fǎng)問(wèn)都采用統一的形式,做到硬件無(wú)關(guān)性。
下面解釋最基本的方法。
2.2.1初始化(initialize)
驅動(dòng)程序必須有一個(gè)初始化方法。在把驅動(dòng)程序載入系統的時(shí)候會(huì )調用這個(gè)初始化程序。它做以下幾方面的工作。檢測設備。在初始化程序里你可以根據硬件的特征檢查硬件是否存在,然后決定是否啟動(dòng)這個(gè)驅動(dòng)程序。配置和初始化硬件。在初始化程序里你可以完成對硬件資源的配置,比如即插即用的硬件就可以在這個(gè)時(shí)候進(jìn)行配置(Linux內核對PnP功能沒(méi)有很好的支持,可以在驅動(dòng)程序里完成這個(gè)功能)。配置或協(xié)商好硬件占用的資源以后,就可以向系統申請這些資源。有些資源是可以和別的設備共享的,如中斷。有些是不能共享的,如IO、DMA。接下來(lái)你要初始化device結構中的變量。最后,你可以讓硬件正式開(kāi)始工作。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論