1. 程式人生 > >MINI2440+DM9000網路驅動分析之五

MINI2440+DM9000網路驅動分析之五

    在字元裝置當中,我們比較習慣的一種思維是"一切皆檔案".比如說,我們操作一個硬體的時候,首先去open一個裝置節點.底層的操作集直接或間接對應使用者空間的系統呼叫的API.但是,在網路子系統裡面,我們去操作一個PHY時,並沒有直接去操作所謂的節點,如eth0.比如我們通過TFTP下載一個檔案到目標機器的時候,只需要執行下面的命令即可:

tftp -r YourFile -g 192.168.1.131

    上述的IP是PC端的IP.但是我們在這裡並沒有看到eth0任何相關資訊.其實,我用要用一個網絡卡的時候,是需要配置的,如下面命令:

ifconfig eth0 192.168.1.22 up

    其實,我們每用一個網絡卡的時候,都是配置一下網絡卡的.配置網絡卡的結果是核心網路子系統新增一條路由訊息,這條路由訊息是和網絡卡對應的.使用者空間跟核心網路子系統及網絡卡驅動互動便是通過TCP/IP協議棧裡面的路由演算法來找到我們相應的物理裝置的,而不是像字元裝置那樣直接操作和物理裝置對應的裝置節點.它只是多了一層轉換而已.因此,當我們執行下面的命令時:

tftp -r YourFile -g 192.168.1.131

    實際上,首先tftp命令根據引數產生一條路由訊息陷入核心根據TCP/IP協議棧找到其網路傳遞路徑最終實現到具體PHY的互動.然後呼叫具體PHY的裝置驅動函式來實現硬體的操作.

    1.TCP/IP四層模型及資料流向:

    各層的意義如下:

應用層(application layer):包含各種網路應用協議。如HTTP、FTP、telnet、SMTP、DNS、SNMP等協議。

傳輸層(transport layer):負責在源主機和目的主機的應用程式間提供端-端的資料傳輸服務。主要有TCP和UDP兩個傳輸協議。

網路層(internet layer):負責將分組獨立地從信源傳送到信宿,主要解決路由選擇、擁塞控制和網路互聯等問題。如最重要的協議——IP。

網路介面層(network access layer):負責將IP分組封裝成幀格式並傳輸;或將從物理網路接收到的幀解封,取出IP分組交給網路互聯層。當前幾乎所有的物理網路上都可執行TCP/IP協議。

    當我們從PC下載一個檔案到目標機器的時候,對PC端而言,自上而下"層層封裝";到達目標機器的時候,自下而上,"層層解封".這過程從大的方面來講包括兩方面:一方向是不斷地新增每個層相應的協議頭;另一方面是對實際有效的資料各層的不同處理,例如傳輸層將應用程式的資料流分成TCP段,並加上TCP包頭遞交給網路層.

    例項:

下面以使用TCP協議傳送檔案(如FTP應用程式)為例說明了TCP/IP的工作原理:
1). 在源主機上,應用層將一串位元組流傳給傳輸層;
2). 傳輸層將位元組流分成TCP段,加上TCP包頭交給網際網路絡(IP)層;
3). IP層生成一個包,將TCP段放入其資料域,並加上源和目的主機的IP地址,然後交給資料鏈路層;
4). 資料鏈路層在其幀的資料部封裝IP包,發往目的主機或IP路由器;

流程示意圖如下:

