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

正文內(nèi)容

linux網(wǎng)絡(luò)設(shè)備分析-全文預(yù)覽

  

【正文】 。整個(gè)函數(shù)調(diào)用關(guān)系圖如下:圖四 “啟動(dòng)初始化模式”的函數(shù)調(diào)用關(guān)系圖167。 /* 關(guān)鍵的一個(gè)語(yǔ)句 */167?!璭xtern int loopback_init(struct device *dev)。eth0_dev)if defined(PLIP) || defined(CONFIG_PLIP)extern int plip_init(struct device *)?!璼tatic struct device eth0_dev = { eth0, 0, 0, 0, 0, ETH0_ADDR, ETH0_IRQ, 0, 0, 0, amp。我們看一下dev_base的初始化情況。為了實(shí)現(xiàn)在啟動(dòng)時(shí)對(duì)所有可能存在的設(shè)備進(jìn)行初始化,系統(tǒng)在啟動(dòng)之前將所有內(nèi)核支持的網(wǎng)絡(luò)設(shè)備的名字及相應(yīng)的初始化函數(shù)都掛在網(wǎng)絡(luò)設(shè)備管理表(dev_base)上。 /* 以后用ifconfig命令設(shè)置 */ devpa_alen = 4。 devfamily = AF_INET。 /* 最大傳輸單位 */ devaddr_len = ETH_ALEN。 devheader_cache_update= eth_header_cache_update。 devhard_header= eth_header。 i DEV_NUMBUFFS。那么讓我們看看它到底會(huì)缺省設(shè)哪些域段及設(shè)為什么值。 ether_setup(dev)。ei_start_xmit。ne_close。 } printk(\n%s: %s found at %x, using IRQ %d.\n, devname, name, ioaddr, devirq)。 /* 將硬件的物理地址賦給devdev_add */ for(i = 0。 /* 設(shè)置I/O地址——已經(jīng)過(guò)確認(rèn) */ /* 調(diào)用ethdev_init初始化dev結(jié)構(gòu) */ if (ethdev_init(dev)) { /* 該函數(shù)下面將分析 */ printk ( unable to get memory for devpriv.\n)。*/ int irqval = request_irq(devirq, ei_interrupt,pci_irq_line ? SA_SHIRQ : 0, name, dev)。 /* 觸發(fā)中斷 */ outb_p(0x00, ioaddr + EN0_IMR)。 /* 自動(dòng)檢測(cè)準(zhǔn)備 */ outb_p(0x50, ioaddr + EN0_IMR)。 i++) { int ioaddr = netcard_portlist[i]。 /* 這個(gè)函數(shù)在下面分析 */ else if (base_addr != 0) /* 不自動(dòng)檢測(cè)I/O */ return ENXIO。這與用主設(shè)備號(hào)及次設(shè)備號(hào)索引的字符設(shè)備和塊設(shè)備不同。若添加的網(wǎng)絡(luò)設(shè)備都不屬于這些類型,就需要自己填寫(xiě)device結(jié)構(gòu)的各個(gè)分量。初始化函數(shù)功能包括以下內(nèi)容:,一般和第二步一起作;;對(duì)于可以與其他共享中斷號(hào)的設(shè)備,我們應(yīng)盡量避免在初始化函數(shù)中登記I/O地址和中斷號(hào),I/O地址和中斷號(hào)的登記最好在設(shè)備被打開(kāi)的時(shí)候,因?yàn)橹袛嗵?hào)有可能被其他設(shè)備所共享。 devnext = NULL。 break。 printk(loading device 39。 39。amp。3. 若初始化成功,則將該網(wǎng)絡(luò)接口加到網(wǎng)絡(luò)設(shè)備管理表dev_base的尾部/* from drivers/net/ */int register_netdev(struct device *dev){struct device *d = dev_base。 /* 顯示出錯(cuò)信息 */ if (io[this_dev] != 0) printk(KERN_WARNING : No NE*000 card found at i/o = %x\n, io[this_dev])。 /* NE2000的檢測(cè)和初始化函數(shù) */ devmem_end = bad[this_dev]。 /* 可能有用戶傳入的參數(shù):指定的name、ports及irq的值 */ devname = namelist+(NAMELEN*this_dev)。 */ for (this_dev = 0。在次此函數(shù)中一般處理以下內(nèi)容:1. 處理用戶可能傳入的參數(shù)name、ports及irq的值。下面我們以用得最廣泛以太網(wǎng)卡之一——NE2000兼容網(wǎng)卡為例子進(jìn)行分析。dev_plip[i]) == 0) devices++。如PLIP,、plip1和plip2。init_module函數(shù)在初始化devinit函數(shù)指針后,將調(diào)用register_netdev()在系統(tǒng)登記該設(shè)備。網(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)初始化模式”。三. 網(wǎng)絡(luò)設(shè)備的初始化網(wǎng)絡(luò)設(shè)備的初始化主要工作是檢測(cè)設(shè)備的存在、初始化設(shè)備的device結(jié)構(gòu)及在系統(tǒng)中登記該設(shè)備。這個(gè)函數(shù)負(fù)責(zé)使接口MTU改變后生效。設(shè)備的I/O地址和中斷號(hào)可以通過(guò)該函數(shù)進(jìn)行實(shí)時(shí)修改。 int (*do_ioctl)(struct device *dev, struct ifreq *ifr, int cmd)。 int (*set_mac_address)(struct device *dev, void *addr)。 struct enet_statistics* (*get_stats)(struct device *dev)。以太網(wǎng)接口的缺省函數(shù)是eth_header。硬件開(kāi)始傳輸。 int (*stop) (struct device *dev)。 int (*open) (struct device *dev)。初始化函數(shù)功能包括以下內(nèi)容:檢測(cè)設(shè)備是否存在;自動(dòng)檢測(cè)該設(shè)備的I/O端口和中斷號(hào);填寫(xiě)該設(shè)備device結(jié)構(gòu)的大部分域段;用kmalloc分配所需的內(nèi)存空間等。網(wǎng)絡(luò)接口操作可以分為兩部分,一部分為基本操作,即每個(gè)網(wǎng)絡(luò)接口都必須有的操作;另一部分是可選操作。 /* main dev alias info */ struct net_alias *my_alias。對(duì)以太網(wǎng),缺省為100;而plip則為節(jié)省系統(tǒng)資源,僅設(shè)為10。 /* IP multicast filter chain */這三個(gè)域段用于處理多點(diǎn)傳輸。 /* protocol PP other side addr */點(diǎn)對(duì)點(diǎn)協(xié)議接口(如SLIP、PPP)用這個(gè)域記錄連接另一邊的IP值。 unsigned short pa_alen。 /* protocol broadcast addr */ unsigned long pa_mask。 /* hardware address length */物理地址的長(zhǎng)度。 (drivers/net/) unsigned char dev_addr[MAX_ADDR_LEN]。 unsigned char pad。 /* hardware hdr length */在被傳送的包中IP頭之前的字節(jié)數(shù)。Linux網(wǎng)絡(luò)設(shè)備支持許多不同種類的媒介,如以太網(wǎng),令牌環(huán),SLIP,PPP,Apple Localtalk等。網(wǎng)絡(luò)層在包傳輸時(shí)要用到。大部分為AF_INET(英特網(wǎng)IP協(xié)議),接口通常不需要用這個(gè)域段或賦值給它。IFF_ALLMULTI 接收所有多點(diǎn)傳送的IP包。在缺省情況下,以太網(wǎng)接口會(huì)使用硬件過(guò)濾,以保證只接受廣播包及發(fā)給本網(wǎng)絡(luò)接口的包。通常的網(wǎng)絡(luò)接口能傳輸ARP包,如果想讓接口不執(zhí)行ARP,可置上該標(biāo)志位。Ifconfig也可以置此標(biāo)志位及清除它。雖然當(dāng)前沒(méi)有正式的驅(qū)動(dòng)程序使用它,但它可以在程序中通過(guò)ioctl來(lái)設(shè)置從而使用它。IFF_BROADCAST 表示設(shè)備中的廣播地址時(shí)有效的。 unsigned short flags。 unsigned long trans_start。記錄哪個(gè)硬件I/O端口正在被接口所用,如BNC,AUI,TP等(drivers/net/)。在驅(qū)動(dòng)程序不能接受一個(gè)新的需傳輸?shù)陌鼤r(shí),該域段應(yīng)該為非零。通常在設(shè)備打開(kāi)時(shí)置start標(biāo)志,在設(shè)備關(guān)閉時(shí)清start標(biāo)志。它們都是在設(shè)備檢測(cè)期間被賦值的,但也可以在系統(tǒng)啟動(dòng)時(shí)指定傳入(如傳給LILO)。rmem域段從來(lái)不被驅(qū)動(dòng)程序以外的程序所引用。 /* shared mem end */ unsigned long mem_start。如果第一字符為NULL(即’\0’),register_netdev (drivers/net/)將會(huì)賦給它一個(gè)n最小的可用網(wǎng)絡(luò)設(shè)備名ethn??梢?jiàn)部分是由外部賦值;隱藏部分的域段僅面向系統(tǒng)內(nèi)部,它們可以隨時(shí)被改變。通常一個(gè)名字僅表明該接口的類型。類似地,在內(nèi)核中也存在著一張網(wǎng)絡(luò)接口管理表dev_base,但與前兩張表不同,dev_base是指向device結(jié)構(gòu)的指針,因?yàn)榫W(wǎng)絡(luò)設(shè)備是通過(guò)device數(shù)據(jù)結(jié)構(gòu)來(lái)表示的。然而,它們之間又有一些共同之處,如在系統(tǒng)中一個(gè)網(wǎng)絡(luò)設(shè)備的角色和一個(gè)安裝的塊設(shè)備相似。 網(wǎng)絡(luò)接口是在系統(tǒng)初始化時(shí)實(shí)時(shí)生成的,對(duì)于核心支持的但不存在的物理網(wǎng)絡(luò)設(shè)備,將不可能有與之相對(duì)應(yīng)的device結(jié)構(gòu)。 網(wǎng)絡(luò)接口不存在于Linux的文件系統(tǒng)中,而是在核心中用一個(gè)device數(shù)據(jù)結(jié)構(gòu)表示的。所有被發(fā)送和接收的包都用數(shù)據(jù)結(jié)構(gòu)sk_buff表示。對(duì)于每個(gè)網(wǎng)絡(luò)接口,都用一個(gè)device的數(shù)據(jù)結(jié)構(gòu)表示,有關(guān)該數(shù)據(jù)結(jié)構(gòu)的具體內(nèi)容,將在本文的后面詳細(xì)介紹。在本文中,我們將等效使用“網(wǎng)絡(luò)設(shè)備”和“網(wǎng)絡(luò)接口”這兩個(gè)概念,而對(duì)某個(gè)具體的網(wǎng)絡(luò)設(shè)備,我們將稱之為“物理設(shè)備”或“物理網(wǎng)絡(luò)設(shè)備”。Linux網(wǎng)絡(luò)設(shè)備分析[摘要] 在本文中,首先概括了網(wǎng)絡(luò)設(shè)備總體特征和工作原理,接著在分析了一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)device后,重點(diǎn)剖析了網(wǎng)絡(luò)設(shè)備的整個(gè)初始化工作過(guò)程;簡(jiǎn)單地分析了設(shè)備的打開(kāi)和關(guān)閉的操作后,是有關(guān)數(shù)據(jù)包的傳輸和接收的分析;在最后,本文對(duì)寫(xiě)網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序做了一個(gè)總結(jié)。一. 網(wǎng)絡(luò)設(shè)備概述在LINUX中,為了簡(jiǎn)化對(duì)設(shè)備的管理,所有外圍的硬件設(shè)備被歸結(jié)為三類:字符設(shè)備(如鍵盤、鼠標(biāo)等)、塊設(shè)備(如硬盤、光驅(qū)、軟驅(qū)等)和網(wǎng)絡(luò)設(shè)備(也稱為網(wǎng)絡(luò)接口,network inferface),如以太網(wǎng)卡。一個(gè)網(wǎng)絡(luò)接口被看作是一個(gè)發(fā)送和接收數(shù)據(jù)包(packets)的實(shí)體。設(shè)備用標(biāo)準(zhǔn)的支持網(wǎng)絡(luò)的機(jī)制來(lái)轉(zhuǎn)遞收到的數(shù)據(jù)到相應(yīng)的網(wǎng)絡(luò)層。它與字符設(shè)備及塊設(shè)備都有很大的不同:167。167。以上兩點(diǎn)是網(wǎng)絡(luò)設(shè)備與其他設(shè)備之間存在的最主要的不同。在系統(tǒng)內(nèi)核中,存在字符設(shè)備管理表chardevs和塊設(shè)備管理表blkdevs,這兩張保存著指向file_operations結(jié)構(gòu)的指針的設(shè)備管理表,分別用來(lái)描述各種字符驅(qū)動(dòng)程序和塊設(shè)備驅(qū)動(dòng)程序。以下是網(wǎng)絡(luò)設(shè)備工作原理圖:圖一 Linux網(wǎng)絡(luò)設(shè)備工作原理圖每一個(gè)具體的網(wǎng)絡(luò)接口都應(yīng)該有一個(gè)名字,以在系統(tǒng)中能唯一標(biāo)識(shí)一個(gè)網(wǎng)絡(luò)接口。在邏輯上,它可以分割為兩個(gè)部分:可見(jiàn)部分和隱藏部分。設(shè)備的名字。 /* shmem recv start */ unsigned long mem_end。mem_start和mem_end可在系統(tǒng)啟動(dòng)時(shí)用內(nèi)核的命令行指定,用ifconfig可以查看它們的值。 /* device IRQ number */I/O基地址和中斷號(hào)。 /* interrupt arrived */這是兩個(gè)二值的低層狀態(tài)標(biāo)志。 /* transmitter busy must be long for bitops */標(biāo)識(shí)“發(fā)送忙”。 unsigned char if_port。一些設(shè)備可能需要以上兩個(gè)域段,但非必需的。如trans_start可用來(lái)幫助內(nèi)核檢測(cè)數(shù)據(jù)傳輸?shù)乃梨i(lockup)。當(dāng)接口被激活時(shí),內(nèi)核將置該標(biāo)志位。當(dāng)想控制printk及其他一些基于調(diào)試目的的信息顯示時(shí),可利用這個(gè)標(biāo)志位。IFF_POINTTOPOINT 表示這是一個(gè)點(diǎn)對(duì)點(diǎn)鏈接(SLIP and PPP),點(diǎn)對(duì)點(diǎn)接口必須置該標(biāo)志位。IFF_NOARP 表示不支持ARP協(xié)議。在該模式下,設(shè)備將接受所有的包,而不關(guān)這些包是發(fā)給誰(shuí)的。ether_setup缺省是置該標(biāo)志位的,故若不想支持多點(diǎn)傳送,必須在初始化時(shí)清除該標(biāo)志位。 /* address family ID (AF_INET) */該域段標(biāo)識(shí)本設(shè)備支持的協(xié)議地址簇。 不包括數(shù)據(jù)鏈路層幀首幀尾的最大傳輸單位(Maximum Transfer Unit)。 /* interface hardware type */接口的硬件類型,描述了與該網(wǎng)絡(luò)接口綁在一起的媒介類型。 unsigned short hard_header_len。類似于struct file的private_data指針,但priv指針是在設(shè)備初始化時(shí)被分配內(nèi)存空間的(而不是在設(shè)備打開(kāi)時(shí)),因?yàn)樵撝羔樦赶虻膬?nèi)容包括設(shè)備接口的統(tǒng)計(jì)數(shù)據(jù),而這些數(shù)據(jù)即使在接口卸下(down)時(shí)也應(yīng)可以得到的,如用戶通過(guò)ifconfig查看。memset(devbroadcast,0xFF, ETH_ALEN)。 unsigned char addr_
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1