內核協議棧源碼閱讀(一) ---驅動與內核交互

文章目錄

    • 一、硬中斷
      • 1.1 `e100_intr`
      • 1.2 `__netif_rx_schedule`
      • 1.3 補充:
    • 二、軟中斷
      • 2.1 net_rx_action
      • 2.2 e100_poll
      • 2.3 補充
    • 三、非 NAPI 的軟中斷處理
      • 3.1 netif_rx
      • 3.2 backlog_dev->poll
      • 3.3 補充
    • 四、總結

以 e100_intr 為例:

一、硬中斷

1.1 e100_intr

網卡觸發中斷,os 進入中斷處理程序 e100_intr,該函數通過 request_irq 注冊到中斷處理系統中。

static irqreturn_t e100_intr(int irq, void *dev_id)
{struct net_device *netdev = dev_id;struct nic *nic = netdev_priv(netdev);u8 stat_ack = readb(&nic->csr->scb.stat_ack);DPRINTK(INTR, DEBUG, "stat_ack = 0x%02X\n", stat_ack);if(stat_ack == stat_ack_not_ours ||	/* Not our interrupt */stat_ack == stat_ack_not_present)	/* Hardware is ejected */return IRQ_NONE;/* Ack interrupt(s) */writeb(stat_ack, &nic->csr->scb.stat_ack);/* We hit Receive No Resource (RNR); restart RU after cleaning */if(stat_ack & stat_ack_rnr)nic->ru_running = RU_SUSPENDED;if(likely(netif_rx_schedule_prep(netdev))) {e100_disable_irq(nic);__netif_rx_schedule(netdev);}return IRQ_HANDLED;
}
  • 首先對硬中斷進行檢查,即是否由網絡設備激活等
  • netif_rx_schedule_prep 設置網卡 state 的 RX_SCHED 標志。如果設置成功,則 e100_disable_irq(dev) 關閉網絡設備的硬中斷 (即當前設備再收到包也不會觸發中斷信號,區別于關閉 cpu 的中斷響應。關閉后會在驅動的 poll 函數中重新打開,表示驅動完整的收完一輪包),防止網卡觸發大量硬中斷。如果 RX_SCHED 已經設置過了,則直接返回,因為設備已經加入 poll_list 且觸發過軟中斷了),然后 __netif_rx_schedule 觸發軟中斷。

1.2 __netif_rx_schedule

__netif_rx_schedule

