内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Linux網(wǎng)絡(luò)包從中斷到接收的示例分析

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Linux網(wǎng)絡(luò)包從中斷到接收的示例分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都服務(wù)器托管,創(chuàng)新互聯(lián)建站提供包括服務(wù)器租用、珉田數(shù)據(jù)中心、帶寬租用、云主機(jī)、機(jī)柜租用、主機(jī)租用托管、CDN網(wǎng)站加速、主機(jī)域名等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:18982081108

 

Linux網(wǎng)絡(luò)包從中斷到接收的示例分析

linux

既然要講,那就把一個(gè)包的整個(gè)包生都說了算了

觸發(fā)中斷

  • 在非虛擬化環(huán)境下,網(wǎng)卡通過DMA將packet寫入內(nèi)核的rx_ring環(huán)形隊(duì)列緩沖區(qū),并觸發(fā)中斷。

  • 如果在虛擬化環(huán)境下,VMM配置GIC ITS (Interrupt Translation Service)  ,建立物理中斷與虛擬中斷的映射完成中斷虛擬化使得網(wǎng)卡能直接向VM發(fā)出中斷,同時(shí)通過IO虛擬化,網(wǎng)卡通過IOMMU將packet直接寫入虛擬機(jī)內(nèi)核的rx_ring

Top Half

  • CPU在收到中斷之后,調(diào)用網(wǎng)卡ISR也就是所謂的中斷handler

  • 分配sk_buf并入input_pkt_queue(如果隊(duì)列已滿則丟棄)

  • 發(fā)出一個(gè)軟中斷NET_RX_SOFTIRQ,軟中斷可以被調(diào)度例如通過tasklet

Bottom Half

  • sk_buf從input_pkt_queue傳入process_queue,根據(jù)協(xié)議類型調(diào)用網(wǎng)絡(luò)層協(xié)議的handler

  • ip_rcv執(zhí)行包頭檢查,ip_router_input()進(jìn)行路由,決定本機(jī)/轉(zhuǎn)發(fā)/丟棄

  • tcp_v4_rcv執(zhí)行包頭檢查,tcp_v4_lookup查詢對(duì)應(yīng)的socket和connection,如果正常,tcp_prequeue將skb放進(jìn)socket接收隊(duì)列

  • socket隨即喚醒所在的進(jìn)程

Linux網(wǎng)絡(luò)包從中斷到接收的示例分析

kqueue

因?yàn)閑poll沒有論文,就說說kqueue是怎么做的吧,kqueue會(huì)根據(jù)socket綁定的knote鏈表(每個(gè)監(jiān)聽的kqueue都可能創(chuàng)建一個(gè)knote),將knote通過反向指針獲得kqueue,將knote加入kqueue的就緒隊(duì)列末尾。如果此時(shí)恰好有進(jìn)程正在監(jiān)聽的話,將會(huì)喚醒進(jìn)程,kqueue會(huì)被掃描,并從就緒隊(duì)列處獲得所有的event,從而了解已經(jīng)就緒的所有socket。

  • 喚醒的進(jìn)程調(diào)用socket recv系統(tǒng)調(diào)用,如果是TCP則調(diào)用tcp_recvmsg從sk_buffer拷貝數(shù)據(jù)

Batch

netif_receive_skb_list()

Linux的NAPI還會(huì)繼續(xù)延遲軟中斷的處理,等待其積累足夠的skb后進(jìn)行輪詢,一次性處理所有的skb。

SKB

skb并不是直接存儲(chǔ)報(bào)文,而是存儲(chǔ)指針,指針只需要移動(dòng),就能完成解包,而本身的報(bào)文并不需要修改。上一層的協(xié)議棧會(huì)在處理當(dāng)前層的同時(shí)設(shè)置好下一層的頭指針,并且移動(dòng)data指針。與此同時(shí),skb本身是雙向鏈表實(shí)現(xiàn)的隊(duì)列。qlen為鏈表元素長(zhǎng)度,lock為添加元素時(shí)的鎖。

Linux網(wǎng)絡(luò)包從中斷到接收的示例分析

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

談到指針的用法,這里舉個(gè)做OS lab時(shí)印象深刻的奇淫巧技,也是C的指針變態(tài)的地方

#define list_entry(ptr, type, field) \     container_of(ptr, type, field) #define container_of(ptr, type, field) \     ((type *)((void *)(ptr) - (u64)(&(((type *)(0))->field))))

(u64)(&(((type  *)(0))->field))))指的是field在結(jié)構(gòu)體type中的偏移量,通過減去這個(gè)偏移量我們就能找出某個(gè)對(duì)象所在上級(jí)type對(duì)象的地址,也就是container。

一般來說,我們都會(huì)使用下面這樣的方式,讓鏈表節(jié)點(diǎn)去包裹數(shù)據(jù)。

struct page_list_node {         struct page p;     struct list_node *prev;     struct list_node *next; };

但是,通過指針操作,卻可以讓數(shù)據(jù)去包裹鏈表節(jié)點(diǎn)

struct list_head {     struct list_head *prev;     struct list_head *next; };  struct page{     struct list_head      list_node; }

在僅僅知道鏈表節(jié)點(diǎn)的情況下,借助成員偏移量即可知道容器對(duì)象的位置并取出

list_entry(somenode,struct page,list_node);

list_head本身可以存在于任何對(duì)象上,而他們的entry卻能根據(jù)參數(shù)而指向不同的類型,感覺有點(diǎn)泛型的味道了。

內(nèi)容來自SJTU,IPADS OS-16-Network

上述就是小編為大家分享的Linux網(wǎng)絡(luò)包從中斷到接收的示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Linux網(wǎng)絡(luò)包從中斷到接收的示例分析
標(biāo)題鏈接:http://m.rwnh.cn/article20/gspico.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、定制網(wǎng)站Google、網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
扶余县| 巴南区| 延边| 土默特右旗| 东平县| 天水市| 汉源县| 苏尼特右旗| 泸州市| 炎陵县| 道孚县| 招远市| 永春县| 年辖:市辖区| 阿图什市| 库尔勒市| 广东省| 石渠县| 华蓥市| 十堰市| 宁明县| 曲周县| 金沙县| 鹿邑县| 巴楚县| 略阳县| 垫江县| 正安县| 巩义市| 苗栗市| 五大连池市| 武威市| 海门市| 祁连县| 江达县| 桑日县| 阳谷县| 七台河市| 通化市| 乌兰察布市| 青神县|