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

正文內(nèi)容

linux下網(wǎng)絡(luò)驅(qū)動(dòng)程序設(shè)計(jì)與開(kāi)發(fā)-wenkub.com

2025-07-04 11:57 本頁(yè)面
   

【正文】 統(tǒng)計(jì)結(jié)構(gòu)中包含了很多的成員,最重要的有 rx_packets、rx_bytes,以及前面介紹的接收數(shù)據(jù)時(shí)的統(tǒng)計(jì)計(jì)數(shù)器成員,其中分別表示了接收的數(shù)據(jù)包個(gè)數(shù)和總長(zhǎng)度。在能夠數(shù)據(jù)包之前,網(wǎng)絡(luò)層必須知道數(shù)據(jù)包的一些信息。將接收到的數(shù)據(jù)放入到套接字緩沖區(qū)中,我們還不能確定該數(shù)據(jù)屬于哪一個(gè)端口,設(shè)備端口的確定是通過(guò)從網(wǎng)絡(luò)加速器接收到的消息中得到的。如果系統(tǒng)當(dāng)前的時(shí)間超過(guò)了設(shè)備開(kāi)始傳輸數(shù)據(jù)時(shí)時(shí)間至少一個(gè)超時(shí)周期,網(wǎng)絡(luò)層將調(diào)用驅(qū)動(dòng)程序的傳輸超時(shí)處理函數(shù),該函數(shù)負(fù)責(zé)完成超時(shí)后的數(shù)據(jù)重新傳輸。網(wǎng)絡(luò)接口在傳輸多個(gè)數(shù)據(jù)包時(shí),維護(hù)一個(gè)內(nèi)部的隊(duì)列,這樣就可以獲得最好的網(wǎng)絡(luò)性能。在驅(qū)動(dòng)程序中,在函數(shù) phnx_if_queue_tx 中檢測(cè)傳輸?shù)臄?shù)據(jù)是成功與否,通過(guò)調(diào)用 if_stop_queue()來(lái)停止數(shù)據(jù)包的傳輸。驅(qū)動(dòng)程序盡量保證了數(shù)據(jù)傳輸?shù)恼_M(jìn)行,而且完畢后正確釋放了 skb,如果傳輸失敗,內(nèi)核將會(huì)重新試著再傳輸,在這種情況下,驅(qū)動(dòng)程序沒(méi)有繼續(xù)進(jìn)行數(shù)據(jù)的傳輸而是停止了該隊(duì)列,等待傳輸失敗原因解決后再進(jìn)行傳輸。 接受和發(fā)送數(shù)據(jù)發(fā)送指的是將數(shù)據(jù)包通過(guò)網(wǎng)絡(luò)連接發(fā)送出去的行為,無(wú)論任何時(shí)候,內(nèi)核要傳輸一個(gè)數(shù)據(jù)包,它都會(huì)調(diào)用驅(qū)動(dòng)程序的 hard_start_transmit 函數(shù)將數(shù)據(jù)放入到外發(fā)隊(duì)列中。設(shè)備有自己的定時(shí)器,關(guān)閉設(shè)備時(shí)需要禁止該定時(shí)器繼續(xù)運(yùn)行,但在這里不是調(diào)用定時(shí)器的 del_timer 的 API 接口,而是通過(guò)調(diào)用 del_timer_sync 這個(gè)接口來(lái)實(shí)現(xiàn)的。設(shè)備在不要使用時(shí),或者臨時(shí)的停止使用,就應(yīng)該將其關(guān)閉掉。一旦準(zhǔn)備好開(kāi)始發(fā)送數(shù)據(jù)后,在設(shè)備打開(kāi)的方法中還必須要啟動(dòng)該端口的傳輸隊(duì)列,這樣來(lái)允許接口接收傳輸?shù)臄?shù)據(jù)包,內(nèi)核提供如下的函數(shù)啟動(dòng)該隊(duì)列:if_start_queue(dev)。rmi_phnx_mac_timer()內(nèi)部通過(guò) MII 接口讀取 PHY 寄存器,來(lái)獲取當(dāng)前設(shè)備的物理鏈路中是否有載波信號(hào),并向上層報(bào)告。 …}。Linux 內(nèi)核定時(shí)器為我們提供了良好的機(jī)制供我們使用。數(shù)據(jù)緩沖區(qū)由skb_buf 結(jié)構(gòu)保存。設(shè)備的打開(kāi)是通過(guò)函數(shù) rmi_phnx_mac_open()接口實(shí)現(xiàn)的,設(shè)備的打開(kāi)操作都是自旋鎖的保護(hù)下完成的,這主要是為了防止在同一時(shí)刻驅(qū)動(dòng)程序的并發(fā)執(zhí)行。網(wǎng)絡(luò)設(shè)備的注冊(cè)由接口 registre_device()來(lái)完成,調(diào)用registre_device() 向系統(tǒng)注冊(cè)網(wǎng)絡(luò)接口,在這個(gè)函數(shù)中將分配一個(gè)在系統(tǒng)中惟一的名稱給網(wǎng)絡(luò)接口,在驅(qū)動(dòng)程序中就是將 devname 字段中的 eth%d 分別替換為 eth0,eth1,eth2,eth3,并且將這些網(wǎng)絡(luò)接口設(shè)備添加到系統(tǒng)網(wǎng)絡(luò)設(shè)備的全局鏈表 devbase 中,注冊(cè)完成以后,系統(tǒng)知道有這個(gè)設(shè)備存在,就可以調(diào)用驅(qū)動(dòng)程序來(lái)操作設(shè)備了。主要原因在于 XLR 處理器是一個(gè)多核的處理器,一共包含有 8 個(gè) CPU,而在多處理器上如何控制程序并發(fā)的執(zhí)行,是多處理器使用的技術(shù)難點(diǎn)。phnx_mac_devices 數(shù)組中定義了四個(gè)元素,即四個(gè)端口,并且分別給出了每個(gè)端口的各個(gè)字段的初始值。int irq。privspill_configured = 0。privid = i。自旋鎖使用上最重要的一個(gè)規(guī)則就是,自旋鎖必須盡可能的最在最短時(shí)間內(nèi)擁有。初始化自旋鎖。之前已經(jīng)描述過(guò)的 ether_setup()函數(shù)為以太網(wǎng)設(shè)備設(shè)置了很多的默認(rèn)值,但是這些值在設(shè)置為默認(rèn)值之后,我們可以根據(jù)設(shè)備的實(shí)際數(shù)據(jù)處理能力修改這些設(shè)置。devwatchdog_timeo = (1000 * HZ)。devset_multicast_list = rmi_phnx_mac_set_multicast_list。devopen = rmi_phnx_mac_open。devbase_addr = mmio_start。最后設(shè)置了設(shè)備的廣播地址,廣播地址設(shè)置后需要在接口標(biāo)志中添加接口對(duì)廣播的支持才能使接口真正的具有廣播的能力。下面就將介紹開(kāi)發(fā)板網(wǎng)卡驅(qū)動(dòng)程序是如何初始化設(shè)備指針以及成員函數(shù)的。該芯片在注冊(cè)時(shí)系統(tǒng)提供的四個(gè)中斷號(hào)分別為 2227 和 28。devirq = phnx_mac_devices[i].irq。alloc_dev()中可以看出_device 和網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu)是一起分配的,要想獲得網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu)的地址,函數(shù) dev_priv 直接返回了 _device 結(jié)構(gòu)末端地址,實(shí)際上也就是網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu) driver_data *priv 的起始地址。dev = alloc_etherdev(sizeof(struct driver_data));向系統(tǒng)申請(qǐng)內(nèi)存并且初始化一個(gè)以太網(wǎng)設(shè)備,并且使用 eth%d 的形式指定分配給網(wǎng)絡(luò)設(shè)備的名字,同時(shí)用以太網(wǎng)的默認(rèn)值初始化 _device 中的大部分成員。相對(duì)于一般網(wǎng)卡設(shè)備的私有數(shù)據(jù)區(qū)不同的是,在私有數(shù)據(jù)區(qū)內(nèi)還專門(mén)設(shè)置了一個(gè)標(biāo)志(instance)來(lái)表示該私有數(shù)據(jù)區(qū)是屬于哪個(gè)端口的。函數(shù) rmi_phnx_mac_init_module 是驅(qū)動(dòng)程序模塊的入口點(diǎn),也是設(shè)備的初始化函數(shù),在這里完成了設(shè)備的初始化,并在最后完成初始化之后向系統(tǒng)注冊(cè)了該網(wǎng)卡設(shè)備。驅(qū)動(dòng)程序的初始化入口點(diǎn)是rmi_phnx_mac_init_module(void),宏 module_init()展開(kāi)為 init_module(),并將 rmi_phnx_mac_init_module 傳遞給內(nèi)核。另外,因?yàn)槭状卧O(shè)計(jì)網(wǎng)絡(luò)驅(qū)動(dòng)程序,簡(jiǎn)單的模式使我們更加容易理解網(wǎng)絡(luò)設(shè)備的工作方式,同時(shí)對(duì)于網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)方法,我們也可以更加容易掌握。設(shè)備的驅(qū)動(dòng)程序在設(shè)備驅(qū)動(dòng)功能層里實(shí)現(xiàn),設(shè)備驅(qū)動(dòng)功能功能是處理數(shù)據(jù),負(fù)責(zé)數(shù)據(jù)的接收和發(fā)送,主要的任務(wù)是傳遞給物理媒介需要發(fā)送的數(shù)據(jù),然后接收數(shù)據(jù)后,傳輸給上層網(wǎng)絡(luò)協(xié)議接口。值得注意的是:23 號(hào)寄存器中的所有比特在擴(kuò)展寄存器被訪問(wèn)以后或者沒(méi)有被訪問(wèn)時(shí)必須清零,否則可能發(fā)生意想不到的錯(cuò)誤。因?yàn)閿U(kuò)展的寄存器中,有很多寄存器都是影子寄存器,如 24 號(hào)寄存器(輔助控制寄存器) 。以太網(wǎng)媒體接口有:MII,RMII,SMII,GMII,所有的這些接口都從 MII 而來(lái),MII 是(Medium Independent Interface)的意思,是指不用考慮媒體是銅軸、光纖、電纜等,因?yàn)檫@些媒體處理的相關(guān)工作都有 PHY 或者叫做 MAC 的芯片完成。在不對(duì) MAC 硬件重新設(shè)計(jì)或替換的情況下,任何類型的 PHY 設(shè)備都可以正常工作。管理接口是個(gè)雙信號(hào)接口:一個(gè)是時(shí)鐘信號(hào),另一個(gè)是數(shù)據(jù)信號(hào)。它包括一個(gè)數(shù)據(jù)接口,以及一個(gè)MAC 和 PHY 之間的管理接口。 需求分析以及 MII 接口隨著 內(nèi)核代碼不斷的提高級(jí)別,我們看到隨著升級(jí),內(nèi)核代碼的編寫(xiě)也趨于混亂,就現(xiàn)在來(lái)看,在清晰度上, 比 更加有優(yōu)勢(shì),也分類定義了資源,具有很好的可讀性,修改起來(lái)也很簡(jiǎn)單; 的代碼大量使用 C 的 struct,從而具有 C++的面向?qū)ο箫L(fēng)格; 支持標(biāo)準(zhǔn)的高級(jí)電源管理;在同一個(gè)目標(biāo)板上,的內(nèi)核相比 的內(nèi)核,具有更高的效能。在網(wǎng)絡(luò)驅(qū)動(dòng)程序中,假如硬件缺乏中斷性能,定時(shí)器可以提供輪詢(poll)方式,從而存取硬件。 時(shí)鐘時(shí)鐘在實(shí)現(xiàn)驅(qū)動(dòng)程序時(shí)侯,會(huì)應(yīng)用到很多地方。操作系統(tǒng)一定得提供驅(qū)動(dòng)程序響應(yīng)中斷的能力。因此在驅(qū)動(dòng)程序里,需要通知系統(tǒng)發(fā)送函數(shù)的位置,在有數(shù)據(jù)要發(fā)送時(shí),系統(tǒng)會(huì)調(diào)用發(fā)送程序。同時(shí)操作系統(tǒng)給予驅(qū)動(dòng)程序的支持也一樣。在結(jié)束初始化后,就能夠打開(kāi)設(shè)備,發(fā)送和接收數(shù)據(jù)包。在嵌入式設(shè)備中,硬件的功能一般是特定、專一的,在將驅(qū)動(dòng)程序編進(jìn)內(nèi)核時(shí),我們通常選擇靜態(tài)編譯來(lái)獲得更高的效率。由于使用了原子性的 kmap,因此不能一次映射多個(gè)片段。它遞減 skblen 和遞增 skbdata;這是從傳入的數(shù)據(jù)包的頭部剝離硬件頭所使用的方法。void skb_reserve(struct sk_buff *skb, int len);這個(gè)函數(shù)遞增 data 和 tail。int skb_tailroom(struct sk_buff *skb);該函數(shù)返回緩沖區(qū)中可用空間的大小。unsigned char *skb_put(struct sk_buff *skb, int len);unsigned char *__skb_put(struct sk_buff *skb, int len);更新 sk_buff 構(gòu)中的 tail 和 len 成員;可用這些函數(shù)在緩沖區(qū)尾部添加數(shù)據(jù)。void kfree_skb(struct sk_buff *skb);void dev_kfree_skb(struct sk_buff *skb);void dev_kfree_skb_irq(struct sk_buff *skb);void dev_kfree_skb_any(struct sk_buff *skb);釋放一個(gè)緩沖區(qū)。下面是最常用的幾個(gè)函數(shù)。驅(qū)動(dòng)程序負(fù)責(zé)將其設(shè)置為 PACKET_HOST (數(shù)據(jù)包是給我的) ,PACKET_OTHERHOST,PACKET_BROADCAST,或者PACKET_MULTICAST。unsigned int len;unsigned int data_len;len 是報(bào)文中全部數(shù)據(jù)的長(zhǎng)度,data_len 是報(bào)文存儲(chǔ)于單個(gè)片中的數(shù)據(jù)片段的長(zhǎng)度,如果使用 sctter/gather I/O,data_len 成員的值為 0。網(wǎng)絡(luò)驅(qū)動(dòng)程序要負(fù)責(zé)設(shè)置傳入數(shù)據(jù)包的 mac 指針,這個(gè)任務(wù)正常是由 eth_type_trans 處理,但是非以太網(wǎng)驅(qū)動(dòng)不得直接設(shè)置 skb。struct _device *dev;接收或發(fā)送該緩沖區(qū)的設(shè)備。通過(guò)這些可選的方法,實(shí)現(xiàn)禁止中斷、輪詢模式操作接口、執(zhí)行接口特有的 ioctl 命令、改變硬件地址、改變接口的 MTU、以及 hhcache 的查詢更新等功能。int (*set_config)(struct _device *dev, struct ifmap *map);在改變接口配置時(shí),這個(gè)方法是配置驅(qū)動(dòng)的入口點(diǎn)。在以太網(wǎng)設(shè)備運(yùn)用的缺省的函數(shù)中,通過(guò)使用 ARP 協(xié)議,充實(shí)數(shù)據(jù)包沒(méi)有的硬件地址信息。在套接字緩存區(qū)(sk_buff)結(jié)構(gòu)中,有一個(gè)完整的數(shù)據(jù)包(協(xié)議頭和所有)int (*hard_header) (struct sk_buff *skb, struct _device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);該方法依據(jù)先前取到的源和目的硬件地址,從而建立硬件頭,并且在 hard_start_xmit 前被調(diào)用。open 方法應(yīng)該注冊(cè)設(shè)備需要的所有系統(tǒng)資源(I/O 口、IRQ、DMA 等等) ,打開(kāi)硬件,并且對(duì)設(shè)備執(zhí)行其他所要的設(shè)置。網(wǎng)絡(luò)接口的設(shè)備方法可歸為基本的和可選的兩個(gè)類型。內(nèi)核管理一些標(biāo)志,接口在初始化期間設(shè)置其他的標(biāo)志,這可以用以聲明接口的能力及其他特性。unsigned char addr_len;unsigned char broadcast[MAX_ADDR_LEN];unsigned char dev_addr[MAX_ADDR_LEN];硬件(MAC)地址長(zhǎng)度和設(shè)備硬件地址。unsigned short type;接口的硬件類型.。unsigned mtu;最大傳輸單元(MTU) [5]。我們把大部分設(shè)備都?xì)w于這些類別中的一類。void fc_setup(struct _device *dev);初始化光通道設(shè)備。ether_setup 函數(shù)正確設(shè)置有關(guān)接口的許多信息,或者任何其他給定硬件類型適合的設(shè)置函數(shù)。完整的已知端口類型設(shè)置定義在linux/。當(dāng)列出接口時(shí),ifconfig 命令打印出 devirq 的值。 Ifconfig 命令能夠來(lái)顯示或修改當(dāng)前值。在驅(qū)動(dòng)之外,rmem 成員不被引用。它們延續(xù)了早期 Linux 的 網(wǎng)絡(luò)特點(diǎn),它們?nèi)匀槐滑F(xiàn)在許多驅(qū)動(dòng)程序使用。int (*init)(struct _device *dev);初始化函數(shù)。設(shè)備狀態(tài)包含一些數(shù)量的標(biāo)志。 網(wǎng)絡(luò)驅(qū)動(dòng)程序設(shè)計(jì)用到的數(shù)據(jù)結(jié)構(gòu)位于網(wǎng)絡(luò)驅(qū)動(dòng)層核心位置的 _device[1]結(jié)構(gòu)是我們理解網(wǎng)卡設(shè)備的最好切入點(diǎn)。設(shè)計(jì) Linux 下網(wǎng)絡(luò)驅(qū)動(dòng)程序時(shí),我們使用的是面向?qū)ο蟮姆椒ā>W(wǎng)絡(luò)接口由內(nèi)核中的網(wǎng)絡(luò)子系統(tǒng)驅(qū)動(dòng),負(fù)責(zé)數(shù)據(jù)包的接收和發(fā)送,但它不需要了每項(xiàng)事務(wù)是如何映射到實(shí)際傳送的數(shù)據(jù)包的。塊設(shè)備上可以包納文件系統(tǒng)。典型的字符設(shè)備包括鼠標(biāo),鍵盤(pán),串行口等。 Linux 設(shè)備驅(qū)動(dòng)程序分類在 Linux 的內(nèi)核源代碼中,Linux 設(shè)備驅(qū)動(dòng)程序占有比較大的比例,源代碼的長(zhǎng)度的增加,增加的是驅(qū)動(dòng)程序。用戶的活動(dòng)通過(guò)一套規(guī)范的調(diào)用來(lái)實(shí)施,但是這些調(diào)用不隸屬于特定的驅(qū)動(dòng)程序。通過(guò)組建在 Linux 操作系統(tǒng)下的 TCP/IP 網(wǎng)絡(luò),來(lái)分配 IP 地址以及區(qū)分網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)的子網(wǎng)掩碼,通過(guò)配置 DHCP 服務(wù)器,實(shí)現(xiàn)動(dòng)態(tài)地為主機(jī)配置 IP 參數(shù),解決手工配置存在的問(wèn)題。 本文主要內(nèi)容論文首先對(duì) Linux 下設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的基本知識(shí)進(jìn)行介紹,其中包括對(duì)Linux 的發(fā)展歷程、內(nèi)核、特性的概述,Linux 設(shè)備的分類及編寫(xiě)驅(qū)動(dòng)程序的一些基本概念等,以及模塊的加載和卸載。在網(wǎng)絡(luò)設(shè)備進(jìn)行數(shù)據(jù)包的發(fā)送和接收時(shí),可以徑直通過(guò)接口訪問(wèn),不需要進(jìn)行文件的操作;而對(duì)字符設(shè)備和塊設(shè)備的訪問(wèn)都需通過(guò)文件操作界面。 課題的研究目的Linux 操作系統(tǒng)的設(shè)備種類繁多,
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1