eth結構體
❶ linux系統中,有關網路服務介面,是什麼定義的
(1)網路介面的命名
這里並不存在一定的命名規范,但網路介面名字的定義一般都是要有意義的。例如:
eth0: ethernet的簡寫,一般用於乙太網介面。
wifi0:wifi是無線區域網,因此wifi0一般指無線網路介面。
ath0: Atheros的簡寫,一般指Atheros晶元所包含的無線網路介面。
lo: local的簡寫,一般指本地環回介面。
(2)網路介面如何工作
網路介面是用來發送和接受數據包的基本設備。
系統中的所有網路介面組成一個鏈狀結構,應用層程序使用時按名稱調用。
每個網路介面在linux系統中對應於一個struct net_device結構體,包含name,mac,mask,mtu…信息。
每個硬體網卡(一個MAC)對應一個網路介面,其工作完全由相應的驅動程序控制。
(3)虛擬網路介面
虛擬網路介面的應用范圍非常廣泛。最著名的當屬「lo」了,基本上每個linux系統都有這個介面。
虛擬網路介面並不真實地從外界接收和發送數據包,而是在系統內部接收和發送數據包,因此虛擬網路介面不需要驅動程序。
虛擬網路介面和真實存在的網路介面在使用上是一致的。
(4)網路介面的創建
硬體網卡的網路介面由驅動程序創建。而虛擬的網路介面由系統創建或通過應用層程序創建。
驅動中創建網路介面的函數是:register_netdev(struct net_device *)或者register_netdevice(struct net_device *)。
這兩個函數的區別是:register_netdev(…)會自動生成以」eth」作為打頭名稱的介面,而register_netdevice(…)需要提前指定介面名稱.事實上,register_netdev(…)也是通過調用register_netdevice(…)實現的。
2、LINUX中的lo(回環介面)
1) 什麼是LO介面?
在LINUX系統中,除了網路介面eth0,還可以有別的介面,比如lo(本地環路介面)。
2) LO介面的作用是什麼?
假如包是由一個本地進程為另一個本地進程產生的, 它們將通過外出鏈的』lo』介面,然後返回進入鏈的』lo』介面.具體參考包過濾器的相關內容。
PART2 實驗:
本地一個進程發起連接,到一個本地的daemon監聽的內網IP地址(eth1: 10.1.1.1)的埠(8085),此時在eth1上是抓不到包的,在 lo 上抓到,說明使用的是本地回環介面lo,而網路層的IP地址則是內網IP地址.
原
❷ RTL8111H-PCIE網卡ARM驅動構建
最近在探索 Linux 內核中網口部分的代碼,特別關注的是 PCIe-Switch/Eth 控制器,它利用 MSI-X 中斷和 DMA 完成數據包的接收與發送。本次驅動的構建採用 RealTek 的 RTL8111H-PCIE Ethernet Controller,該控制器內部集成了一對 MAC 和 PHY,實現單個 10/100/1000 網路介面。
本次驅動的構建平台是使用 RK3568 實現,數據收發通過 DMA-PCIE 進行。為了全面理解 PCIe 網卡驅動的注冊和數據包處理流程,我們參照晶元手冊構建了一套 RTL8111H 的驅動代碼。
編寫 PCIe 驅動的首要步驟是識別匯流排下設備的唯一性標識信息,即 PCIe 配置空間中的設備 DeviceID 和廠商 VendorID。通過使用 lspci 工具箱讀取 PCIe 網卡前 256 位元組的配置字,確定關鍵信息。工具箱獲取的信息如下:Class 為 604 的設備是 RK3568 內置的 PCIe-RC 節點,VendorID:0x1D87、DeviceID:0x3566;Class 為 200 的設備是外置 PCIe 網卡配置空間的信息,VendorID:0x10EC、DeviceID:0x8168。
接下來,構建標准 PCIe 設備驅動框架,該框架包含基本的注冊和初始化步驟。PCIE 設備的注冊使用 mole_pci_driver 結構體,其入參為 pci_driver 結構體。在內核初始化過程中,相應的驅動被注冊到內核中。
在完成基礎驅動框架後,接下來需要參照晶元手冊構建網卡驅動的特定部分。
在完成基礎驅動框架和參照晶元手冊構建特定部分之後,我們的 RTL8111 的驅動已經具備了初步可用的能力,在 PCI 驅動、ifconfig 等操作下,可以正常識別出該驅動並將其暴露在 sysfs 中。
PCI 驅動注冊後,在最後一個驅動列表中即可看到注冊的驅動。ifconfig 操作下可以看到獲取的 MAC 地址與通過 MMIO 讀取獲取到的 MAC 地址一致。
此外,驅動還需要實現中斷處理和網路通信包的上送,包括實現 MSIX 中斷注冊和測試。內核網口測試中,注冊 net_device 結構體實現內核網口控制,引入 NAPI 機制提高網路通信效率。測試顯示,當打開內核收包功能並觸發大量數據報文傳輸時,會觸發內核的 NAPI 機制進行數據包收取。測試包括 ARP 收包、埠計數功能等。
最後,代碼開源部分已准備就緒,等待部署到 gitee 平台。
❸ (struct uip_eth_hdr *)是什麼意思
uip_eth_hdr 這個應該是結構體的名字 就是把某個值 轉換成 結構體指針的類型
❹ Miner 流程
以太坊的礦工出塊的流程,不同版本有過變更,下面基於1.7.3版本和1.8.4版本來分享
channel: 用於1發1收
發送 :sampleChan<-
接收 : <-sampleChan
Feed:用於1發多收,參考chainHeadCh
接收者注冊 :Subscribe(sampleChan)
發送 :send, 發送的地方不太好找,需要通過send和event/channel類型查找,例如miner中主要涉及到的就是 PostChainEvents
接收 :<-sampleChan
數據結構:
可以理解為操作間(eth)中有了礦(tx),那麼礦主(miner)安排工人(worker)挖礦(seal)。結構體定義如下:
Type Miner struct { -- - 理解為礦主
mux *event.TypeMux
worker *worker ---- 理解為幹活的工人
coinbase common.Address
eth Backend - --- 理解為操作間
engine consensus.Engine ---- 理解為挖礦的工具
exitCh chan struct {}
canStart int32 //canstart indicates whether we can start the mining operation
shouldStart int32 //shouldstart indicates whether we should start after sync
}
流程圖如下:
1. 節點啟動: backend.new->miner.new->worker.new: 調用commitNewWork,裡面使用push把work傳遞給cpuAgent, 之後在geth命令行敲miner.start()後->miner.start->worker.start->cpuAgent.start,調用Seal,計算nonce值,再發送 recv 消息,通知 worker . wait ,在收到之後將塊打包插入到區塊鏈,之後調用PostChainEvents,發送消息chainHeadCh, Worker.update 在收到消息後,重新調用 commitNewWor k,形成一個循環。
2. 創世塊: 調用geth的init命令觸發調用initGenesis->SetupGenesisBlock, 裡面具體強調一下time是使用的genesisBlock.json中的值,一般都是0.
3. 正常情況: worker . wait ,在收到之後將塊打包插入到區塊鏈,之後調用PostChainEvents,發送消息chainHeadCh, Worker.update 在收到消息後,重新調用 commitNewWor k,形成一個循環。
Miner .new: 在backend new的時候調用,即在節點啟動的時候調用。
Miner . update :在節點啟動的時候調用,用於監控是否有塊同步,如果有則停止挖礦,如果沒有啟動挖礦,這個在POW這種競爭性出塊的環境中需要。
Worker .new: 在miner.new的時候調用,記載節點啟動的時候調用
Worker.update: 節點啟動的時候調用,如果是非全節點的話用於監控接受交易transaction,關鍵函數 commitTransactions ,還用於調度在收到 chainHeadCh 的消息後,觸發 commitNewWork
其中 commitNewWork : 用於將pending的tx輸入到系統,計算trie等等操作,生成block,並將work push到cpuAgent處理,注意沒有蓋章
Worker. wait (對應於 1.8.4 的 resultLoop ) :節點啟動的時候調用,循環監聽 recv 消息,將攜帶的block插入區塊鏈中、發送廣播消息( NewMinedBlockEvent )、發送消息 PostChainEvents (發送 ChainHeadEvent ,即 chainHeadCh ),其中的關鍵函數是 WriteBlockAndState 。
cpuAgent .update() : 在cpuAgent.start()->worker.start->miner.start->geth的命令行調用之後啟動循環,用於接收 commitNewWork 分配下來的work,關鍵函數 mine ,裡面調用 Seal ,主要是完成POW尋找nonce值的操作,發送 recv 消息通知worker,也可以叫做蓋章。
類圖如下:
具體結構不再贅述
流程:
Miner.update:用於監控是否有塊同步,如果有則停止挖礦,這個在POW這種競爭性出塊的環境中需要
mainLoop:收到newWorkCh消息後處理,調用commitNewWork中的commit發送taskCh消息
newWorkLoop:收到startCh消息和chainHeadCh消息後發送newWorkCh消息
resultLoop:循環監聽resultCh(seal發送)消息,將攜帶的block插入區塊鏈中,並發送廣播消息,關鍵函數WriteBlockAndState,並發送chainHeadCh消息
taskLoop:以前agent做的事情,收到taskCh消息後,調用seal,裡面發送resultCh消息