void __netif_rx_schedule(struct net_device *dev)
{unsigned long flags;local_irq_save(flags); // 保存并關閉 cpu 中斷響應dev_hold(dev);list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);if (dev->quota < 0)dev->quota += dev->weight;elsedev->quota = dev->weight;__raise_softirq_irqoff(NET_RX_SOFTIRQ);local_irq_restore(flags);
}
EXPORT_SYMBOL(__netif_rx_schedule);
  • 保存當前 cpu 的中斷響應狀態并關閉 cpu 的中斷響應(有可能在中斷處理中遞歸被中斷,所以這里不能簡單的關閉中斷或者開啟中斷,而是保存狀態并關閉:local_irq_save(flags)
  • 將 dev 插入到當前 cpu 的 softnet_data 的 poll_list 等待軟中斷處理(list_add_tail(&dev->poll_list, &__get_cpu_var(softnet_data).poll_list);
    • 這里 softnet_data 是 cpu 級別的數據結構,用來記錄有哪些網卡設備將中斷捅給了當前 cpu,或者當前 cpu 有哪些包需要發給哪些網卡
  • dev->quota 賦值,即分配 napi 可收取的包數
  • 發起軟中斷(__raise_softirq_irqoff(NET_RX_SOFTIRQ)
  • 恢復 cpu 中斷響應狀態(local_irq_restore(flags);
    content_copy

1.3 補充:

local_irq_save(flags) 函數實現:

// 保存 cpu 中斷響應標志的函數,保存的同時會關閉 cpu 的中斷響應
#define local_irq_save(flags) \do { raw_local_irq_save(flags); trace_hardirqs_off(); } while (0)// include/asm-x86_64/irqflags.h
#define raw_local_irq_save(flags) \do { (flags) = __raw_local_irq_save(); } while (0)static inline unsigned long __raw_local_irq_save(void)
{unsigned long flags = __raw_local_save_flags();raw_local_irq_disable()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90146.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3 面試題及詳細答案120道(61-75 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

ubuntulinux快捷鍵

1.復制文件使用cp命令。cp是復制的簡寫。語法也很簡單。使用&#xff0c;cp后跟要復制的文件以及要將其移動到的目的地cp ~/Downloads/your-file.txt ~/Documents/2.復制文件夾為了復制文件夾及其內容&#xff0c;您將需要告訴cp命令以遞歸方式復制。使用-r標志就足夠簡單了。c…

將 `knife4j` 和 `springdoc-openapi` 集成到你的 Spring Boot 應用

集成 knife4j 和 springdoc-openapi 可以讓你在 Spring Boot 應用中擁有更美觀和功能豐富的 API 文檔界面。knife4j 是基于 Swagger 的一個 UI 增強包,而 springdoc-openapi 則是用于生成 OpenAPI 3 文檔的庫。下面是如何將兩者集成到你的 Spring Boot 項目中的步驟。 步驟 1…

split() 函數在 Java、JavaScript 和 Python 區別

split() 函數在 Java、JavaScript 和 Python 中均用于字符串分割&#xff0c;但在語法、參數設計和行為上存在顯著差異。以下是三者的核心區別及使用示例&#xff1a;1. ??語法與參數設計????語言????語法????參數說明????Java??String.split(regex, limit…

zabbix基于GNS3監控部署

目錄 一、配置 二、zabbix配置 一、配置 1.添加路由和主機 f2接口配置192.168.80.254 f3接口配置192.168.90.254 R2的f3接口配置192.168.33.200 2.配置虛擬機ip網關 web1 web2 3.測試三臺主機zhijianshifoutongxin ping pc1 ping pc2 4.在R2網關中配置專業模式下設置共同體…

Java編程與GMSEC_API在UE4集成的筆試實戰

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本次4399游戲公司的Java筆試題主要針對應聘者的編程能力&#xff0c;特別強調了與游戲開發相關的技術知識。題目的核心內容是使用Java環境下的GMSEC_API與流行的游戲引擎Unreal Engine 4進行交互。這不僅考察了…

學習C++、QT---33(QT庫中如何使用事件過濾器實現我們的放大縮小字體功能)

&#x1f31f; 嗨&#xff0c;我是熱愛嵌入式的濤濤同學&#xff01;每日一言別害怕改變&#xff0c;走出舒適圈才能遇見更好的自己。實現完這個之后我們來接觸一下事件過濾器來實現這個功能吧好的那么我們的這個事件過濾器的這個函數在QObject類里面這邊也有相對應的代碼案例進…

[每日隨題15] 前綴和 - 拓撲排序 - 樹狀數組

整體概述 難度&#xff1a;1000 →\rightarrow→ 1500 →\rightarrow→ 2000 1567B. MEXor Mixup 標簽&#xff1a;前綴和 前置知識&#xff1a;無 難度&#xff1a;Div.2.B 1000 題目描述&#xff1a; 輸入格式&#xff1a; 輸出格式&#xff1a; 樣例輸入&#xff1a; …

DDD領域驅動設計C++實現案例:訂單管理系統

一、DDD核心概念簡介 領域驅動設計(Domain-Driven Design)是一種軟件開發方法論&#xff0c;強調將業務領域的概念和規則融入軟件設計中。核心概念包括&#xff1a; 值對象(Value Object): 無唯一標識&#xff0c;基于屬性值判斷相等性實體(Entity): 有唯一標識&#xff0c;其生…

神經網絡和機器學習的一些基本概念

記錄一些基本概念,不涉及公式推導,因為數學不好,記了也沒啥用,但是知道一些基本術語以及其中的關系,對神經網絡訓練有很大幫助。 可能有些概念不會講得很詳細,但是當你有了這個概念,你就知道往這個方向去獲取更詳細的信息,不至于連往哪走都不知道。 下面以多元線性回歸…

MySQL(146) 如何遷移數據庫到新服務器?

數據庫遷移到新服務器是一項復雜而重要的任務&#xff0c;確保數據完整性和最小化停機時間至關重要。以下是一個詳細的步驟指導&#xff0c;包括準備工作、數據備份、數據傳輸、數據恢復和驗證的全過程。 一、準備工作 1. 確認服務器環境 源服務器&#xff1a;當前運行數據庫的…

圖論的整合

圖 有若干個節點&#xff0c;有若干條邊連接節點。&#xff08;兩個點之間不是必須相連&#xff09; 比如&#xff1a; 有向圖 可以理解為邊上面有箭頭的圖&#xff0c;比如下面這張圖&#xff1a; 在這張圖中&#xff0c;點 111 可以通過這條有向邊到達點 222&#xff0c…

電子設計大賽【C語言核心知識點】講解

目錄 前言 1. 基礎語法 2. 流程控制 3. 函數 4. 數組與字符串 5. 指針&#xff08;核心重點&#xff09; 6. 內存管理 7. 結構體與聯合體 8. 文件操作 9. 預處理器 10. 高級特性 內存布局圖解 前言 在進行程序代碼開發之前&#xff0c;需要掌握好C語言各個模塊之間…

Numpy 庫 矩陣數學運算,點積,文件讀取和保存等

目錄 1.數組&#xff08;矩陣&#xff09;的組合 2.數組&#xff08;矩陣&#xff09;的切割 3.數組的數學運算 4.數組的深拷貝和淺拷貝 5.隨機模塊 6.矩陣統計運算 7.矩陣的特有運算點積&#xff0c;求逆 8.文件讀取和保存 1.數組&#xff08;矩陣&#xff09;的組合 水…

STL學習(?函數對象,謂詞,內建函數對象)

目錄 一、函數對象 1.函數對象的概念 2.函數對象的使用 &#xff08;1&#xff09;函數對象在使用的時候&#xff0c;可以像普通函數那樣調用&#xff0c;可以有參數&#xff0c;也可以有返回值。 &#xff08;2&#xff09;函數對象超出普通函數的概念&#xff0c;函數對象…

【爬蟲】05 - 爬蟲攻防

爬蟲05 - 爬蟲攻防 文章目錄爬蟲05 - 爬蟲攻防一&#xff1a;隨機User-Agent爬蟲1&#xff1a;fake-useragent2&#xff1a;高級反反爬策略3&#xff1a;生產環境建議二&#xff1a;代理IP爬蟲1&#xff1a;獲取代理IP2&#xff1a;高階攻防3&#xff1a;企業級的代理實戰三&am…

FPGA自學——存儲器模型

FPGA自學——存儲器模型 文章目錄FPGA自學——存儲器模型一、IP核二、ROM&#xff08;read only memory&#xff09;三、ROM的IP核調用四、RAM&#xff08;random access memory&#xff09;五、RAM的IP核調用總結1.不同波形的使用的存儲器2.塊與分布式的選擇3.FPGA與模塊的容量…

【C++】stack和queue拓展學習

目錄 1.反向迭代器思路及實現 1.1. 源碼及框架分析 1.2. 實現反向迭代器 2.stack和queue練習拓展-計算器實現 2.1. 后綴表達式概念 2.2. 后綴表達式運算規則 2.3. 中綴表達式轉后綴表達式 2.3.1 轉換思路 2.3.2 代碼實現 2.4. 計算器實現 1.反向迭代器思路及實現 1.1…

Web3與區塊鏈如何革新網絡安全——走在前沿

隨著互聯網技術的飛速發展&#xff0c;網絡安全問題日益成為全球關注的焦點。Web3和區塊鏈技術作為新興的技術力量&#xff0c;正在逐步改變網絡安全的格局。本文將探討Web3和區塊鏈技術如何革新網絡安全&#xff0c;走在技術前沿。 1. Web3技術概述 Web3&#xff0c;即第三代互…

網絡初級安全第三次作業

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用戶登錄</title><style>* {margin:…