最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

深度剖析Linux網(wǎng)卡數(shù)據(jù)收發(fā)過程分析(超詳細(xì))

2022-04-11 16:36 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿
  • 一般來說,網(wǎng)卡主要有兩個(gè)重要的功能:接收數(shù)據(jù) 和 發(fā)送數(shù)據(jù)。


  • 所以,當(dāng)網(wǎng)卡接收到數(shù)據(jù)包后,要通知 Linux 內(nèi)核有數(shù)據(jù)需要處理。另外,網(wǎng)卡驅(qū)動(dòng)應(yīng)該提供讓 Linux 內(nèi)核把數(shù)據(jù)把發(fā)送出去的接口。


  • net_device 結(jié)構(gòu)是 Linux 為了適配不同類型的網(wǎng)卡設(shè)備而抽象出來的對(duì)象,不同的網(wǎng)卡驅(qū)動(dòng)只需要按 Linux 的規(guī)范來填充 net_device 結(jié)構(gòu)的各個(gè)成員變量,Linux 內(nèi)核就能夠識(shí)別出網(wǎng)卡,并工作起來。


  • 下面我們將分析網(wǎng)卡設(shè)備接收和發(fā)送數(shù)據(jù)包的實(shí)現(xiàn)原理。

net_device 結(jié)構(gòu)

  • net_device 結(jié)構(gòu)是 Linux 內(nèi)核對(duì)網(wǎng)卡設(shè)備的抽象,但由于歷史原因,net_device 結(jié)構(gòu)的定義十分復(fù)雜。


  • 不過本文主要分析網(wǎng)卡設(shè)備收發(fā)數(shù)據(jù)的實(shí)現(xiàn),所以不會(huì)分析 net_device 結(jié)構(gòu)的所有成員。下面主要列出收發(fā)數(shù)據(jù)相關(guān)的成員,如下:

  • 下面介紹一下各個(gè)成員的作用:

  1. name:設(shè)備的名字。用于在終端顯示設(shè)備的名字或者通過設(shè)備名字來搜索設(shè)備。

  2. irq:中斷號(hào)。當(dāng)網(wǎng)卡從網(wǎng)絡(luò)接收到數(shù)據(jù)包后,需要產(chǎn)生一個(gè)中斷來通知 Linux 內(nèi)核有數(shù)據(jù)包需要處理,而 irq 就是網(wǎng)卡驅(qū)動(dòng)注冊(cè)到內(nèi)核中斷服務(wù)的中斷號(hào)。

  3. init、open、stop:分別為設(shè)備的初始化接口,打開接口和關(guān)閉接口。

  4. hard_start_xmit:當(dāng)需要通過網(wǎng)卡設(shè)備發(fā)送數(shù)據(jù)時(shí),可以調(diào)用這個(gè)接口來發(fā)送數(shù)據(jù)。

  • 所以,一個(gè)網(wǎng)卡驅(qū)動(dòng)必須完成以下兩個(gè)工作:

  1. 通過實(shí)現(xiàn) net_device 結(jié)構(gòu)的 hard_start_xmit 方法來提供發(fā)送數(shù)據(jù)的功能。

  2. 通過向內(nèi)核注冊(cè)硬件中斷服務(wù),來通知內(nèi)核處理網(wǎng)卡設(shè)備接收到的數(shù)據(jù)包。

  • 也就是說,發(fā)送數(shù)據(jù)的功能是由 net_device 結(jié)構(gòu)的 hard_start_xmit 方法提供,而通知內(nèi)核處理接收到的數(shù)據(jù)包的功能是由網(wǎng)卡的硬件中斷提供的。

