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

正文內(nèi)容

linux網(wǎng)絡(luò)設(shè)備分析(存儲(chǔ)版)

2025-07-29 08:40上一頁面

下一頁面
  

【正文】 cache_update= eth_header_cache_update。 devfamily = AF_INET。為了實(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)上?!璼tatic struct device eth0_dev = { eth0, 0, 0, 0, 0, ETH0_ADDR, ETH0_IRQ, 0, 0, 0, amp?!璭xtern int loopback_init(struct device *dev)。整個(gè)函數(shù)調(diào)用關(guān)系圖如下:圖四 “啟動(dòng)初始化模式”的函數(shù)調(diào)用關(guān)系圖167。netlink_fops)。其中netlink_attach為:{active_map|=(1unit)。}}⑥ 調(diào)用export_net_symbols(),向系統(tǒng)登記發(fā)布network symbols,以供系統(tǒng)的模塊(modules)使用,因?yàn)閙odule中的函數(shù)所調(diào)用的外部函數(shù)只能是已分布登記(export)的函數(shù):/* from net/ */void export_net_symbols(void){/* 該函數(shù)為宏,定義在(include/linux/)*/register_symtab(amp。/* from init/ */static int init(void * unused){…………/* 創(chuàng)建后臺(tái)進(jìn)程bdflush,以不斷循環(huán)寫出文件系統(tǒng)緩沖區(qū)中“臟”的內(nèi)容 */kernel_thread(bdflush, NULL, 0)。在此函數(shù)中,將調(diào)用device_setup對(duì)所有的設(shè)備進(jìn)行初始化工作。ifdef CONFIG_SCSIscsi_dev_init()。dev_base。elsedp = amp。/* from net/core/ */int dev_open(struct device *dev){ int ret = ENODEV。2. 若要分配DMA通道,則用request_dma進(jìn)行分配登記;3. 將該設(shè)備掛到irq2dev_map中。}static int ne_close(struct device *dev){if (ei_debug 1)printk(%s: Shutting down ethercard.\n, devname)。}irq2dev_map[devirq] = dev。}void NS8390_init(struct device *dev, int startp){…………/* 設(shè)置8390的各種寄存器的狀態(tài) */…………devtbusy = 0。在Linux中,輪詢方式可通過定時(shí)器實(shí)現(xiàn),但該方法存在一個(gè)明顯的缺點(diǎn):不管設(shè)備是否有數(shù)據(jù),系統(tǒng)總是要固定地花CPU時(shí)間去查看設(shè)備,且可能延遲對(duì)一些緊急數(shù)據(jù)的處理,因?yàn)榫W(wǎng)絡(luò)設(shè)備有數(shù)據(jù)時(shí)可能不能馬上得到CPU的響應(yīng)。這使得在不同層協(xié)議間傳輸時(shí),每層都需要知道自己這一層的協(xié)議頭和協(xié)議尾在數(shù)據(jù)包的哪里。右圖是sk_buff結(jié)構(gòu)的一個(gè)示意圖,其中每個(gè)sk_buff 都帶有一塊數(shù)據(jù)區(qū),并有四個(gè)數(shù)據(jù)指針指向相應(yīng)的位置:unsigned char *head。對(duì)緩沖區(qū)的操作,核心提供了一個(gè)比較完整的函數(shù)界面,下面將列出用的最多的幾個(gè)函數(shù)并作分析說明。釋放一個(gè)sk_buff緩沖區(qū)。當(dāng)有數(shù)據(jù)要加到緩沖區(qū)的首部時(shí),用于減少skbdata及增大skblen。void skb_reserve (struct sk_buff *skb, int len)。void skb_trim(struct sk_buff *skb, int len)從數(shù)據(jù)包的尾部剔除數(shù)據(jù)。由上幾節(jié)對(duì)NE2000的分析,我們可以發(fā)現(xiàn),該網(wǎng)絡(luò)設(shè)備的傳輸函數(shù)devhard_start_xmit為ei_start_xmit()。 /* define TX_TIMEOUT (20*HZ/100) */ if (tickssofar TX_TIMEOUT || (tickssofar (TX_TIMEOUT+5) amp。 /* EN0_IMR 中斷屏蔽寄存器(WR)*/ if (devinterrupt) { /* 正在運(yùn)行中斷服務(wù)程序 */ printk(%s: Tx request while isr active.\n,devname)。 /* 設(shè)置開始傳輸時(shí)間坐標(biāo)點(diǎn),打開“忙”標(biāo)志 */ devtrans_start = jiffies。 ei_localtxing = 1。 /* 將開始傳輸域段置為的當(dāng)前時(shí)間坐標(biāo)點(diǎn) */ devtrans_start = jiffies。 /* 若設(shè)備忙,就判斷上次傳輸是否已超時(shí) */ if (devtbusy) { /* 讀取傳輸狀態(tài)寄存器的值 */ int txsr = inb(e8390_base+EN0_TSR), isr。硬件傳輸函數(shù)hard_start_xmit函數(shù)的一般流程如下:1. 通過標(biāo)志位tbusy判斷上次數(shù)據(jù)包的傳輸是否完成。它減少skblen并增加skbdata。int skb_headroom (struct sk_buff *skb)。返回值是修改之前的skbtail指針。void kfree_skb (struct sk_buff *skb, int rw)。len=skbtail – skbdata;unsigned long truesize分配到的內(nèi)存空間大小。1. Socket緩沖區(qū)及相關(guān)操作與塊設(shè)備的緩沖區(qū)處理方式不同,網(wǎng)絡(luò)設(shè)備發(fā)送與接收數(shù)據(jù)包用的緩沖區(qū)是一個(gè)統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)sk_buff (include/linux/)。故在此我們主要討論基于中斷方式的網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。五. 數(shù)據(jù)包的傳輸和接收當(dāng)物理網(wǎng)絡(luò)設(shè)備接收到數(shù)據(jù)時(shí),系統(tǒng)是如何知道并讀取數(shù)據(jù)的呢?當(dāng)前可通過兩種途徑解決這個(gè)問題。devstart = 0。if (ei_local == NULL){ /* 只有沒調(diào)用ethdev_init(),才會(huì)出現(xiàn)以下的錯(cuò)誤 */printk(KERN_EMERG %s: ei_open passed a nonexistent device!\n, devname)。 /* 下面將分析 */MOD_INC_USE_COUNT。 } return(ret)。顯然,這二個(gè)提供獨(dú)立于設(shè)備界面的接口操作函數(shù),一定也需要調(diào)用網(wǎng)絡(luò)接口dev的open、stop函數(shù),同時(shí)它們還需置上devflags的IFF_UP標(biāo)志。amp。*//* dev_base是drivers/net/,* 并已初始化為核心支持的所有網(wǎng)絡(luò)設(shè)備的鏈表,其中包括每個(gè)設(shè)備的probe* 函數(shù)指針。 /* 字符設(shè)備的初始化 drivers/cha/ */blk_dev_init()。(?) */setup()。題外話了,言歸正傳。while (proname != NULL) {(*proinit_func)(pro)。}其中static int (*netlink_handler[MAX_LINKS])(struct sk_buff *skb);MAX_LINKS為次設(shè)備數(shù),定義為11。 ++i) pops[i] = NULL。device_setup不僅要初始化內(nèi)核支持的字符設(shè)備、塊設(shè)備,也調(diào)用net_dev_init初始化所有內(nèi)核支持的且實(shí)際存在的網(wǎng)絡(luò)設(shè)備?!璼tatic struct device plip0_dev = { plip0, 0, 0, 0, 0, 0x3BC, 5, 0, 0, 0, amp。static struct device eth6_dev = { eth6, 0,0,0,0,0xffe0 /* I/O base*/, 0,0,0,0, amp。2. “啟動(dòng)初始化模式”的分析167。 /* 傳輸隊(duì)列的長度 */ memset(devbroadcast,0xFF, ETH_ALEN)。 devset_mac_address = eth_mac_addr。/* from drivers/net/ */void ether_setup(struct device *dev){ int i。 devset_multicast_list = amp。ne_open。 /* 初始化不成功,釋放登記的中斷號(hào)! */ return ENOMEM。 /* 獲得剛才產(chǎn)生的中斷號(hào) */ ………… ………… /* 登記中斷號(hào),中斷服務(wù)程序?yàn)閑i_interrupt。 /* 檢測(cè)到一個(gè)I/O端口地址 */ if (ne_probe1(dev, ioaddr) == 0) return 0。/* from drivers/net/ */int ne_probe(struct device *dev){ ………… int base_addr = dev ? devbase_addr : 0。;對(duì)于以太網(wǎng)接口,device結(jié)構(gòu)中許多有關(guān)網(wǎng)絡(luò)接口信息都是通過調(diào)用ether_setup函數(shù)(driver/net/)統(tǒng)一來設(shè)置的,因?yàn)橐蕴W(wǎng)卡有很好的共性。 dnext = dev。 i MAX_ETH_CARDS。amp。 continue。 this_dev++) { struct device *dev = amp。圖二 “模塊初始化模式”的函數(shù)調(diào)用關(guān)系圖167。 i 3。1. “模塊初始化模式”的分析167。 struct iw_statistics* (*get_wireless_stats) (struct device *dev)。 int (*set_config)(struct device *dev, struct ifmap *map)。/* 可選操作 */ void (*set_multicast_list)(struct device *dev)。 int (*hard_header) (struct sk_buff *skb, struct device *dev, unsigned short type, void *daddr, void *saddr, unsigned len)。每當(dāng)接口被ifconfig激活時(shí),網(wǎng)絡(luò)接口都要被打開。 /* Called only once. */初始化函數(shù)的指針,僅被調(diào)用一次。 /* Packets queued */ struct device *slave。 /* Multicast mac addresses */ int mc_count。若devfamily為AF_INET,則它們即為IP地址。當(dāng)包傳送給驅(qū)動(dòng)程序傳輸時(shí),要用物理地址來產(chǎn)生正確的幀首。 /* pointer to private data */該指針指向私有數(shù)據(jù),通常該數(shù)據(jù)結(jié)構(gòu)中包括struct enet_statistics。 unsigned short type。 unsigned short family。IFF_PROMISC 全局接受模式。核心是通過檢查此標(biāo)志位來判斷設(shè)備是否是回送設(shè)備的,而不是看設(shè)備的名字是否是lo。它包括以下flags:(include/linux/)IFF_UP 表示接口在運(yùn)行中。 設(shè)備用的DMA通道。 unsigned long tbusy。 /* device I/O address */ unsigned char irq。 /* shmem recv end */ unsigned long rmem_start。二. 重要數(shù)據(jù)結(jié)構(gòu)——struct device結(jié)構(gòu)device存儲(chǔ)一個(gè)網(wǎng)絡(luò)接口的重要信息,是網(wǎng)絡(luò)驅(qū)動(dòng)程序的核心。相似地,為了能與外面世界進(jìn)行數(shù)據(jù)交流,一個(gè)網(wǎng)絡(luò)接口也必須在一個(gè)特殊的數(shù)據(jù)結(jié)構(gòu)中登記自己。網(wǎng)絡(luò)設(shè)備在做數(shù)據(jù)包發(fā)送和接收時(shí),直接通過接口訪問,不需要進(jìn)行文件的操作;而對(duì)字符設(shè)備和塊設(shè)備的訪問都需通過文件操作界面。在內(nèi)核啟動(dòng)時(shí),通過網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序,將登記存在的網(wǎng)絡(luò)設(shè)備。在附錄中是一個(gè)虛擬的字符設(shè)備驅(qū)動(dòng)程序以及寫這個(gè)程序的體會(huì),該程序已成功使用過,它是在網(wǎng)絡(luò)設(shè)備分析之前本人做的一個(gè)小小的試驗(yàn)。為了屏蔽網(wǎng)絡(luò)環(huán)境中物理網(wǎng)絡(luò)設(shè)備的多樣性,LINUX對(duì)所有的物理設(shè)備進(jìn)行抽象并定義了一個(gè)統(tǒng)一的概念,稱之為接口(Interface)。這是一個(gè)具有很好的靈活性的數(shù)據(jù)結(jié)構(gòu),可以很容易增加或刪除網(wǎng)絡(luò)協(xié)議數(shù)據(jù)包的首部。而對(duì)于字符設(shè)備和塊設(shè)備,即使該物理設(shè)備不存在,在/dev下也必定有相應(yīng)的特殊文件與之相對(duì)應(yīng)。dev_base實(shí)際上是一條device結(jié)構(gòu)鏈表的表頭,在系統(tǒng)初始化完成以后,系統(tǒng)檢測(cè)到的網(wǎng)絡(luò)設(shè)備將自動(dòng)地保存在這張鏈表中,其中每一個(gè)鏈表單元表示一個(gè)存在的物理網(wǎng)絡(luò)設(shè)備。下面我們將對(duì)之進(jìn)行詳細(xì)的分析和解剖。 /* shared mem start */這些域段標(biāo)識(shí)被設(shè)備使用的共享內(nèi)存的首地址及尾地址。ifconfig命令可顯示及修改他們的當(dāng)前值。 struct device *next。 /* Time (in jiffies) of last Tx */上次傳輸?shù)臅r(shí)間點(diǎn)(in jiffies) unsig
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1