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

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

萬字講解Linux內(nèi)核網(wǎng)絡收包角度——淺入中斷(2)

2022-10-22 14:43 作者:補給站Linux內(nèi)核  | 我要投稿

上文萬字講解Linux內(nèi)核網(wǎng)絡收包角度——淺入中斷(1)主要從針對e1000網(wǎng)卡收包開始,分析了硬中斷注冊、處理過程,網(wǎng)卡收包后硬中斷的過程非常簡潔,處理過程比較簡單,主 要是將網(wǎng)卡的napi->poll_list加入到CPU的softnet_data->poll_list里,然后發(fā)起軟中斷,就結(jié)束了,下面的就交給軟中斷進行數(shù)據(jù)包的接收處理,所以收包任務最大程度地交給軟中斷處理,最大程度簡化硬中斷處理。 總結(jié)以上描述中,上篇博文的具體細節(jié)步驟:

  • 內(nèi)核啟動網(wǎng)卡,為網(wǎng)卡分配(Ring Buffer,內(nèi)核通過網(wǎng)卡驅(qū)動將DMA內(nèi)存地址信息寫入網(wǎng)卡寄存器,使得網(wǎng)卡獲得DMA內(nèi)存信息),并通過request_irq 內(nèi)核 APi注冊硬中斷服務例程e1000_intr

  • 網(wǎng)卡收到數(shù)據(jù)包,通過DMA將數(shù)據(jù)包寫入內(nèi)存

  • 網(wǎng)卡觸發(fā)硬中斷,通過CPU接收數(shù)據(jù)

  • CPU中斷當前的進程,跳轉(zhuǎn)到異常向量表的中斷異常向量處

  • 保存現(xiàn)場

  • 調(diào)用irq_handler

  • 對于ARM64,irq_handler將調(diào)用gic_handle_irq

  • gic_handle_irq首先讀取中斷寄存器得到硬件中斷號,調(diào)用handle_domain_irq函數(shù)

  • handle_domain_irq->irq_enter進入中斷上下文

  • handle_domain_irq->irq_find_mapping通過硬件中斷號獲取IRQ Number

  • handle_domain_irq->generic_handle_irq進入中斷通用層處理

  • generic_handle_irq->irq_to_desc通過IRQ Number獲取對應的中斷描述符

  • generic_handle_irq->generic_handle_irq_desc->__handle_irq_event_percpu:遍歷中斷描述符中的action鏈表,依次執(zhí)行每個action中回調(diào)函數(shù)action->handler,對應e1000網(wǎng)卡驅(qū)動,執(zhí)行e1000_intr中斷服務例程

  • e1000_intr->ew32(IMC, ~0)禁止網(wǎng)卡中斷,避免頻繁硬中斷,降低內(nèi)核的工作效率

  • e1000_intr->napi_schedule激活NAPI, napi_struct.poll_list 掛在 softnet_data.poll_list 上,方便后面軟中斷調(diào)用 napi_struct.poll 獲取網(wǎng)卡數(shù)據(jù)。然后設置NET_RX_SOFTIRQ 軟中斷標識位。

  • handle_domain_irq->irq_exit():退出中斷上下文,觸發(fā)軟中斷執(zhí)行收包流程。

  • 恢復現(xiàn)場

上文萬字講解Linux內(nèi)核網(wǎng)絡收包角度——淺入中斷(1)重點在于通過網(wǎng)卡收包分析了硬中斷,本文從網(wǎng)絡收包角度分析和學習軟中 斷過程。

軟中斷的種類、定義 (Kernel 4.15)

以上是內(nèi)核默認定義的幾種軟中斷,硬中斷是在CPU每個指令周期后,會去判斷是否有硬中斷產(chǎn)生,根據(jù)硬中斷號找到對應的IRQ Number,執(zhí)行對應的中斷服務例程,而軟中斷會有內(nèi)核線程,輪詢一組標志位,如果標志位有值,那去這個標志位對應的軟中斷向量表,找到中斷處理函數(shù)執(zhí)行。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)??


軟中斷的注冊

全局的軟中斷向量數(shù)組,即軟中斷描述符表

數(shù)組中的內(nèi)容就是軟中斷觸發(fā)時的鉤子函數(shù):

如網(wǎng)絡收發(fā)包的軟中斷處理函數(shù)在網(wǎng)絡子系統(tǒng)初始化時注冊的:

注冊軟中斷回調(diào)函數(shù):

軟中斷在內(nèi)核中的整體如下所示,pending為軟中斷標志位



其中標志位在內(nèi)核中使用irq_cpustat來表示:

其中__softirq_pending為軟中斷標志位,該類型為int類型,最多支持32位軟中斷,ipi_rrq位cpu與cpu之間的中斷。

在Linux內(nèi)核中,定義NR_CPUS個該結(jié)構(gòu),即每個CPU有一個32bit的位圖,來維護本cpu上的軟中斷是否激活

軟中斷的激活

在上文萬字講解Linux內(nèi)核網(wǎng)絡收包角度——淺入中斷(1)中,硬中斷的中斷服務例程e1000_intr執(zhí)行:

e1000_intr->__napi_schedule:

__napi_schedule(this_cpu_ptr(&softnet_data),n):

最終調(diào)用__raise_soft_irqoff設置軟中斷標志位,nr為NET_RX_SOFTIRQ

可以看到在執(zhí)行__raise_soft_irqoff函數(shù)前,在__napi_schedule中,先是通過local_irq_save(flags)禁用了中斷,因為置位位圖是一個競爭操作,所有硬中斷都可以做,所以要保證關(guān)中斷的情況下完成,等pending置位結(jié)束后調(diào)用local_irq_restore(flags)恢復中斷。

內(nèi)核線程ksoftirqd是如何監(jiān)測到軟中斷發(fā)生的:

上面函數(shù)先關(guān)中斷查看本cpu的pending置位情況,如果有則進行進一步軟中斷處理。

軟中斷的入口函數(shù)__do_softirq:

對于數(shù)據(jù)包接收h->action()將執(zhí)行:網(wǎng)絡子系統(tǒng)注冊的的回調(diào)函數(shù)net_rx_action:


關(guān)于net_rx_action涉及到軟中斷處理中進一步使用NAPI機制收包,在接下來的文章中進行分析和學習。


原文作者:技術(shù)簡說



萬字講解Linux內(nèi)核網(wǎng)絡收包角度——淺入中斷(2)的評論 (共 條)

分享到微博請遵守國家法律
甘南县| 肇州县| 唐海县| 新竹市| 顺义区| 长沙县| 保德县| 七台河市| 娱乐| 衢州市| 浏阳市| 锡林浩特市| 扎囊县| 开江县| 海阳市| 武隆县| 鄄城县| 塔河县| 青川县| 天台县| 沂源县| 岗巴县| 衡阳市| 唐山市| 阿拉善盟| 潜山县| 池州市| 滨州市| 馆陶县| 容城县| SHOW| 湘西| 丰城市| 平潭县| 通州市| 黄浦区| 汤原县| 南汇区| 兰坪| 南京市| 东乡县|