圖1 展示了網(wǎng)卡接收和發(fā)送數(shù)據(jù)的過程:

  • 上圖展示的是 NS8390網(wǎng)卡 接收和發(fā)送數(shù)據(jù)的過程(紅色括號(hào)為接收過程,藍(lán)色括號(hào)為發(fā)送過程),從上圖可以發(fā)現(xiàn),NS8390網(wǎng)卡驅(qū)動(dòng) 完成了兩件事情:

  1. 將 net_device 結(jié)構(gòu)的 hard_start_xmit 方法設(shè)置為 ei_start_xmit。

  2. 向 Linux 內(nèi)核注冊(cè)了 ei_interrupt 硬件中斷服務(wù)。

  • 所以,當(dāng)網(wǎng)卡接收到數(shù)據(jù)包時(shí),會(huì)觸發(fā) ei_interrupt 中斷服務(wù)來通知內(nèi)核有數(shù)據(jù)包需要處理。而當(dāng)需要通過網(wǎng)卡發(fā)送數(shù)據(jù)時(shí),將會(huì)調(diào)用 ei_start_xmit 方法把數(shù)據(jù)發(fā)送出去。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?



  • 當(dāng)網(wǎng)卡從網(wǎng)絡(luò)中接收到數(shù)據(jù)包后,會(huì)觸發(fā) ei_interrupt 中斷服務(wù),我們來看看 ei_interrupt 中斷服務(wù)的實(shí)現(xiàn):

  • 上面的代碼刪除了很多硬件相關(guān)的操作,因?yàn)楸疚牟⒉皇欠治鼍W(wǎng)卡驅(qū)動(dòng)的實(shí)現(xiàn)。


  • ei_interrupt 中斷服務(wù)首先讀取中斷的類型,保存到 interrupts 變量中。然后判斷中斷類型是否為接收到數(shù)據(jù)包,如果是就調(diào)用 ei_receive 函數(shù)從網(wǎng)卡處讀取數(shù)據(jù)。


  • 我們繼續(xù)分析 ei_receive 函數(shù)的實(shí)現(xiàn):

  • ei_receive 函數(shù)主要完成以下幾個(gè)工作:

  1. 申請(qǐng)一個(gè) sk_buff 數(shù)據(jù)包對(duì)象,并且設(shè)置其 dev 字段為接收數(shù)據(jù)包的設(shè)備。

  2. 通過調(diào)用 ei_block_input 函數(shù)從網(wǎng)卡中讀取接收到的數(shù)據(jù),并保存到剛申請(qǐng)的 sk_buff 數(shù)據(jù)包對(duì)象中。ei_block_input 函數(shù)是由網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn)的,所以這里不作詳細(xì)分析。

  3. 通過調(diào)用 eth_type_trans 函數(shù)從數(shù)據(jù)包的以太網(wǎng)頭部中獲取網(wǎng)絡(luò)層協(xié)議類型。

  4. 調(diào)用 netif_rx 函數(shù)將數(shù)據(jù)包上送給內(nèi)核網(wǎng)絡(luò)協(xié)議棧。

  • 當(dāng)把數(shù)據(jù)包上送給內(nèi)核網(wǎng)絡(luò)協(xié)議棧后,數(shù)據(jù)包的處理就由內(nèi)核接管。一般來說,內(nèi)核網(wǎng)絡(luò)協(xié)議棧會(huì)通過網(wǎng)絡(luò)層的 IP協(xié)議 和傳輸層的 TCP協(xié)議 或者 UDP協(xié)議 來對(duì)數(shù)據(jù)包進(jìn)行處理,處理完后就會(huì)把數(shù)據(jù)提交給應(yīng)用層的進(jìn)程進(jìn)行處理。

發(fā)送數(shù)據(jù)過程

  • 當(dāng)網(wǎng)絡(luò)協(xié)議棧需要通過網(wǎng)卡設(shè)備發(fā)送數(shù)據(jù)時(shí),會(huì)調(diào)用 net_device 結(jié)構(gòu)的 hard_start_xmit 方法,而對(duì)于 NS8390網(wǎng)卡 來說,hard_start_xmit 方法會(huì)被設(shè)置為 ei_start_xmit 函數(shù)。


  • 也就是說,使用 NS8390網(wǎng)卡 發(fā)送數(shù)據(jù)時(shí),最終會(huì)調(diào)用 ei_start_xmit 函數(shù)將數(shù)據(jù)發(fā)送出去。我們來看看 ei_start_xmit 函數(shù)的實(shí)現(xiàn):

  • 刪減了硬件相關(guān)的操作后,ei_start_xmit 函數(shù)的實(shí)現(xiàn)就非常簡單:

  1. 首先關(guān)閉網(wǎng)卡的硬件中斷,防止發(fā)送過程中受到硬件中斷的干擾。

  2. 調(diào)用 ei_block_output 函數(shù)把數(shù)據(jù)包的數(shù)據(jù)發(fā)送出去,此函數(shù)由網(wǎng)卡驅(qū)動(dòng)實(shí)現(xiàn),這里不作詳細(xì)分析。

  3. 打開網(wǎng)卡的硬件中斷,讓網(wǎng)卡能夠繼續(xù)通知內(nèi)核。

總結(jié)

  • 本文主要簡單的介紹了網(wǎng)卡設(shè)備接收和發(fā)送數(shù)據(jù)包的過程,而網(wǎng)卡設(shè)備的初始化過程并沒有涉及。當(dāng)然網(wǎng)卡設(shè)備的初始化過程也非常重要,會(huì)在后面的文章繼續(xù)分析。


深度剖析Linux網(wǎng)卡數(shù)據(jù)收發(fā)過程分析(超詳細(xì))的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
阿荣旗| 温泉县| 汶川县| 金溪县| 新巴尔虎左旗| 斗六市| 怀安县| 固镇县| 巫溪县| 敦化市| 城固县| 游戏| 务川| 灵寿县| 都兰县| 鄂伦春自治旗| 新密市| 公安县| 阿巴嘎旗| 德昌县| 抚松县| 栖霞市| 读书| 乐至县| 武山县| 高唐县| 大同县| 安顺市| 济阳县| 镇雄县| 南乐县| 景德镇市| 广东省| 大石桥市| 黑水县| 海口市| 永春县| 深泽县| 滁州市| 灵台县| 诸暨市|