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

正文內(nèi)容

基于arm的linux網(wǎng)卡驅(qū)動程序的開發(fā)與設(shè)計(論文最終完成)(文件)

2025-02-03 13:04 上一頁面

下一頁面
 

【正文】 nsigned char broadcast[MAX_ADDR_LEN];unsigned char dev_addr[MAX_ADDR_LEN];硬件(MAC)地址長度和設(shè)備硬件地址。unsigned short flags;int features;這個flags 成員是一個位掩碼。在這里討論一下能夠?qū)W(wǎng)絡(luò)接口進行的操作。下面的是基本方法:int (*open)(struct net_device *dev);打開接口。當(dāng)接口終止時當(dāng)它應(yīng)該被關(guān)閉。int (*hard_header) (struct sk_buff *skb, struct net_device *dev, unsigned short type, void *daddr, void *saddr, unsigned len);該方法根據(jù)之前取到的源和目的硬件地址來建立硬件頭,并在 hard_start_xmit前被調(diào)用。在以太網(wǎng)設(shè)備使用的缺省的函數(shù)中通過使用ARP協(xié)議來填充數(shù)據(jù)包缺少的硬件地址信息。int (*set_config)(struct net_device *dev, struct ifmap *map);在改變接口配置時,這個方法是配置驅(qū)動的入口點。通過這些可選的方法,實現(xiàn)禁止中斷、輪詢模式操作接口、執(zhí)行接口特有的ioctl命令、改變硬件地址、改變接口的MTU、以及hhcache的查詢更新等功能。struct net_device *dev;接收或發(fā)送該緩沖區(qū)的設(shè)備。網(wǎng)絡(luò)驅(qū)動程序要負責(zé)設(shè)置傳入數(shù)據(jù)包的mac指針,這個任務(wù)正常是由 eth_type_trans 處理,但是非以太網(wǎng)驅(qū)動不得直接設(shè)置skb。unsigned int len;unsigned int data_len;len是報文中全部數(shù)據(jù)的長度,data_len是報文存儲于單個片中的數(shù)據(jù)片段的長度,如果使用sctter/gather I/O,data_len 成員的值為0。驅(qū)動程序負責(zé)將其設(shè)置為PACKET_HOST (數(shù)據(jù)包是給我的),PACKET_OTHERHOST,PACKET_BROADCAST,或者PACKET_MULTICAST。下面是最常用的幾個函數(shù)。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);釋放一個緩沖區(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ù)。int skb_tailroom(struct sk_buff *skb);該函數(shù)返回緩沖區(qū)中可用空間的大小。void skb_reserve(struct sk_buff *skb, int len);這個函數(shù)遞增data和tail。它遞減skblen和遞增skbdata;這是從傳入的數(shù)據(jù)包的頭部剝離硬件頭所使用的方法。由于使用了原子性的kmap,因此不能一次映射多個片段。在嵌入式設(shè)備中,硬件一般只是完成比較特定、專一的功能,一般選擇將驅(qū)動程序靜態(tài)編譯進內(nèi)核,這樣可以獲得更高的效率。初始化結(jié)束后,就可以打開設(shè)備進行數(shù)據(jù)包的發(fā)送和接收。第4章 系統(tǒng)分析在一個以XLR處理器為核心處理器的嵌入式開發(fā)板中,開發(fā)一個DDOS系統(tǒng),應(yīng)用于商業(yè)、政府、軍隊等行業(yè),保障網(wǎng)絡(luò)的安全運行。網(wǎng)卡設(shè)備的性能、數(shù)據(jù)處理能力對設(shè)備的性能起著至關(guān)重要的作用,也是該設(shè)備最終能否成功達到預(yù)期目標(biāo)的關(guān)鍵因素。此外還包括:2個串口輸出,一個MIC輸入接口,一個LINE音頻輸入接口,一個耳機輸出接口,2個CPU可控LED,AD轉(zhuǎn)換輸入接口,SPI和IIC接口,JTAG調(diào)試接口,CPLD編程接口,擴展GPRS和CDMA專用接口(,SPI口,IO引腳,電源等)。MII(Media Independent Interface介質(zhì)無關(guān)接口)[13],或稱為媒體獨立接口。MII數(shù)據(jù)接口總共需要16個信號。MII標(biāo)準接口用于連接Fast Ethernet MACblock與PHY。網(wǎng)絡(luò)控制器可以用同樣的硬件接口與任何PHY進行連接。標(biāo)準寄存器都可以通過MII接口直接訪問,但是擴展的寄存器中,大部分是不能直接訪問的。例如對擴展寄存器中的0號寄存器即接收/傳輸包的計數(shù)寄存器的訪問方式是:把23號寄存器的第8到11比特全部設(shè)置為1,激活擴展寄存器;把23號寄存器的第0到7比特共8個比特設(shè)置0,表示對0號擴展寄存器的訪問;讀或者寫21號寄存器,這時21號寄存器存放的值實際上就是0號擴展寄存器的值。在Linux中,把所有的網(wǎng)絡(luò)設(shè)備都抽象為一個接口,這個接口提供了對所有網(wǎng)絡(luò)設(shè)備的操作集合,由前面介紹的數(shù)據(jù)結(jié)構(gòu)struct device來表示,即網(wǎng)絡(luò)設(shè)備接口,在Linux系統(tǒng)中,所有的網(wǎng)絡(luò)設(shè)備接口構(gòu)成一個鏈表,該鏈表由dev_base為頭指針,鏈表中的元素代表一個網(wǎng)絡(luò)設(shè)備接口。通過分析和參照其它網(wǎng)絡(luò)設(shè)備驅(qū)動程序,初步將開發(fā)板驅(qū)動程序的模塊結(jié)構(gòu)設(shè)計如下圖52所示:圖52 驅(qū)動程序?qū)崿F(xiàn)模式圖在圖52中看到,開發(fā)板網(wǎng)卡驅(qū)動程序整體結(jié)構(gòu)看起來比較的簡單,主要由模塊加載、網(wǎng)絡(luò)設(shè)備初始化、注冊、設(shè)備打開與關(guān)閉、數(shù)據(jù)的發(fā)送與接收等模塊構(gòu)成。 模塊的加載及設(shè)備初始化驅(qū)動程序在linux系統(tǒng)內(nèi)核里被編譯成模塊,并在系統(tǒng)啟動的時候加載到系統(tǒng)里面。內(nèi)核調(diào)用網(wǎng)卡驅(qū)動模塊的初始化函數(shù)rmi_phnx_mac_init_module(void),如果成功將把網(wǎng)卡驅(qū)動的模塊安裝到系統(tǒng)中,并把模塊的狀態(tài)設(shè)置成為RUNNING[15]。struct driver_data是網(wǎng)卡驅(qū)動程序的私有數(shù)據(jù)的結(jié)構(gòu)體,和其它網(wǎng)卡設(shè)備結(jié)構(gòu)體一樣,該結(jié)構(gòu)體保存了和設(shè)備有關(guān)的信息。定義了設(shè)備指針以后,便開始實現(xiàn)設(shè)備的初始化。priv = netdev_priv(dev);privdev = dev;以太網(wǎng)設(shè)備申請成功以后,調(diào)用系統(tǒng)函數(shù)netdev_priv函數(shù)初始化網(wǎng)卡的私有數(shù)據(jù)結(jié)構(gòu),并將私有數(shù)據(jù)結(jié)構(gòu)中的設(shè)備指針指向自己。網(wǎng)卡最終是要用來接收和發(fā)送數(shù)據(jù)的,要接收或者發(fā)送以太網(wǎng)數(shù)據(jù)包就必須具有自己的內(nèi)存空間,即I/O內(nèi)存。一個“中斷”僅僅是一個信號,當(dāng)硬件需要獲得處理器對它的關(guān)注時,就可以發(fā)送這個信號。實現(xiàn)該通道申請的函數(shù)是request_irq(…),參數(shù)rmi_phnx_mac_int_handler是自己定義的中斷處理函數(shù)指針。其實這個初始化操作比較的簡單,沒有我們想象的那么復(fù)雜,函數(shù)指針的初始化主要集中在了對最大傳輸單元改變的控制函數(shù),以及對物理地址進行分析、處理、更新、解析等等。以上這些值的設(shè)置知識設(shè)備默認的,也是以太網(wǎng)對接入以太網(wǎng)的設(shè)備的基本能力的要求。 指定設(shè)備的I/O內(nèi)存的開始和結(jié)束位置,這樣將端口映射到內(nèi)存,供CPU直接訪問。devstop = rmi_phnx_mac_close。devtx_timeout = rmi_phnx_mac_tx_timeout。網(wǎng)卡驅(qū)動程序定義了自己的設(shè)備打開與關(guān)閉、數(shù)據(jù)傳輸、狀態(tài)更新維護、組播別表的維護、接口ioctl命令執(zhí)行、數(shù)據(jù)傳輸超時處理、MTU改變設(shè)置等回調(diào)函數(shù),并讓設(shè)備的相關(guān)函數(shù)指針指向這些回調(diào)函數(shù),傳遞給linux內(nèi)核,在需要的時候由網(wǎng)絡(luò)系統(tǒng)負責(zé)調(diào)用。spin_lock_init(amp。采用的自旋鎖的主要原因是,自旋鎖可以在不能休眠的代碼中使用,比如中斷處理例程,這正是網(wǎng)絡(luò)設(shè)備所具有的特點。長的鎖擁有時間將阻止對當(dāng)前處理器的調(diào)度,這意味著更高優(yōu)先級的進程,也即是系統(tǒng)真正應(yīng)該獲得CPU的進程不得不等待。privtype = phnx_mac_devices[i].type。這里我們看到有一個數(shù)組phnx_mac_devices,它的類型是struct phnx_mac,結(jié)構(gòu)體struct phnx_mac的詳細含義如下:phnx_mac { int instance。}。端口類型type都設(shè)置為了TYPE_GMAC,表示千兆的通信能力,而實際上芯片還具有TYPE_XGMAC的通信能力,它是TYPE_GMAC的十倍通信能力,不過在此次開發(fā)中并未使用TYPE_XGMAC,因為對于開發(fā)來說,這意味著具有更大的挑戰(zhàn)性和難度,而且在實際的主設(shè)備中,暫時還不需要TYPE_XGMAC這么大的通信能力,因此,只是需要針對TYPE_GMAC做開發(fā)就可以了。通過privspill_configured這個字段就實現(xiàn)了在多處理器上程序并發(fā)執(zhí)行時的同步控制。驅(qū)動程序被編譯進內(nèi)核,在內(nèi)核引導(dǎo)階段完成對網(wǎng)絡(luò)接口的探測。設(shè)備的打開,意味著該設(shè)備將可以正常工作了。網(wǎng)絡(luò)設(shè)備要進行數(shù)據(jù)的發(fā)送,就要檢測鏈路的連接狀況,如是否連接、斷開或者被改變。 void (*function)(unsigned long)。void add_timer(struct timer_list *timer)。設(shè)備的端口基本配置,到這里就已經(jīng)全部結(jié)束了,但是我們還是可以在使用設(shè)備端口之前,重新按照我們的需要進行端口的速率、雙工能力以及流量進行等進行配置。在設(shè)備驅(qū)動程序中,自旋鎖狀態(tài)下完成的任務(wù)已經(jīng)超出了自旋鎖提倡的盡可能執(zhí)行較少操作的這一建議。設(shè)備的關(guān)閉操作仍然需要在自旋鎖的保護下完成,否則可能發(fā)生資源的爭奪,導(dǎo)致系統(tǒng)錯誤。del_timer_sync可用于在SMP系統(tǒng)上避免競態(tài),這和單處理器內(nèi)核中的del_timer是一樣的。在設(shè)備進行初始化的時候,把設(shè)備的devhard_start_xmit函數(shù)指針指向了驅(qū)動程序自己的數(shù)據(jù)發(fā)送函數(shù)rmi_phnx_mac_xmit,在有數(shù)據(jù)發(fā)送的時候,將調(diào)用rmi_phnx_mac_xmit函數(shù)完成數(shù)據(jù)的發(fā)送任務(wù)。在數(shù)據(jù)的傳輸過程中,CPU是不能被搶占的,因此在驅(qū)動程序開始傳輸數(shù)據(jù)之前,還必須要禁止CPU的搶占,在。驅(qū)動程序盡量保證了數(shù)據(jù)傳輸?shù)恼_M行,而且完畢后正確釋放了skb,如果傳輸失敗,內(nèi)核將會重新試著再傳輸,在這種情況下,驅(qū)動程序沒有繼續(xù)進行數(shù)據(jù)的傳輸而是停止了該隊列,等待傳輸失敗原因解決后再進行傳輸。 數(shù)據(jù)的接受和發(fā)送發(fā)送指的是將數(shù)據(jù)包通過網(wǎng)絡(luò)連接發(fā)送出去的行為,無論任何時候,內(nèi)核要傳輸一個數(shù)據(jù)包,它都會調(diào)用驅(qū)動程序的hard_start_transmit函數(shù)將數(shù)據(jù)放入到外發(fā)隊列中。設(shè)備有自己的定時器,關(guān)閉設(shè)備時需要禁止該定時器繼續(xù)運行,但在這里不是調(diào)用定時器的del_timer的API接口,而是通過調(diào)用del_timer_sync這個接口來實現(xiàn)的。設(shè)備在不要使用時,或者臨時的停止使用,就應(yīng)該將其關(guān)閉掉。一旦準備好開始發(fā)送數(shù)據(jù)后,在設(shè)備打開的方法中還必須要啟動該端口的傳輸隊列,這樣來允許接口接收傳輸?shù)臄?shù)據(jù)包,內(nèi)核提供如下的函數(shù)啟動該隊列:netif_start_queue(dev)。rmi_phnx_mac_timer()內(nèi)部通過MII接口讀取PHY寄存器,來獲取當(dāng)前設(shè)備的物理鏈路中是否有載波信號,并向上層報告。 …}。Linux內(nèi)核定時器為我們提供了良好的機制供我們使用。數(shù)據(jù)緩沖區(qū)由skb_buf結(jié)構(gòu)保存。設(shè)備的打開是通過函數(shù)rmi_phnx_mac_open()接口實現(xiàn)的,設(shè)備的打開操作都是自旋鎖的保護下完成的,這主要是為了防止在同一時刻驅(qū)動程序的并發(fā)執(zhí)行。網(wǎng)絡(luò)設(shè)備的注冊由接口registre_netdevice()來完成,調(diào)用registre_netdevice() 向系統(tǒng)注冊網(wǎng)絡(luò)接口,在這個函數(shù)中將分配一個在系統(tǒng)中惟一的名稱給網(wǎng)絡(luò)接口,在驅(qū)動程序中就是將devname字段中的eth%d分別替換為eth0,eth1,eth2,eth3,并且將這些網(wǎng)絡(luò)接口設(shè)備添加到系統(tǒng)網(wǎng)絡(luò)設(shè)備的全局鏈表devbase中,注冊完成以后,系統(tǒng)知道有這個設(shè)備存在,就可以調(diào)用驅(qū)動程序來操作設(shè)備了。主要原因在于XLR處理器是一個多核的處理器,一共包含有8個CPU,而在多處理器上如何控制程序并發(fā)的執(zhí)行,是多處理器使用的技術(shù)難點。phnx_mac_devices數(shù)組中定義了四個元素,即四個端口,并且分別給出了每個端口的各個字段的初始值。 int irq。privspill_configured = 0。privid = i。自旋鎖使用上最重要的一個規(guī)則就是,自旋鎖必須盡可能的最在最短時間內(nèi)擁有。初始化自旋鎖。之前已經(jīng)描述過的ether_setup()函數(shù)為以太網(wǎng)設(shè)備設(shè)置了很多的默認值,但是這些值在設(shè)置為默認值之后,我們可以根據(jù)設(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)志中添加接口對廣播的支持才能使接口真正的具有廣播的能力。下面就將介紹開發(fā)板網(wǎng)卡驅(qū)動程序是如何初始化設(shè)備指針以及成員函數(shù)的。該芯片在注冊時系統(tǒng)提供的四個中斷號分別為2227和28。devirq = phnx_mac_devices[i].irq。alloc_netdev()中可以看出net_device和網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu)是一起分配的,要想獲得網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu)的地址,函數(shù)netdev_priv直接返回了net_device結(jié)構(gòu)末端地址,實際上也就是網(wǎng)卡私有數(shù)據(jù)結(jié)構(gòu)driver_data *priv的起始地址。dev
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1