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

正文內(nèi)容

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

2025-01-19 13:04本頁面
  

【正文】 在數(shù)據(jù)的傳輸過程中,CPU是不能被搶占的,因此在驅(qū)動程序開始傳輸數(shù)據(jù)之前,還必須要禁止CPU的搶占,在。驅(qū)動程序盡量保證了數(shù)據(jù)傳輸?shù)恼_M行,而且完畢后正確釋放了skb,如果傳輸失敗,內(nèi)核將會重新試著再傳輸,在這種情況下,驅(qū)動程序沒有繼續(xù)進行數(shù)據(jù)的傳輸而是停止了該隊列,等待傳輸失敗原因解決后再進行傳輸。在設(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ù)的接受和發(fā)送發(fā)送指的是將數(shù)據(jù)包通過網(wǎng)絡(luò)連接發(fā)送出去的行為,無論任何時候,內(nèi)核要傳輸一個數(shù)據(jù)包,它都會調(diào)用驅(qū)動程序的hard_start_transmit函數(shù)將數(shù)據(jù)放入到外發(fā)隊列中。del_timer_sync可用于在SMP系統(tǒng)上避免競態(tài),這和單處理器內(nèi)核中的del_timer是一樣的。設(shè)備有自己的定時器,關(guān)閉設(shè)備時需要禁止該定時器繼續(xù)運行,但在這里不是調(diào)用定時器的del_timer的API接口,而是通過調(diào)用del_timer_sync這個接口來實現(xiàn)的。設(shè)備的關(guān)閉操作仍然需要在自旋鎖的保護下完成,否則可能發(fā)生資源的爭奪,導(dǎo)致系統(tǒng)錯誤。設(shè)備在不要使用時,或者臨時的停止使用,就應(yīng)該將其關(guān)閉掉。在設(shè)備驅(qū)動程序中,自旋鎖狀態(tài)下完成的任務(wù)已經(jīng)超出了自旋鎖提倡的盡可能執(zhí)行較少操作的這一建議。一旦準(zhǔn)備好開始發(fā)送數(shù)據(jù)后,在設(shè)備打開的方法中還必須要啟動該端口的傳輸隊列,這樣來允許接口接收傳輸?shù)臄?shù)據(jù)包,內(nèi)核提供如下的函數(shù)啟動該隊列:netif_start_queue(dev)。設(shè)備的端口基本配置,到這里就已經(jīng)全部結(jié)束了,但是我們還是可以在使用設(shè)備端口之前,重新按照我們的需要進行端口的速率、雙工能力以及流量進行等進行配置。rmi_phnx_mac_timer()內(nèi)部通過MII接口讀取PHY寄存器,來獲取當(dāng)前設(shè)備的物理鏈路中是否有載波信號,并向上層報告。void add_timer(struct timer_list *timer)。 …}。 void (*function)(unsigned long)。Linux內(nèi)核定時器為我們提供了良好的機制供我們使用。網(wǎng)絡(luò)設(shè)備要進行數(shù)據(jù)的發(fā)送,就要檢測鏈路的連接狀況,如是否連接、斷開或者被改變。數(shù)據(jù)緩沖區(qū)由skb_buf結(jié)構(gòu)保存。設(shè)備的打開,意味著該設(shè)備將可以正常工作了。設(shè)備的打開是通過函數(shù)rmi_phnx_mac_open()接口實現(xiàn)的,設(shè)備的打開操作都是自旋鎖的保護下完成的,這主要是為了防止在同一時刻驅(qū)動程序的并發(fā)執(zhí)行。驅(qū)動程序被編譯進內(nèi)核,在內(nèi)核引導(dǎo)階段完成對網(wǎng)絡(luò)接口的探測。網(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è)備了。通過privspill_configured這個字段就實現(xiàn)了在多處理器上程序并發(fā)執(zhí)行時的同步控制。主要原因在于XLR處理器是一個多核的處理器,一共包含有8個CPU,而在多處理器上如何控制程序并發(fā)的執(zhí)行,是多處理器使用的技術(shù)難點。端口類型type都設(shè)置為了TYPE_GMAC,表示千兆的通信能力,而實際上芯片還具有TYPE_XGMAC的通信能力,它是TYPE_GMAC的十倍通信能力,不過在此次開發(fā)中并未使用TYPE_XGMAC,因為對于開發(fā)來說,這意味著具有更大的挑戰(zhàn)性和難度,而且在實際的主設(shè)備中,暫時還不需要TYPE_XGMAC這么大的通信能力,因此,只是需要針對TYPE_GMAC做開發(fā)就可以了。phnx_mac_devices數(shù)組中定義了四個元素,即四個端口,并且分別給出了每個端口的各個字段的初始值。}。 int irq。這里我們看到有一個數(shù)組phnx_mac_devices,它的類型是struct phnx_mac,結(jié)構(gòu)體struct phnx_mac的詳細(xì)含義如下:phnx_mac { int instance。privspill_configured = 0。privtype = phnx_mac_devices[i].type。privid = i。長的鎖擁有時間將阻止對當(dāng)前處理器的調(diào)度,這意味著更高優(yōu)先級的進程,也即是系統(tǒng)真正應(yīng)該獲得CPU的進程不得不等待。自旋鎖使用上最重要的一個規(guī)則就是,自旋鎖必須盡可能的最在最短時間內(nèi)擁有。采用的自旋鎖的主要原因是,自旋鎖可以在不能休眠的代碼中使用,比如中斷處理例程,這正是網(wǎng)絡(luò)設(shè)備所具有的特點。初始化自旋鎖。spin_lock_init(amp。之前已經(jīng)描述過的ether_setup()函數(shù)為以太網(wǎng)設(shè)備設(shè)置了很多的默認(rèn)值,但是這些值在設(shè)置為默認(rèn)值之后,我們可以根據(jù)設(shè)備的實際數(shù)據(jù)處理能力修改這些設(shè)置。網(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)負(fù)責(zé)調(diào)用。devwatchdog_timeo = (1000 * HZ)。devtx_timeout = rmi_phnx_mac_tx_timeout。devset_multicast_list = rmi_phnx_mac_set_multicast_list。devstop = rmi_phnx_mac_close。devopen = rmi_phnx_mac_open。 指定設(shè)備的I/O內(nèi)存的開始和結(jié)束位置,這樣將端口映射到內(nèi)存,供CPU直接訪問。devbase_addr = mmio_start。以上這些值的設(shè)置知識設(shè)備默認(rèn)的,也是以太網(wǎng)對接入以太網(wǎng)的設(shè)備的基本能力的要求。最后設(shè)置了設(shè)備的廣播地址,廣播地址設(shè)置后需要在接口標(biāo)志中添加接口對廣播的支持才能使接口真正的具有廣播的能力。其實這個初始化操作比較的簡單,沒有我們想象的那么復(fù)雜,函數(shù)指針的初始化主要集中在了對最大傳輸單元改變的控制函數(shù),以及對物理地址進行分析、處理、更新、解析等等。下面就將介紹開發(fā)板網(wǎng)卡驅(qū)動程序是如何初始化設(shè)備指針以及成員函數(shù)的。實現(xiàn)該通道申請的函數(shù)是request_irq(…),參數(shù)rmi_phnx_mac_int_handler是自己定義的中斷處理函數(shù)指針。該芯片在注冊時系統(tǒng)提供的四個中斷號分別為2227和28。一個“中斷”僅僅是一個信號,當(dāng)硬件需要獲得處理器對它的關(guān)注時,就可以發(fā)送這個信號。devirq = phnx_mac_devices[i].irq。網(wǎng)卡最終是要用來接收和發(fā)送數(shù)據(jù)的,要接收或者發(fā)送以太網(wǎng)數(shù)據(jù)包就必須具有自己的內(nèi)存空間,即I/O內(nèi)存。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的起始地址。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è)備指針指向自己。dev = alloc_etherdev(sizeof(struct driver_data));向系統(tǒng)申請內(nèi)存并且初始化一個以太網(wǎng)設(shè)備,并且使用eth%d的形式指定分配給網(wǎng)絡(luò)設(shè)備的名字,同時用以太網(wǎng)的默認(rèn)值初始化net_device中的大部分成員。定義了設(shè)備指針以后,便開始實現(xiàn)設(shè)備的初始化。相對于一般網(wǎng)卡設(shè)備的私有數(shù)據(jù)區(qū)不同的是,在私有數(shù)據(jù)區(qū)內(nèi)還專門設(shè)置了一個標(biāo)志(instance)來表示該私有數(shù)據(jù)區(qū)是屬于哪個端口的。struct driver_data是網(wǎng)卡驅(qū)動程序的私有數(shù)據(jù)的結(jié)構(gòu)體,和其它網(wǎng)卡設(shè)備結(jié)構(gòu)體一樣,該結(jié)構(gòu)體保存了和設(shè)備有關(guān)的信息。函數(shù)rmi_phnx_mac_init_module是驅(qū)動程序模塊的入口點,也是設(shè)備的初始化函數(shù),在這里完成了設(shè)備的初始化,并在最后完成初始化之后向系統(tǒng)注冊了該網(wǎng)卡設(shè)備。內(nèi)核調(diào)用網(wǎng)卡驅(qū)動模塊的初始化函數(shù)rmi_phnx_mac_init_module(void),如果成功將把網(wǎng)卡驅(qū)動的模塊安裝到系統(tǒng)中,并把模塊的狀態(tài)設(shè)置成為RUNNING[15]。rmi_phnx_mac_init_module(void)是驅(qū)動程序的初始化入口點,宏module_init()最終展開為init_module(),并將rmi_phnx_mac_init_module傳遞給內(nèi)核。 模塊的加載及設(shè)備初始化驅(qū)動程序在linux系統(tǒng)內(nèi)核里被編譯成模塊,并在系統(tǒng)啟動的時候加載到系統(tǒng)里面。當(dāng)然,在實現(xiàn)的過程中,驅(qū)動程序遠(yuǎn)遠(yuǎn)不止這么簡單,還有很多的模塊沒有在圖52中列舉出來,如在多CPU上的同步控制、定時器的維護、數(shù)據(jù)傳輸超時處理、最大傳輸單元的控制、MII接口的使用等多方面的問題,但這些都依附在圖52中所示的主模塊之上的。通過分析和參照其它網(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)成。圖51 Linux網(wǎng)絡(luò)驅(qū)動程序體系結(jié)構(gòu)圖在此次開發(fā)中,就是在設(shè)備驅(qū)動功能層上完成開發(fā)板的驅(qū)動程序,實現(xiàn)數(shù)據(jù)的接收和發(fā)送。在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è)備接口。第5章 網(wǎng)卡驅(qū)動的具體實現(xiàn) 驅(qū)動程序的設(shè)計Linux網(wǎng)絡(luò)驅(qū)動程序的體系結(jié)構(gòu)如下圖51所示,分為四層,從上到下分別為協(xié)議接口層、網(wǎng)絡(luò)設(shè)備接口層、設(shè)備驅(qū)動功能層、網(wǎng)絡(luò)設(shè)備以及網(wǎng)絡(luò)媒介層。例如對擴展寄存器中的0號寄存器即接收/傳輸包的計數(shù)寄存器的訪問方式是:把23號寄存器的第8到11比特全部設(shè)置為1,激活擴展寄存器;把23號寄存器的第0到7比特共8個比特設(shè)置0,表示對0號擴展寄存器的訪問;讀或者寫21號寄存器,這時21號寄存器存放的值實際上就是0號擴展寄存器的值。影子寄存器不能直接訪問,必須通過其他寄存器間接的去訪問。標(biāo)準(zhǔn)寄存器都可以通過MII接口直接訪問,但是擴展的寄存器中,大部分是不能直接訪問的。MII支持10兆和100兆的操作,一個接口由14根線組成,它的支持還是比較靈活的,但是有一個缺點是因為它一個端口用的信號線太多,如果一個8端口的交換機要用到112根線,16端口就要用到224根線,到32端口的話就要用到448根線,一般按照這個接口做交換機,是不太現(xiàn)實的,所以現(xiàn)代的交換機的制作都會用到其它的一些從MII簡化出來的標(biāo)準(zhǔn),比如RMII、SMII、MII等。網(wǎng)絡(luò)控制器可以用同樣的硬件接口與任何PHY進行連接。在其他速率下工作的與 MII等效的接口有:AUI(10M以太網(wǎng))、GMII(Gigabit以太網(wǎng))和XAUI(10Gigabit以太網(wǎng))。MII標(biāo)準(zhǔn)接口用于連接Fast Ethernet MACblock與PHY。通過管理接口,上層能監(jiān)視和控制PHY。MII數(shù)據(jù)接口總共需要16個信號。數(shù)據(jù)接口包括分別用于發(fā)送器和接收器的兩條獨立信道。MII(Media Independent Interface介質(zhì)無關(guān)接口)[13],或稱為媒體獨立接口。 ,主要的原因是三星的sdmk開發(fā)板使用的這個內(nèi)核,相對來說這個內(nèi)核的驅(qū)動程序比較全。此外還包括:2個串口輸出,一個MIC輸入接口,一個LINE音頻輸入接口,一個耳機輸出接口,2個CPU可控LED,AD轉(zhuǎn)換輸入接口,SPI和IIC接口,JTAG調(diào)試接口,CPLD編程接口,擴展GPRS和CDMA專用接口(,SPI口,IO引腳,電源等)。 S3C2410 ARM 開發(fā)板介紹CPU:采用SAMSUNG S3C2410 ARM920t CPU,集成有串口,SD卡控制器,USB Host和USB device控制器,LCD控制器,Nand Flash控制器等。網(wǎng)卡設(shè)備的性能、數(shù)據(jù)處理能力對設(shè)備的性能起著至關(guān)重要的作用,也是該設(shè)備最終能否成功達到預(yù)期目標(biāo)的關(guān)鍵因素。在此次開發(fā)中,XLR處理器作為DDOS系統(tǒng)的底層硬件,這為系統(tǒng)的高效性提供了切實可行的保障。第4章 系統(tǒng)分析在一個以XLR處理器為核心處理器的嵌入式開發(fā)板中,開發(fā)一個DDOS系統(tǒng),應(yīng)用于商業(yè)、政府、軍隊等行業(yè),保障網(wǎng)絡(luò)的安全運行。Rmmod工具完成模塊從內(nèi)核中的模塊移除任務(wù)。初始化結(jié)束后,就可以打開設(shè)備進行數(shù)據(jù)包的發(fā)送和接收。模塊加載設(shè)計步驟如圖31:Insmod命令I(lǐng)nit module()初始化Register_retdev()注冊Init指針初始化函數(shù)Rmmod命令關(guān)閉網(wǎng)卡設(shè)備數(shù)據(jù)包發(fā)送和接收打開網(wǎng)卡設(shè)備圖31 模塊加載步驟圖通過模塊加載命令insmod把網(wǎng)絡(luò)設(shè)備驅(qū)動程序插入到內(nèi)核之中,入口函數(shù)init_module()通過調(diào)用register_netdev0函數(shù)在Linux系統(tǒng)中注冊該網(wǎng)絡(luò)設(shè)備。在嵌入式設(shè)備中,硬件一般只是完成比較特定、專一的功能,一般選擇將驅(qū)動程序靜態(tài)編譯進內(nèi)核,這樣可以獲得更高的效
點擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1