freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux網(wǎng)絡(luò)設(shè)備分析-文庫吧

2025-06-14 08:40 本頁面


【正文】 地址的長度。以太網(wǎng)網(wǎng)卡的物理地址為6字節(jié)(ETH_ALEN)。 unsigned long pa_addr。 /* protocol address */ unsigned long pa_brdaddr。 /* protocol broadcast addr */ unsigned long pa_mask。 /* protocol netmask */該三個(gè)域段分別描述接口的協(xié)議地址、協(xié)議廣播地址和協(xié)議的網(wǎng)絡(luò)掩碼。若devfamily為AF_INET,則它們即為IP地址。這些域段可用ifconfig賦值。 unsigned short pa_alen。 /* protocol address length */協(xié)議地址的長度。AF_INET的為4。 unsigned long pa_dstaddr。 /* protocol PP other side addr */點(diǎn)對(duì)點(diǎn)協(xié)議接口(如SLIP、PPP)用這個(gè)域記錄連接另一邊的IP值。 struct dev_mc_list *mc_list。 /* Multicast mac addresses */ int mc_count。 /* Number of installed mcasts */ struct ip_mc_list *ip_mc_list。 /* IP multicast filter chain */這三個(gè)域段用于處理多點(diǎn)傳輸。其中mc_count表示mc_list中的項(xiàng)目數(shù)。 __u32 tx_queue_len。 /* Max frames per queue allowed */一個(gè)設(shè)備的傳輸隊(duì)列能容納的最大的幀數(shù)。對(duì)以太網(wǎng),缺省為100;而plip則為節(jié)省系統(tǒng)資源,僅設(shè)為10。 /* For load balancing driver pair support */ unsigned long pkt_queue。 /* Packets queued */ struct device *slave。 /* Slave device */ struct net_alias_info *alias_info。 /* main dev alias info */ struct net_alias *my_alias。 /* alias devs */ struct sk_buff_head buffs[DEV_NUMBUFFS]。指向網(wǎng)絡(luò)接口緩沖區(qū)的指針。2. 服務(wù)處理程序以下是一些對(duì)網(wǎng)絡(luò)接口的操作,類似與字符設(shè)備和塊設(shè)備。網(wǎng)絡(luò)接口操作可以分為兩部分,一部分為基本操作,即每個(gè)網(wǎng)絡(luò)接口都必須有的操作;另一部分是可選操作。/* 基本操作 */ int (*init) (struct device *dev)。 /* Called only once. */初始化函數(shù)的指針,僅被調(diào)用一次。當(dāng)?shù)怯浺粋€(gè)設(shè)備時(shí),核心一般會(huì)讓驅(qū)動(dòng)程序初始化該設(shè)備。初始化函數(shù)功能包括以下內(nèi)容:檢測(cè)設(shè)備是否存在;自動(dòng)檢測(cè)該設(shè)備的I/O端口和中斷號(hào);填寫該設(shè)備device結(jié)構(gòu)的大部分域段;用kmalloc分配所需的內(nèi)存空間等。若初始化失敗,該設(shè)備的device結(jié)構(gòu)就不會(huì)被鏈接到全局的網(wǎng)絡(luò)設(shè)備表上。在系統(tǒng)啟動(dòng)時(shí),每個(gè)驅(qū)動(dòng)程序都試圖登記自己,當(dāng)只有那些實(shí)際存在的設(shè)備才會(huì)登記成功。這與用主設(shè)備號(hào)及次設(shè)備號(hào)索引的字符設(shè)備和塊設(shè)備不同。 int (*open) (struct device *dev)。打開網(wǎng)絡(luò)接口。每當(dāng)接口被ifconfig激活時(shí),網(wǎng)絡(luò)接口都要被打開。Open操作做以下工作:登記一些需要的系統(tǒng)資源,如IRQ、DMA、I/O端口等;打開硬件;將module使用計(jì)數(shù)器加一。 int (*stop) (struct device *dev)。停止網(wǎng)絡(luò)接口。操作內(nèi)容與open相逆。 int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev)。硬件開始傳輸。這個(gè)操作請(qǐng)求對(duì)一個(gè)包的傳輸,這個(gè)包原保存在一個(gè)socket緩沖區(qū)結(jié)構(gòu)中(sk_buff)。 int (*hard_header) (struct sk_buff *skb, struct device *dev, unsigned short type, void *daddr, void *saddr, unsigned len)。這個(gè)函數(shù)可根據(jù)先前得到的源物理地址和目的物理地址建立硬件頭(hardware header)。以太網(wǎng)接口的缺省函數(shù)是eth_header。 int (*rebuild_header)(void *eth, struct device *dev, unsigned long raddr, struct sk_buff *skb)。在一個(gè)包被發(fā)送之前重建硬件頭。對(duì)于以太網(wǎng)設(shè)備,若有未知的信息,缺省函數(shù)將使用ARP填寫。 struct enet_statistics* (*get_stats)(struct device *dev)。當(dāng)一個(gè)應(yīng)用程序需要知道網(wǎng)絡(luò)接口的一些統(tǒng)計(jì)數(shù)據(jù)時(shí),可調(diào)用該函數(shù),如ifconfig、netstat等。/* 可選操作 */ void (*set_multicast_list)(struct device *dev)。設(shè)置多點(diǎn)傳輸?shù)牡刂锋湵恚?mc_list)。 int (*set_mac_address)(struct device *dev, void *addr)。改變硬件的物理地址。如果網(wǎng)絡(luò)接口支持改變它的硬件物理地址,就可用這個(gè)操作。許多硬件不支持該功能。 int (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd)。執(zhí)行依賴接口的ioctl命令。 int (*set_config)(struct device *dev, struct ifmap *map)。改變接口配置。設(shè)備的I/O地址和中斷號(hào)可以通過該函數(shù)進(jìn)行實(shí)時(shí)修改。 void (*header_cache_bind)(struct hh_cache **hhp, struct device *dev, unsigned short htype, __u32 daddr)。 void (*header_cache_update)(struct hh_cache *hh, struct device *dev, unsigned char * haddr)。 int (*change_mtu) (struct device *dev, int new_mtu)。這個(gè)函數(shù)負(fù)責(zé)使接口MTU改變后生效。如果當(dāng)MTU改變時(shí)驅(qū)動(dòng)程序要作一些特殊的事情,就應(yīng)該寫這個(gè)函數(shù)。 struct iw_statistics* (*get_wireless_stats) (struct device *dev)。}。三. 網(wǎng)絡(luò)設(shè)備的初始化網(wǎng)絡(luò)設(shè)備的初始化主要工作是檢測(cè)設(shè)備的存在、初始化設(shè)備的device結(jié)構(gòu)及在系統(tǒng)中登記該設(shè)備。類似于字符設(shè)備和快塊設(shè)備,系統(tǒng)內(nèi)核中也存在著一張網(wǎng)絡(luò)接口管理表dev_base,但與dev_base是指向device結(jié)構(gòu)的,因?yàn)榫W(wǎng)絡(luò)設(shè)備是通過device數(shù)據(jù)結(jié)構(gòu)來表示的。dev_base實(shí)際上是一條device結(jié)構(gòu)鏈表的表頭,在系統(tǒng)初始化完成以后,系統(tǒng)檢測(cè)到的網(wǎng)絡(luò)設(shè)備將自動(dòng)地保存在這張鏈表中,其中每一個(gè)鏈表單元表示一個(gè)存在的物理網(wǎng)絡(luò)設(shè)備。登記成功的網(wǎng)絡(luò)設(shè)備必定可在dev_base鏈表中找到。網(wǎng)絡(luò)設(shè)備的初始化從觸發(fā)角度看可分為兩類:一類是由shell命令insmod觸發(fā)的模塊化驅(qū)動(dòng)程序(module),只有模塊化的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序才能用這種方式對(duì)設(shè)備進(jìn)行初始化,稱為“模塊初始化模式”;另一類是系統(tǒng)驅(qū)動(dòng)時(shí)由核心自動(dòng)檢測(cè)網(wǎng)絡(luò)設(shè)備并進(jìn)行初始化,我們稱為“啟動(dòng)初始化模式”。顯然,這兩種初始化模式存在許多不同之處,以下我們對(duì)兩者分別進(jìn)行分析。1. “模塊初始化模式”的分析167。 概述insmod命令將調(diào)用相應(yīng)模塊的init_module(),裝載模塊。init_module函數(shù)在初始化devinit函數(shù)指針后,將調(diào)用register_netdev()在系統(tǒng)登記該設(shè)備。若登記成功,則模塊裝載成功,否則返回出錯(cuò)信息。register_netdev首先檢查設(shè)備名是否已確定,若沒賦值則給它一個(gè)缺省的值ethN,N為最小的可用以太網(wǎng)設(shè)備號(hào)注 ,只有以太網(wǎng)設(shè)備的缺省名是在register_netdev中賦值的。對(duì)于其他網(wǎng)絡(luò)設(shè)備,一般在其他地方就賦以缺省值,而無需register_netdev處理。如PLIP,、plip1和plip2。若啟動(dòng)時(shí)或裝載模塊時(shí)若無指定參數(shù)傳入,則會(huì)依次對(duì)三個(gè)設(shè)備試圖進(jìn)行初始化: for (i=0。 i 3。 i++) { /* from drivers/net/ */ if (register_netdev(amp。dev_plip[i]) == 0) devices++。 };然后,網(wǎng)絡(luò)設(shè)備自己的init_function,即剛在init_module中賦值的devinit,將被調(diào)用,用來實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)接口的實(shí)際的初始化工作。若初始化成功,則將該網(wǎng)絡(luò)接口加到網(wǎng)絡(luò)設(shè)備管理表dev_base的尾部。整個(gè)函數(shù)調(diào)用關(guān)系圖如下所示。下面我們以用得最廣泛以太網(wǎng)卡之一——NE2000兼容網(wǎng)卡為例子進(jìn)行分析。NE2000網(wǎng)卡的主要驅(qū)動(dòng)程序在文件drivers/net/。圖二 “模塊初始化模式”的函數(shù)調(diào)用關(guān)系圖167。 init_moduleinit_module模塊初始化函數(shù),當(dāng)裝載模塊時(shí),核心將自動(dòng)調(diào)用該函數(shù)。在次此函數(shù)中一般處理以下內(nèi)容:1. 處理用戶可能傳入的參數(shù)name、ports及irq的值。若有,則賦給相應(yīng)的接口(注意:未登記);2. 對(duì)devinit函數(shù)指針進(jìn)行賦值,對(duì)于任何網(wǎng)絡(luò)設(shè)備這一步必不可少??!因?yàn)樵趓egister_netdev中要用到該函數(shù)指針;3. 調(diào)用register_netdev,完成檢測(cè)、初始化及設(shè)備登記等工作。/* from drivers/net/ */init_module(void){ int this_dev, found = 0。/* 對(duì)所有可能存在的以太網(wǎng)接口進(jìn)行檢測(cè)并試圖去登記,MAX_NE_CARDS為4, * 即最多可以使用4塊NE2000兼容網(wǎng)卡。 */ for (this_dev = 0。 this_dev MAX_NE_CARDS。 this_dev++) { struct device *dev = amp。dev_ne[this_dev]。 /* 可能有用戶傳入的參數(shù):指定的name、ports及irq的值 */ devname = namelist+(NAMELEN*this_dev)。 devirq = irq[this_dev]。 devbase_addr = io[this_dev]。 devinit = ne_probe。 /* NE2000的檢測(cè)和初始化函數(shù) */ devmem_end = bad[this_dev]。 if (register_netdev(dev) == 0) { /* 試圖登記該設(shè)備 */ found++。 continue。 /* 設(shè)備登記成功,繼續(xù)登記下一個(gè)設(shè)備 */ } /* 第一次發(fā)生登記不成功事件 */ if (found != 0) /* 在這之前沒有成功登記NE2000接口,返回 */ return 0。 /* 顯示出錯(cuò)信息 */ if (io[this_dev] != 0) printk(KERN_WARNING : No NE*000 card found at i/o = %x\n, io[this_dev])。 else printk(KERN_NOTICE : No PCI cards found. Use \io=0xNNN\ value(s) for …………167。 register_netdev該函數(shù)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)接口的登記功能。其實(shí)現(xiàn)步驟如下:1. 首先檢查設(shè)備名是否已確定,若沒賦值則以以太網(wǎng)設(shè)備待之并給它一個(gè)缺省的值ethN,N為最小的可用以太網(wǎng)設(shè)備號(hào);2. 然后,網(wǎng)絡(luò)設(shè)備自己的init_function,即剛在init_module中賦值的devinit,將被調(diào)用,用來實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)接口的實(shí)際的初始化工作。3. 若初始化成功,則將該網(wǎng)絡(luò)接口加到網(wǎng)絡(luò)設(shè)備管理表dev_base的尾部/* from drivers/net/ */int register_netdev(struct device *dev){struct device *d = dev_base。 /* 取得網(wǎng)絡(luò)設(shè)備管理表的表頭指針 */…………if (dev amp。amp。 devinit) { /*若設(shè)備名字沒確定,則將之看作是以太網(wǎng)設(shè)備?。?/ if (devname amp。amp。 ((devname[0] == 39。\039。) || (devname[0] == 39。 39。))) { /* 找到下一個(gè)最小的空閑可用以太網(wǎng)設(shè)備名字 */ for (i = 0。 i MAX_ETH_CARDS。 ++i) if (ethdev_index[i] == NULL) { sprintf(devname, eth%d, i)。
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1