工作需要寫了我們公司一塊網卡的Linux驅動程式。經曆一個從無到有的過程,深感技術交流的重要。Linux作為挑戰微軟壟斷的強有力武器,日益受到 大家的喜愛。真希望她能在中國迅速成長。把程式文檔貼出來,希望和大家探討Linux技術和應用,促進Linux在中國的普及。 本文可隨意轉載,但請不要在盈利性出版物上刊登。
一.Linux系統裝置驅動程式概述 1.1 Linux裝置驅動程式分類 Linux裝置驅動程式在Linux的核心原始碼中佔有很大的比例,原始碼的長度日益增加,主要是驅動程式的增加。在Linux核心的不斷升級過程中, 驅動程式的結構還是相對穩定。在2.0.xx到2.2.xx的變動裡,驅動程式的編寫做了一些改變,但是從2.0.xx的驅動到2.2.xx的移植只需做 少量的工作。 Linux系統的裝置分為字元裝置(char device),塊裝置(block device)和網路裝置(network device)三種。字元裝置是指存取時沒有緩衝的裝置。塊裝置的讀寫都有緩衝來支援,並且塊裝置必須能夠隨機存取(random access),字元裝置則沒有這個要求。典型的字元裝置包括滑鼠,鍵盤,串列口等。塊裝置主要包括硬碟磁碟片裝置,CD-ROM等。一個檔案系統要安裝進 入作業系統必須在塊裝置上。 網路裝置在Linux裡做專門的處理。Linux的網路系統主要是基於BSD unix的socket機制。在系統和驅動程式之間定義有專門的資料結構(sk_buff)進行資料的傳遞。系統裡支援對發送資料和接收資料的緩衝,提供流量控制機制,提供對多協議的支援。 1.2 編寫驅動程式的一些基本概念 無論是什麼作業系統的驅動程式,都有一些通用的概念。作業系統提供給驅動程式的支援也大致相同。下面簡單介紹一下網路裝置驅動程式的一些基本要求。 1.2.1 發送和接收 這是一個網路裝置最基本的功能。一塊網卡所做的無非就是收發工作。所以驅動程式裡要告訴系統你的發送函數在哪裡,系統在有資料要發送時就會調用你的發送 程式。還有驅動程式由於是直接操縱硬體的,所以網路硬體有資料收到最先能得到這個資料的也就是驅動程式,它負責把這些未經處理資料進行必要的處理然後送給系 統。這裡,作業系統必須要提供兩個機制,一個是找到驅動程式的發送函數,一個是驅動程式把收到的資料送給系統。是驅動程式把收到的資料送給系統。 1.2.2 中斷 中斷在現代電腦結構中有重要的地位。作業系統必須提供驅動程式響應中斷的能力。一般是把一個中斷處理常式註冊到系統中去。作業系統在硬體中斷髮生後調用驅動程式的處理常式。Linux支援中斷的共用,即多個裝置共用一個中斷。 1.2.3 時鐘 在實現驅動程式時,很多地方會用到時鐘。如某些協議裡的逾時處理,沒有中斷機制的硬體的輪詢等。作業系統應為驅動程式提供定時機制。一般是在預定的時間 過了以後回調註冊的時鐘函數。在網路驅動程式中,如果硬體沒有中斷功能,定時器可以提供輪詢(poll)方式對硬體進行存取。或者是實現某些協議時需要的 逾時重傳等。 |