linux驅動之網絡卡驅動程式框架
我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊
所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。
網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了
怎麼寫
1、分配某個結構體
2、設定
3、註冊
4、硬體相關的操作
然而這個重點在設定這裡
首先你得提供發包函式 提供收包的功能
我們隨便看一個網絡卡驅動程式 如cs89x0.c
這是一個真實的網絡卡驅動程式
分配一個net_device
然後呼叫了下面這個函式
進去
有個這個
我們看看net_ops
有open和stop函式
還有ndo_start_xmit 硬體啟動傳輸,這個發包函式就在這裡
然後註冊這個結構體
但是收到資料之後做什麼事情,你怎麼告訴我收到資料了呢,肯定會有個中斷
我們來看看
假設收到資料之後
net_rx 進去看一下
從晶片裡面讀出來
分配一個skbuf
然後用下面的函式上報
然後我們再看一下發包函式是怎麼回事
它發的是什麼東西,它的引數是怎樣,它的引數是sk_buf
從這裡我們可以知道,硬體相關的這層和上層怎麼打交道呢?
它們之間就是通過sk_buf,上面這幾層構造好包之後,放到sk_buf裡面扔給你,呼叫你的發包函式,你收到資料之後,在你的中斷程式收到資料之後,你從晶片裡面把資料讀出來,構造一個sk_buf,然後用netif_rx來上報這個資料給我
說到這塊,寫一個網絡卡驅動很簡單,我們先寫一個虛擬的網絡卡
參考/driver/net/cs89x0.c
框架如圖
我們來看一下範例裡面分配的
但是我們不想用alloc_etherdev這個巨集,我們進去看一下這個巨集
進入alloc_etherdev_mqs這個函式裡面去
這裡的名字用的是eth0啊 eth1這種,我不想用這個名字,我想換一個名字,所以我們直接用alloc_netdev_mqs這個函式來做
我們寫一個最簡單的網路驅動 程式碼如下
#include <Linux/module.h>
#include <linux/errno.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/in.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/gfp.h>
#include <asm/system.h>
#include <asm/io.h>a
#include <asm/irq.h>
static struct net_device *vnet_dev;
static int gh_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
static int cnt = 0;
printk("virt_net_send_packet cnt = %d\n", ++cnt);
return 0;
}
static const struct net_device_ops gh_netdev_ops = {
.ndo_start_xmit= gh_start_xmit,
};
static int virtnet_init(void)
{
/*1.分配一個net_device結構體**/
vnet_dev=alloc_netdev(0, "ghnet%d", ether_setup);
/*2.設定*/
vnet_dev->netdev_ops= &gh_netdev_ops;
/*3.註冊*/
register_netdev(vnet_dev);
return 0;
}
static void virtnet_exit(void)
{
unregister_netdev(vnet_dev);
free_netdev(vnet_dev);
}
module_init(virtnet_init);
module_exit(virtnet_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EIGHT");
測試如下
1.insmod virt_net.ko
2.ifconfig ghnet0 3.3.3.3
3.ping 3.3.3.3
效果如圖
ping 自己是不會進入那個發包的函式的,我們ping下別人 3.3.3.4
效果如圖
這上面說我發了20個包
我們ifconfig來看一下
但是我們這裡寫的發的包是0,因為我們程式碼中還沒有設定統計資訊
在我們net_device結構體中有個net_device_stats這個結構體就是統計資訊
相關推薦
linux驅動之網絡卡驅動程式框架
我們這裡說的是網絡卡驅動程式,不是網路驅動程式,網路有七層,我們寫的只是最底層的東西,網路這麼多層,但是最終你還是要操作硬體啊 所以上面肯定有個硬體相關層,我們要寫的就是硬體相關的驅動程式這一小塊。 網絡卡你不需要開啟什麼裝置,你只需要socket程式設計就行了 怎
linux驅動之網絡卡驅動-虛擬網絡卡驅動編寫
我們來實現這麼一個目的 我ping 3.3.3.4的時候,按理說如果是真實網絡卡的話,我們3.3.3.3的機器,和3.3.3.4的機器。ping 3.3.3.4的時候3.3.3.3的機器會把包發給3.3.3.4,3.3.3.4收到包之後又會把包發給3.3.3.3 在驅
linux上安裝網絡卡驅動程式
這篇日誌記錄在linux上安裝網絡卡驅動的過程。使用dell的optiplex 360或者opti
Linux下安裝網絡卡驅動程式詳解
一、檢視網絡卡型號和機器位數 1、檢視網絡卡型號 linux系統下通過以下命令,可以檢視當前的網絡卡驅動資訊; [box color="white" icon="none"] [[email protected] zhangy]# lspci |grep
新裝linux系統沒有網絡卡驅動的解決方法
最近公司伺服器剛裝完centos6.0系統,發現只有一個lo網絡卡,沒有eth0也沒有ifcfg-eth0檔案,可以初步說明沒有網絡卡驅動 1.首先下載一個centos6.0的網絡卡驅動(舊版本的網絡卡驅動網上很難找,本人網上沒找到,最後通過客服人員才獲得,已經
Linux USB無線網絡卡驅動相關資料收集
Linux下USB無線網絡卡驅動程式移植的實現 http://www.docin.com/p-297997312.html linux下安裝USB無線網絡卡驅動 http://wenku.baidu.com/view/fac9bb6da45177232f60a2e
Linux下無線網絡卡驅動異常解決辦法
檢視本機無線網絡卡型號:lspci | grep Network 本機型號是RTL8723BE在 https://github.com/lwfinger/rtlwifi_new 找到自己對應型號的驅動閱讀README.md rtlwifi_new A repo for
Linux下Realtek網絡卡驅動
Ubuntu有時會不支援電腦的無線網絡卡,這時就需要自己安裝了。 可以在官網找安裝檔案或者github上找原始碼編譯安裝。 $make $sudo make install $sudo modprobe 你的網絡卡型號(eg:rtl8821be) 如果你的網絡卡
Linux配置無線網絡卡驅動實現無線上網
本機裝Linux,需要配置的無線驅動。一般Ubuntu都整合無線驅動,基本上無線可以直接使用! 01、檢視無線網絡卡的型號 [[email protected] software]# lspci | grep -i network 03:00.0 Net
l(轉)Linux DM9000網絡卡驅動程式完全分析
[置頂] Linux DM9000網絡卡驅動程式完全分析 分類: Linux裝置驅動程式第三版學習筆記 2011-02-26 16:11 3513人閱讀 評論(34) 收藏 舉報 說明1:本文分析基於核心原始碼版本為linux-2
初識Linux 驅動移植 之 dm9621網絡卡驅動移植
概述 將kernel移植到開發板並能正常載入和啟動核心後,發現網絡卡並沒有工作,因此將網絡卡作為第一個移植的實踐。這篇文章用於記錄移植dm9621網絡卡過程中遇到的問題以及如何定位問題並嘗試解決。 配置核心 在找到dm9621網絡卡驅動的原始碼後,需要將其新增
linux centos6.5 安裝網絡卡驅動程式
網絡卡驅動安裝 檢視系統是否安裝了所需要的軟體包 系統已經安裝了該軟體包 系統已經安裝了gcc make 將下載的安裝包放在usr/local/src資料夾下 對壓縮檔案進行解壓 進入該目錄檢視 進入src目錄檢視 執行make install 進行安裝 進入
tiny4412學習(三)之移植linux-4.x驅動(1)支援網絡卡驅動
一、思路 上一節我們通過DNW將核心、檔案系統、裝置樹檔案燒入到記憶體中,並使用bootm啟動核心:bootm0x40600000 0x41000000 0x42000000。因為此時核心並沒有S
Linux驅動修煉之道-DM9000A網絡卡驅動框架原始碼分析
網路裝置的初始化: 通過模組的載入函式看出DM9000A的驅動是以平臺驅動的形式註冊進核心的,下邊是模組的載入函式: 1.static int __init 2.dm9000_init(void) 2.{ 3. printk(KERN_INFO "%
linux網絡卡驅動分析之probe函式
從上面結果可以看出,該裝置使用了6個BAR中的2個BAR,即BAR0和BAR1,該裝置申請了兩塊IO記憶體,BAR0的範圍為:fea00000-fea1ffff,大小為128KB,用來對映裝置暫存器,BAR1的範圍為fea20000-fea23fff,大小為32KB,用來對映flash。裝置需要
LINUX核心升級 - 更新網絡卡驅動
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Linux 網絡卡驅動sk_buff核心原始碼隨筆
這幾天在除錯有關網絡卡驅動的東西,有很多地方不清楚。而且網絡卡驅動主要有兩個很重要的結構體:struct net_device 和struct sk_buff。 驅動都是圍繞這兩個東西進行操作的,為了搞清楚該如何按協議棧處理資料包,週末閒來無事就看看核
Kali Linux ——在無網路情況下安裝無線網絡卡驅動
1、背景: 今日剛剛開始學習kali linux,眾所周知,安裝完成後,系統是沒有無線網絡卡驅動的,這就對學生黨造成相當的困擾:校園網要連線有線是需要認證客戶端的,而認證客戶端只有windows端,如此一來,無線網也連不上,有線網也連不上,這就......很尷尬。 因此我走訪各大部落格,雖然沒能直接解
linux下編譯新核心,解決無法找到eth0裝置問題,安裝eth0網絡卡驅動
由於我的blktrace執行時出現問題,只能對裝置測試一次,第二次的時候就會報如下錯誤:no such file or directory google瞭解決方案,很多都說是核心版本的問題,簡單的方法解決不了啊,測試不能不做啊,所以今天只能果斷換核心版本了(不過我想說每編一次核心,都會遇到新的
Linux 網絡卡驅動學習(二)(網路驅動介面小結)
【摘要】前文我們分析了一個虛擬硬體的網路驅動例子,從中我們看到了網路裝置的一些介面,其實網路裝置驅動和塊裝置驅動的功能比較類似,都是傳送和接收資料包(資料請求)。當然它們實際是有很多不同的。 1、引言 首先塊裝置在/dev目錄下有裝置節點,而網路裝置沒有