日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

1 freebsd網(wǎng)卡驅(qū)動程序詳解

/* 注釋:xIE_minix */
/*此處為BSD申明,略過... 最好是拷貝下來用C的開發(fā)工具來看比較好 :) */
/*
當(dāng)網(wǎng)絡(luò)上一臺計算機準(zhǔn)備發(fā)送數(shù)據(jù)時,他的網(wǎng)卡開始工作了,首先網(wǎng)卡的芯片偵聽在網(wǎng)絡(luò)上是否有數(shù)據(jù)在
流動,如果沒有,他就把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上,在偵聽和發(fā)送之間有一段極小的時間延遲,在這段時間內(nèi),也有
可能在網(wǎng)絡(luò)上有其他的計算機也準(zhǔn)備發(fā)送數(shù)據(jù),也偵聽到網(wǎng)絡(luò)上沒有數(shù)據(jù)在流動,這就可能兩臺甚至多臺
的數(shù)據(jù)一起發(fā)送到網(wǎng)絡(luò)上,產(chǎn)生數(shù)據(jù)的碰撞,發(fā)送數(shù)據(jù)的計算機的網(wǎng)卡芯片當(dāng)然要在發(fā)送完成后再校驗返回
的數(shù)據(jù),如果發(fā)現(xiàn)和發(fā)送的數(shù)據(jù)不一致,那就是說產(chǎn)生了碰撞,所以在一個以太網(wǎng)絡(luò)中的計算機數(shù)量不宜過多,
他不但會增加廣播包在網(wǎng)絡(luò)中的數(shù)量,也請也會增加數(shù)據(jù)包的碰撞次數(shù).
我們的計算機的網(wǎng)卡芯片在接收到一完整的數(shù)據(jù)包后,芯片的一引腳通知8259中斷控制器,中斷控制器再
發(fā)出中斷給CPU,由此,CPU隨即調(diào)用該網(wǎng)卡的中斷例程,如:
Dos是這樣的
屏蔽所有中斷(cli)
push any register
因為中斷向量在段0
所以xor ax,ax
mov ds,ax
mul ax,中斷號
那么在數(shù)據(jù)段的[ax]偏移處是該中斷例程的指針了
call [ax]就到該中斷例程了
...(DOS是比較遙遠的事情了,我所描述的是他的原理,當(dāng)然不會這么簡單,如果那位網(wǎng)友有興趣詳細描述一下
上面的原理,糾正或替換掉我所寫的就感激不盡了)

總之,在本例程中,CPU將調(diào)用elintr中斷例程,并帶有參數(shù)unit即該種網(wǎng)卡的第幾塊(因為在計算機中,你有可能
裝了相同的網(wǎng)卡有幾塊),elintr的作用是把數(shù)據(jù)從網(wǎng)卡的數(shù)據(jù)存儲器中讀到我們在該網(wǎng)卡初始化時預(yù)先分配好
的數(shù)據(jù)緩沖區(qū)中,他調(diào)用的函數(shù)就只有elread,同樣elread也只調(diào)用了elget一個函數(shù).elread函數(shù)比較簡單,就是
調(diào)用elget,elget則相對比較復(fù)雜一點,涉及到核心內(nèi)存分配mbuf,mbuf是比較恐怖的東西,正如STEVEN所寫的,為
了節(jié)約當(dāng)時"巨大"的4M內(nèi)存,犧牲了性能搞出了這個mbuf東東,mbuf是必須要弄懂的,雖然在設(shè)備驅(qū)動程序中調(diào)用
他的宏和函數(shù)不多,但在后面的IP協(xié)議,TCP協(xié)議中有不少涉及的地方.
關(guān)于數(shù)據(jù)發(fā)送方面和接收差不多,在上層協(xié)議放置好數(shù)據(jù)到mbuf鏈后,調(diào)用el_start函數(shù),該函數(shù)把mbuf鏈中
的數(shù)據(jù)放置到本塊網(wǎng)卡的發(fā)送隊列緩沖el_pktbuf中,然后再調(diào)用el_xmit函數(shù),此函數(shù)把發(fā)送隊列緩沖el_pktbuf
中的數(shù)據(jù)有傳遞到網(wǎng)卡的數(shù)據(jù)存儲器中.我認為,這中間的內(nèi)存拷貝是多于的,應(yīng)該在el_start函數(shù)中直接把mbuf
中的數(shù)據(jù)傳遞到網(wǎng)卡的數(shù)據(jù)存儲器中,這樣會使性能有較大幅度的提升,因為在驅(qū)動程序設(shè)計時,最好減少大量的
內(nèi)存拷貝,他占用的時間太多了.
*/

/* FreeBSD的3COM以太網(wǎng)設(shè)備驅(qū)動程序 */
/*本段頭文件是在編譯核心時產(chǎn)生的*/



#include "el.h" /*此三文件為編譯時產(chǎn)生的頭文件,內(nèi)容是定制核心的一些常量*/
#include "opt_inet.h"
#include "opt_ipx.h"

#include
#include
#include
#include
#include
#include

#include
#include

#include
#include

#include

#include

#include
#include /*此頭文件是3COM卡的寄存器常量*/

/* 為了調(diào)試方便 */
#ifdef EL_DEBUG
#define dprintf(x) printf x /*如果定義了DEBUG調(diào)試,則打印到屏幕*/
#else
#define dprintf(x)
#endif

/* softc結(jié)構(gòu),每種網(wǎng)卡的該結(jié)構(gòu)是不同的,主要是該第一個成員必須是一以太網(wǎng)的共用結(jié)構(gòu)arpcom*/
static struct el_softc {
struct arpcom arpcom; /* 以太網(wǎng)公共部分 */
u_short el_base; /* 基本輸入輸出地址 */
char el_pktbuf[EL_BUFSIZ]; /* 幀緩沖大小2048 */

推薦閱讀