没有合适的资源?快使用搜索试试~ 我知道了~
Linux 網路卡驅動程式追蹤與效能分析
需积分: 0 3 下载量 84 浏览量
2008-12-22
16:05:27
上传
评论
收藏 355KB PDF 举报
温馨提示
试读
18页
Linux network 網路卡驅動程式追蹤與效能分析
资源详情
资源评论
资源推荐
1
Linux 網路卡驅動程式 : 追蹤與效能分析
投稿領域:網路軟體
陳一瑋 林盈達
國立交通大學資訊科學系
新竹市大學路 1001 號
TEL:( 03)5712121 EXT. 56667
E-MAIL:iwchen@cis.nctu.edu.tw , ydlin@cis.nctu.edu.tw
主要聯絡人:陳一瑋 TEL:0927308032
摘要
一部電腦的網路元件可分成硬體和軟體兩部分,硬體方面有網路卡、網路線等,軟體方面有網
路卡驅動程式( Adapter driver )、協定驅動程式( protocol driver )及應用軟體,其中網路卡驅
動程式負責銜接硬體與軟體,本文解說裝置驅動程式運作的流程,找出撰寫裝置驅動程式的重點與
要領,以 Linux 網路卡驅動程式為例說明,並對它做一些測試與分析。分析之後發現到在不考慮網
路傳輸時間(propagation time)的條件下,封包處理上較花時間的順序為: (1) 網路卡發送
(transmit)、接受(receive)封包 ,(2) DMA(直接存取記憶體)封包,(3) 網路卡驅動程式(CPU 執行
時間),三者所花的時間比例大約為 250 : 30 : 1,這是以封包大小 1028byte 來測試的結果,封包
愈大三者的比例會愈懸殊,可見發送(或接收)及 DMA 封包是時間瓶頸所在;除此之外,也了解在
中斷處理時“新封包來到”的情形比“封包傳送完畢”要花多一點時間。
關鍵字:Linux、協定驅動程式、網路卡驅動程式、ISR、IRQ、I/O port、DMA。
1. 簡介
2
作業系統的主要功能之一就是控制電腦周邊裝置的輸入、輸出。而用來控制的軟體主要可以分
為四個部分,請參考圖一。我們可以看出驅動程式( Driver )在現今的電腦實作架構中處於一個相
當重要的地位,它要能 “吃軟” 也要能 “吃硬”。通常中斷處理常式可以視為是驅動程式的一部
分。
相對於網路卡驅動程式( Adapter driver )而言,它所要吃的 “軟” 就是上層的協定驅動程
式( Protocol driver),也就 TCP/IP protocol stack;而它所要吃的 ”硬”就是下層的網路卡,
說得更詳細點,便是要和網路卡上的 MAC Controller 溝通,透過 MAC Controller 上的 registers
來交換訊息,以達到網路卡驅動程式的主要工作之一:將封包傳送給網路卡或者是從網路卡上抓取
已經到達的封包;而另一項主要的工作,是將從網路卡上抓取到的封包傳遞給上層的協定驅動程式,
或者是將從協定驅動程式收到的封包傳遞給網路卡,請參考圖二。
使用者行程
Device-independent 軟體
驅動程式
中斷處理常式
硬體
I/O call , spooling
Naming , protection , allocation
Setup device registers , check status
Wakeup driver when I/O completed
Perform I/O operations
I/O 請求 I/O 回覆
圖一:I/O 系統中的分層以及各層的主要函式
I/O 函式
核心
網路卡驅動程式
網路卡
出境封包
入境封包
出境封包
入境封包
圖二:網路卡驅動程式的主要工作
3
2. 撰寫驅動程式
如何正確地在 Linux 作業系統中撰寫一個驅動程式呢?以下我們將分為
探測硬體
(probe
hardware)、
中斷處理
(interrupt handling)、
使用
I/O
埠
(Using I/O ports) 讀取及寫入資料這三
大部分來一一解說。
2.1 探測硬體(probe hardware)
在一個驅動程式可以和裝置做溝通前,必須要做的一些初始化工作包括:探測裝置的 I/O
ports 和 IRQ number。有了 I/O ports 才可以和裝置上的某些暫存器(register)溝通,有了 IRQ
number 才能正確地將中斷處理常式註冊到核心之中。探測硬體的方法和匯流排(bus)的種類
有關,PCI 介面的裝置是在開機時(boot)就自動會將所用的 I/O ports 及 IRQ number 存在其某
些暫存器上,而驅動程式只需去讀取這些暫存器就可以了,並不需要真正的去探測裝置,
但 ISA 介面的裝置驅動程式就必須要實際地去做探測的工作。
在 PCI 介面方面,Linux 核心 2.4 版更進一步地將 I/O ports 及 IRQ number 整合在系統資
源中 (pci_dev structure),因此在驅動程式中就不必直接由裝置上的暫存器來獲得 I/O ports
和 IRQ number,而只需呼叫下列函式即可由系統資源取得:
int pci_enable_device (struct pci_dev *dev);
unsigned long pci_resource_start(struct pci_dev *dev, int bar);
struct resource *request_region (unsigned long start , unsigned long len , char*
name);
void release_region (unsigned long start , unsigned long len);
想要取得I/O ports 和 IRQ number 以前,一定要呼叫 pci_enable_device( )來啟動
這個 PCI 裝置,接下來若是要 IRQ number,就可從 dev->irq 中獲得,若是要
I/O ports 就呼叫 pci_resource_start( ) 來取得基底位址( base address ),然後呼叫
request_region( )向系統宣告要用某一段的 I/O ports 即可使用,最後若沒有要用
時要記得呼叫 release_region( )來釋放這段 I/O ports。
至於 ISA 介面的裝置就麻煩許多,在探測 I/O ports 方面所用的機制( mechanism )是去
“掃瞄”( scan ) 所 有可能的 I/O ports,只有與裝置連接的 I/O ports 才會有正確的回應,
4
以下是大概的流程:
1. int check_region (unsigned long start , unsigned long len );
這個函式是用來檢查這一段 I/O ports 是否可以拿來使用。
2. 實際去探測硬體,察看此裝置是否存在,在此必須儘量必免”寫入”的動作,因為不小心
的寫入會讓系統出現很多問題。
3. 呼叫 request_region( ) 來向核心要求所要用的 I/O ports。
4. 當沒有要用到某段 I/O ports 時,要呼叫 release_region( )來釋放出系統資源。
在探測 IRQ number 方面所用到的機制是讓裝置產生一個中斷( interrupt ),然
後去查看一些相關資訊以得知裝置所用的 IRQ 是多少,這裡要注意的是:驅動
程式是要知道裝置所用的 IRQ 是多少,而不是要分配 IRQ 給裝置,以下是
可以用到的函式:
unsigned long probe_irq_on(void);
int probe_irq_off (unsigned long);
probe_irq_on( )會回傳一個位元遮罩(bitmask),此遮罩可以用來判斷還有哪些中
斷還沒被用到,而驅動程式必須儲存此遮罩,因為等一下必須將此遮罩當成參
數傳給 probe_irq_off( )。在 probe_irq_on( )執行完後,驅動程式應該要促使裝置
產生一個中斷,之後再呼叫 probe_irq_off( bitmask ),如此一來 probe_irq_off( )
就會傳回此裝置所用的 IRQ number 了。
2.2 中斷處理(interrupt handling)
當資料在核心與裝置間傳輸時難免會有一些的延遲(delay),因此驅動程式就必須將資料
先暫存起來,放到緩衝區中等待資料的完整與正確傳送時刻的到
來,而我們常見的一個較好的緩衝機制為”interrupt-driver I/O”,此方法中輸
入緩衝區(input buffer)在中斷處理時被填入資料,再被需要這些資料的程序
(process)所取出; 輸出緩衝區(output buffer)被某個程序填入資料後,在中斷處
剩余17页未读,继续阅读
chenchihweijack
- 粉丝: 5
- 资源: 191
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0