5). 在目的主機上,資料鏈路層將資料鏈路層幀頭去掉,將IP包交給網際網路層;
6). IP層檢查IP包頭,如果包頭中的校驗和與計算出來的不一致,則丟棄該包;
7). 如果校驗和一致,IP層去掉IP頭,將TCP段交給TCP層,TCP層檢查順序號來判斷是否為正確的TCP段;
8). TCP層為TCP包頭計算TCP頭和資料.如果不正確,TCP層丟棄這個包,若正確,則向源主機發送確認;
9). 在目的主機上,TCP層去掉TCP頭,將位元組流傳給應用程式;
10). 目的主機收到了自源主機發來的位元組流,就像直接從源主機發來的一樣.

    2.struct sk_buff:

    如果說net_device是靜態地表徵核心一個"網路裝置",而不管是具體哪一種網路裝置或者說哪個PHY,類比於USB子系統的usb_device.而struct sk_buff則是流竄於核心網路子系統的動態"精靈",上述的資料流程便是每層對SKB的的裝拆封過程,其意義不亞於USB子系統的URB.核心網路子系統以SKB為核心,根據不同網路層的協議,對這個"核心精靈資料"有不同的操作集,如skb_put()、skb_push()等動作.

    2-1.skb的基本定義:

    skb的基本定義位於include/linux/skbbuff.h,包括其流竄過程的各網路層的協議頭、實際有效資料域及管理以及各網路層對應的不同的操作集.

    2-1-1.各網路層的協議頭:

    sk_buff結構體定義了3個協議頭對應網路協議的不同層次,這三個層次分別是傳輸層TCP/UDP(及ICMP和IGMP)協議頭、網路層協議頭和鏈路層協議頭.如下:

	sk_buff_data_t		transport_header;
	sk_buff_data_t		network_header;
	sk_buff_data_t		mac_header;

    2-1-2.實際有效資料域:

    當我們通過網路來傳輸資料時,比如是一個檔案,那麼這個檔案是我們的有效資料.這個檔案路由不同的網路層會被標識成某個網路層的資料包.比如說,對傳輸層而言,檔案及傳輸層的協議頭是其有效資料.skb中用資料緩衝區指標head、data、tail和end.如下:

	/* These elements must be at the end, see alloc_skb() for details.  */
	sk_buff_data_t		tail;
	sk_buff_data_t		end;
	unsigned char		*head,
				*data;

    head:指向記憶體已分配的用於承載網路資料緩衝區的起始地址;

    data:指向當前協議層有效資料的起始地址,這裡需要注意每個協議層的有效資料的含義並不一樣.如下:

傳輸層:使用者資料和傳輸層協議頭屬於有效資料;
網路層:使用者資料、傳輸層協議頭和網路層協議頭是其有效資料;
資料鏈路層:使用者資料、傳輸層協議頭、網路層協議頭和鏈路層頭部是其有效資料.

    因此,data指標將隨著各協議層的不同而相應移動.

    tail:指向當前協議層有效資料負載的結尾地址,與data指標相對應;

    end:指向記憶體分配的資料緩衝區的結尾,與head指標相對應.當skb被分配之後,end指標也就固定不變了.它還包含一個skb_shared_info結構體的空間,這個結構體存放分隔儲存的資料片段,即可以將資料包的有效資料分成幾片儲存在不同的記憶體空間中.

    head、data、tail和end的分佈圖如下:

    2-1-3.skb操作集:

    由上述2-1-2可知,路由各層協議時,需要不斷地裝拆封skb,操作集主要包括skb的分配和釋放、head,data,tail,end指標在不同協議層的移動等動作.詳細可參看宋寶華<<Linux裝置驅動開發詳解>>網路裝置驅動章節.

相關推薦

MINI2440+DM9000網路驅動分析

    在字元裝置當中,我們比較習慣的一種思維是"一切皆檔案".比如說,我們操作一個硬體的時候,首先去open一個裝置節點.底層的操作集直接或間接對應使用者空間的系統呼叫的API.但是,在網路子系統裡面,我們去操作一個PHY時,並沒有直接去操作所謂的節點,如eth0.比如我

linux音頻alsa-uda134x驅動分析二(時鐘)

lin pen play 個數 inter and 文本 ted word Audio Clocking音頻時鐘==============This text describes the audio clocking terms in ASoC and digital au

linux音訊alsa驅動分析三 解碼器

ASoC Codec DriverASoC解碼器驅動 ================= The codec driver is generic and hardware independent code that configures the codec to provide audio capture

android gps機制分析--

1. 概述     上面的幾篇文章論述了gps的開啟啟動初始化等動作,萬事俱備只欠東風了。 這一系列文章主要講的是Position資訊如何從modem層傳遞到loc eng層最後一直到Java上層的。 由於loc eng層到modem層是屬於訊息觸發的,也就是說正常的流程是

深度學習經典目標檢測例項分割語義分割網路的理解 MASK-RCNN

我不生產博文,我是CSDN的搬運工。本文參考了下面這幾篇部落格:基於最早的 Faster RCNN 框架,出現不少改進,主要有三篇需要看:1)作者推薦的這篇     Speed/accuracy trade-offs for modern convolutional obje

netty原始碼分析 transport(ChannelHandler)

上文說到了,channelHandler, 顧名思義 handler 處理者 從channelPipeline的定義中看出,channelPipeline是channelHandler的集合 public interface ChannelPipeline extends

ARChon 分析 : chrome-app的開發方法

官方文件在這裡: https://developer.chrome.com/apps/first_app 使用流程 在Chrome瀏覽器位址列目 開啟 chrome://extensions -> 開啟 Develop mode —> 選擇 Lo

linux音訊alsa驅動分析二 時鐘

DAI 通過位時鐘BCLK驅動 DAI 也通過幀時鐘驅動 幀時鐘 LRC 或者 frame。  幀時鐘和取樣率是一樣的 The Digital Audio Interface is usually driven by a Bit Clock (often referred  as BCLK). Th

網路程式設計系列 libpcap庫(共24個函式的例項)

之前在windows下用過winpcap,但是libpcap終究與它還是有區別的。 已經決定從事Linux的方向了,下面就完整的學習下libpcap函式庫。 目的:熟悉庫中的所有函式, 對於其中所有的函式都用例項來驗證 理論知識可以看看下面的連結: 1)    http:

網路驅動移植sk_buff結構體及其相關操作函式(下)

    2、結構體相關操作函式     (1)、dev_alloc_skb     實際上,函式dev_alloc_skb最終是呼叫__alloc_skb函式來分配資料緩衝區和sk_buff結構體的,如下圖:       從dev_alloc_skb到__alloc_skb

qemu原始碼分析-- TCG動態翻譯技術

1. TCG簡單介紹 TCG(Tiny Code Generator)最早被用於C編譯器的後端。在TCG相關的程式碼中,target指的是我們通常說的host,這一點需要注意,並不是我們理解的被模擬的平臺。 2. TCG動態翻譯技術的幾個概念 (1)與dyngen一樣,TCG的“function”與qem

(轉)驅動開發 --- TDI六 【譯文】

http://hi.baidu.com/combojiang/item/d0287ca509180ddf5bf19132 同樣的使用TDI_RECEIVE來完成資料接收。然而我們卻沒有用它來實現。實際上,如果你注意到,你可以建立回撥來通知你資料或者其他事件什麼時候到達。

boost庫在工作(35)網路服務端

在前面的例子裡,只是處理每個連線發來的訊息,然後再把訊息轉回自己的那裡,跟別的連線沒有什麼關聯,這種情況只會適應一種像HTTP的那樣,只關心自己的東西。但在網路伺服器裡,最多的是跟別人有關聯的服務。比如說聊天室,就是不斷地把所有進入這個聊天室的人的訊息向所有人廣播出去,也就是

觸控式螢幕驅動分析——tslib概覽

    Tslib 是觸控式螢幕驅動和運用 層之間的適配層,它從觸控式螢幕驅動處取得 原始的裝備 座標資料,經過 一系列的去噪、去抖、座標變換等操作,來去除噪聲並將原始的裝備 座標轉換為相應的螢幕座標。從 tslib/src/tslib.h檔案能夠 看出,在tslib中為應

mount過程分析(mount_bdev->fill_super)

sys_mount - > do_mount -> do_new_mount -> vfs_kern_mount -> mount_fs -> xfs_fs_mount -> mount_bdev mount_bdev是針對塊裝置掛載時使

linux網絡卡驅動分析probe函式

       從上面結果可以看出,該裝置使用了6個BAR中的2個BAR,即BAR0和BAR1,該裝置申請了兩塊IO記憶體,BAR0的範圍為:fea00000-fea1ffff,大小為128KB,用來對映裝置暫存器,BAR1的範圍為fea20000-fea23fff,大小為32KB,用來對映flash。裝置需要

R語言與資料分析:主成分分析

主成份分析歷史: Pearson於1901年提出,再由Hotelling(1933)加以發展的一種多變數統計方法。通過析取主成分顯出最大的個別差異,也用來削減迴歸分析和聚類分析中變數的數目,可以使用樣本協方差矩陣或相關係數矩陣作為出發點進行分析。 通過對原始變數進行線性組合

Linux裝置驅動分析熱拔插

                   /*輔助函式uevent_helper(/sbin/mdev,mdev是busybox的傑作)用於對熱拔插裝置進行建立及刪除 */if (uevent_helper[0] && !kobj_usermode_filter(kobj)) {char *a

Android PullToRefresh 分析、擴充套件重新整理載入樣式

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" > <FrameLayout android

[阿里DIN] 深度興趣網路原始碼分析 如何建模使用者序列

# [阿里DIN] 深度興趣網路原始碼分析 之 如何建模使用者序列 [toc] ## 0x00 摘要 Deep Interest Network(DIN)是阿里媽媽精準定向檢索及基礎演算法團隊在2017年6月提出的。其針對電子商務領域(e-commerce industry)的CTR預估,重點在於充分利