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

正文內(nèi)容

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

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

下一頁面
 

【正文】 最關(guān)鍵的因素是獲得了自由軟件基金(FSF)的支持,他們制定了一個GNU計劃,該計劃的目標就是要編寫一個完全免費的 UNIX版本—— 包括內(nèi)核及所有相關(guān)的組件,可以讓用戶自由共享并且改寫軟件,而Linux正好符合他們的意愿。在Linux所包含的數(shù)千個文件中,有一個名為Credits的文件,里面列出了100多名對Linux有過重要貢獻的黑客,包括他們的名字、地址以及所做的工作。就象UNIX,Linux支持的網(wǎng)卡主要是以太網(wǎng)卡。網(wǎng)卡的驅(qū)動程序就是數(shù)據(jù)鏈路層與物理層的接口。Linux 網(wǎng)絡設備驅(qū)動程序是Linux 操作系統(tǒng)內(nèi)核的一個重要組成部分,對Linux網(wǎng)絡設備驅(qū)動程序的原理與設計技術(shù)的掌握,有助于理解網(wǎng)絡鏈路層的工作原理,它對從事基于Linux平臺的網(wǎng)絡產(chǎn)品開發(fā)具有十分重要的意義。在Linux中,把所有的網(wǎng)絡設備都抽象為一個接口,這個接口提供了對所有網(wǎng)絡設備的操作集合,由struct device數(shù)據(jù)結(jié)構(gòu)來表示,即網(wǎng)絡設備接口,所有的網(wǎng)絡設備接口構(gòu)成一個鏈表,該鏈表由dev_base為頭指針,鏈表中的元素代表一個網(wǎng)絡設備接口。 第2章 Linux下設備驅(qū)動程序設計的基本知識在進行Linux設備驅(qū)動程序的具體討論之前,有必要對Linux本身以及網(wǎng)卡設備等方面做一個大致的了解和認識。經(jīng)過十多年的發(fā)展,到2003年,Linux ,這在Linux發(fā)展史中具有極其重要的作用。這是用戶應用程序執(zhí)行的地方。實際上,體系結(jié)構(gòu)可能并不像圖1所示的一樣清晰。相反,Linux是具有創(chuàng)新意義的Unix類操作系統(tǒng)。從信息隱藏的觀點看,它沒有任何程度的隱藏,每個過程都對其它過程都是可見的??梢哉fLinux在追求效率和調(diào)度方式上也是優(yōu)勢明顯。Linux中有許多標準的內(nèi)核線程,其中有一些周期地運行來完成特定的任務(如swapd),而其余一些則連續(xù)地運行,等待處理某些特定的事件(如inetd和lpd)。Linux內(nèi)核另一個獨具特色的部分是虛擬文件系統(tǒng)(VFS)。增加系統(tǒng)調(diào)用以滿足開發(fā)者的特殊需求。它們是截然不同的黑盒子,使某個特定硬件響應一個定義好的內(nèi)部編程接口,這些接口隱藏了設備工作的細節(jié)。這種模塊化的的特點使得Linux驅(qū)動程序的編寫非常的簡單,因此內(nèi)核驅(qū)動程序的數(shù)目也增長及其迅速,目前已經(jīng)有成百上千的驅(qū)動程序可以在linux下被使用。device)和網(wǎng)絡設備(net字符設備可以通過文件系統(tǒng)節(jié)點來訪問,比如/dev/tty1和/dev/loop0等。塊設備:如同字符設備,塊設備也是通過位于/dev目錄下的文件系統(tǒng)節(jié)點來存取。網(wǎng)絡接口:任何網(wǎng)絡事件都是通過一個網(wǎng)絡接口形成的,一個網(wǎng)絡接口就是一個能夠和其他主機交換數(shù)據(jù)的設備。網(wǎng)絡驅(qū)動程序不需要知道各個連接的相關(guān)信息,它只要處理數(shù)據(jù)包即可。 編寫網(wǎng)絡驅(qū)動程序的一些基本概念無論是什么操作系統(tǒng)的驅(qū)動程序,都有一些通用的概念。發(fā)送和接收:這是一個網(wǎng)絡設備最基本的功能。中斷:中斷在現(xiàn)代計算機結(jié)構(gòu)中占有重要的地位。Linux支持中斷的共享,即多個設備共享一個中斷。第3章 Linux網(wǎng)卡驅(qū)動程序設計的理論探討網(wǎng)絡接口是第三類標準Linux設備,網(wǎng)絡設備使用特定的內(nèi)核數(shù)據(jù)結(jié)構(gòu)注冊自身,以備與外界進行數(shù)據(jù)交換時調(diào)用。 網(wǎng)卡驅(qū)動程序設計要用到的數(shù)據(jù)結(jié)構(gòu)net_device[1]結(jié)構(gòu)處于網(wǎng)絡驅(qū)動層的非常核心的位置并且值得完全的描述。unsigned long state;設備狀態(tài)。驅(qū)動程序不應該修改這個成員。(2).硬件信息下面的成員包含了相對簡單設備的低層硬件信息。如果設備有不同的接收和發(fā)送內(nèi)存,mem成員由發(fā)送內(nèi)存使用,rmem成員由接收內(nèi)存使用。這個成員由驅(qū)動在設備探測時賦值。unsigned char irq;被賦予的中斷號。例如,如果這個設備同時支持同軸電纜(IF_PORT_10BASE2)和雙絞線(IF_PORT_100BSAET)以太網(wǎng)連接,就可以使用該變量。 除了用于顯示信息(ifconfig命令)之外,它不在設備驅(qū)動自身以外使用。deviers/net/ 輸出了一些類似的函數(shù),包括下列:void ltalk_setup(struct net_device *dev);設置一個 LocalTalk 設備的函數(shù)。void tr_setup(struct net_device *dev);處理令牌環(huán)網(wǎng)絡接口的設置。對于以太網(wǎng)接口hard_header_len的值是14(ETH_HLEN)。unsigned long tx_queue_len;設備發(fā)送隊列中可以排隊的最大幀數(shù)。這個type成員由ARP用來決定接口支持什么樣的硬件地址。以太網(wǎng)地址長度是6個字節(jié)(即接口板卡的硬件ID),廣播地址由6個0xff字節(jié)組成。某些標志由內(nèi)核管理,而其他一些則由接口在初始化期間設置,用來聲明接口的各種能力及其他特性。有些操作可以留作NULL,其他的一些則無需修改, 因為ether_setup給它們賦予了正確的方法。在ifconfig[8,9]激活接口時,接口將被打開。在該函數(shù)中執(zhí)行的操作與打開時執(zhí)行的操作是相反的。該函數(shù)的任務是將作為參數(shù)傳入的信息組織成一個合適的特定于設備的硬件頭。void (*tx_timeout)(struct net_device *dev);如果數(shù)據(jù)包的傳輸在合理的時間段內(nèi)失敗了,則假定中斷或接口被鎖住,這時,網(wǎng)絡代碼將調(diào)用該方法,它負責解決問題并重新開始數(shù)據(jù)包的傳輸。設備的 I/O 地址和中斷號可以通過運行set_config來改變。 套接字緩沖區(qū)介紹套接字緩沖區(qū)這個結(jié)構(gòu)處于 Linux 內(nèi)核網(wǎng)絡子系統(tǒng)的核心,Linux內(nèi)核中網(wǎng)絡數(shù)據(jù)包的傳輸和接收都是通過套接字緩沖區(qū)實現(xiàn)的。union { /*… */ } h;union { /* …*/ } nh;union { /*…*/} mac;指向報文中包含的各級的頭的指針。unsigned char *head;unsigned char *data;unsigned char *tail;unsigned char *end;指向數(shù)據(jù)包中數(shù)據(jù)的指針。unsigned char ip_summed;對報文的校驗策略。以太網(wǎng)驅(qū)動不顯式修改 pkt_type,因為eth_type_trans會完成這個工作。struct sk_buff *alloc_skb(unsigned int len, int priority);struct sk_buff *dev_alloc_skb(unsigned int len);分配一個緩存區(qū)。kfree_skb調(diào)用由內(nèi)核在內(nèi)部使用。unsigned char *skb_push(struct sk_buff *skb, int len);unsigned char *__skb_push(struct sk_buff *skb, int len);遞減skbdata和遞增skblen的函數(shù)。如果驅(qū)動程序釋放了多于它能持有的數(shù)據(jù)到緩存中,則系統(tǒng)會出現(xiàn)panic來標識出這個錯誤。這個函數(shù)可用來在填充數(shù)據(jù)前保留報文頭部空間(headroom)。int skb_is_nonlinear(struct sk_buff *skb);如果這個skb分離為多個片為發(fā)散/匯聚 I/O,則該函數(shù)返回一個真值。 驅(qū)動模塊的加載和卸載在構(gòu)造好驅(qū)動模塊之后,需要將其裝入到內(nèi)核,或者在裝入到內(nèi)后以后在某個時刻又需要將其卸載。根據(jù)這兩種方式的特點,本工程在調(diào)試過程中采用模塊加載,方便調(diào)試,省去了反復編譯內(nèi)核的麻煩,調(diào)試成功后將其編譯進內(nèi)核,以獲得更高的運行效率。在需要卸載模塊時,先關(guān)閉設備,再通過執(zhí)行模塊卸載命令rmmod來調(diào)用驅(qū)動cleanup_moduIe()函數(shù)卸載該模塊。XLR處理器這是一款專用的多核多線程網(wǎng)絡處理器,被廣泛的應用于網(wǎng)絡安全、網(wǎng)絡服務等領(lǐng)域。經(jīng)過篩選和對比最終選擇了三星2410 ARM開發(fā)板,接下來將介紹三星2410 ARM開發(fā)板。 需求分析以及MII接口,但是越升級寫的越混亂,其中的利弊更加明顯;,資源的定義進行了分類,可讀性很好,條理清楚,修改起來容易;,大量使用C的struct實現(xiàn)了C++的面向?qū)ο箫L格,看起來很舒服;;在同樣的目標板上,相差幾十mA。它包括一個數(shù)據(jù)接口,以及一個MAC和PHY之間的管理接口。管理接口是個雙信號接口:一個是時鐘信號,另一個是數(shù)據(jù)信號。在不對MAC硬件重新設計或替換的情況下,任何類型的PHY設備都可以正常工作。以太網(wǎng)媒體接口有:MII,RMII,SMII,GMII,所有的這些接口都從MII而來,MII是(Medium Independent Interface)的意思,是指不用考慮媒體是銅軸、光纖、電纜等,因為這些媒體處理的相關(guān)工作都有PHY或者叫做MAC的芯片完成。因為擴展的寄存器中,有很多寄存器都是影子寄存器,如24號寄存器(輔助控制寄存器)。值得注意的是:23號寄存器中的所有比特在擴展寄存器被訪問以后或者沒有被訪問時必須清零,否則可能發(fā)生意想不到的錯誤。在設備驅(qū)動功能層實現(xiàn)設備的驅(qū)動程序,負責處理數(shù)據(jù)的接收和發(fā)送,主要的任務是將要發(fā)送的數(shù)據(jù)傳遞給物理媒介,將接收的數(shù)據(jù)傳遞給上層網(wǎng)絡協(xié)議接口。采用這種構(gòu)成模式的有很多優(yōu)點:首先,模塊化的實現(xiàn)方式易于功能的分割以及程序的調(diào)試;其次,在完成初期工作后,方便設備驅(qū)動的功能擴展,為后期開發(fā)減少工作;另外,由于第一次做關(guān)于網(wǎng)絡驅(qū)動的開發(fā),經(jīng)驗不足,設計成這種簡單的模式,有利于我更好的理解網(wǎng)絡設備的工作模式和網(wǎng)絡設備驅(qū)動程序的開發(fā)方法。驅(qū)動模塊的加載由內(nèi)核定義的特殊宏module_init()來實現(xiàn),module_init()的參數(shù)為rmi_phnx_mac_init_module。網(wǎng)卡設備要能正常使用,就必須在設備準備就緒以后,完成對設備的初始化,并為設備分配系統(tǒng)資源,操作成功以后向系統(tǒng)內(nèi)核注冊該網(wǎng)絡設備,這樣一個網(wǎng)絡設備就能被正常使用了。例如,鏈路狀態(tài)、物理地址、以及端口速率和雙工通信能力等信息。由于芯片內(nèi)有四路接口,因此需要循環(huán)初始化過程四次,以便完成對所有接口的初始化。通過分析alloc_etherdev()函數(shù)我們知道,alloc_etherdev()函數(shù)其實沒有做什么事,只是簡單的調(diào)用了alloc_netdev()函數(shù)。mmio_start =phoenix_io_base + phnx_mac_devices[i].phnx_io_offset;privmmio = (phoenix_reg_t *) mmio_start;訪問該I/O內(nèi)存不是通過頁表訪問來實現(xiàn)的,而是直接訪問的,主要有利于提高數(shù)據(jù)傳輸?shù)男?。在大多?shù)情況來講,一個驅(qū)動程序只需要為它自己設備的中斷注冊一個中斷處理例程,并且在中斷到達時進行正確的處理。 設備成員及函數(shù)的初始化完成了設備對資源的申請,就應該對設備進行初始化或者賦值了。設備結(jié)構(gòu)體值的初始化主要是針對了以太網(wǎng)特征,包括了設備類型、頭部長度、最大傳輸單元、物理地址長度、傳輸隊列容量以及接口標志。這些值在設置以后,可以在我們自己的驅(qū)動程序中,根據(jù)需要重新定義或者賦值。設備要完成數(shù)據(jù)的接收和發(fā)送,僅僅依靠以太網(wǎng)默認的回調(diào)函數(shù)還不能完成的,驅(qū)動程序還必須要有自己的回調(diào)函數(shù),以此充分利用設備性能,提高設備工作的效率。devget_stats = rmi_phnx_mac_get_stats。devchange_mtu = rmi_phnx_mac_change_mtu。dev_watchdog_timeo是網(wǎng)絡層在確定了數(shù)據(jù)傳輸已經(jīng)超時,并且調(diào)用驅(qū)動程序的數(shù)據(jù)傳輸超時處理函數(shù)之前的最小時間,在驅(qū)動程序中該函數(shù)就是上面注冊的rmi_phnx_mac_tx_timeout()函數(shù),這里被設置為1000*HZ。privlock)。在正確使用的情況下,自旋鎖通??梢蕴峁┍刃盘柫扛叩男阅堋T诔绦蛑?,在自旋鎖狀態(tài)下執(zhí)行的代碼都非常的簡短,一般都只有幾行,這樣就是為了減少擁有自旋鎖的時間,提高整個系統(tǒng)的性能。privphy_addr = gmac_id_to_phy_addr(privinstance)。 int type。各個字段分別表示端口的物理地址、端口類型、中斷號、以及I/O偏移量。驅(qū)動程序的私有數(shù)據(jù)結(jié)構(gòu)中,有一個比較陌生的成員privspill_configured,這個字段在大多數(shù)的網(wǎng)絡設備驅(qū)動程序中不能看到的。 設備注冊、打開、關(guān)閉網(wǎng)絡設備完成初始化以后,系統(tǒng)還無法使用該設備,因為此時設備還沒有向系統(tǒng)申明自己的存在,也即是向系統(tǒng)內(nèi)核注冊網(wǎng)絡設備。但是在接口能傳遞數(shù)據(jù)包之前,內(nèi)核必須打開接口并賦予接口地址,在接口改變地址、I/O地址、irq等時必須先關(guān)閉設備。網(wǎng)絡設備的任務就是完成數(shù)據(jù)包的接收和發(fā)送,在設備開始工作之前,我們必須要向系統(tǒng)申請緩沖區(qū),來保存數(shù)據(jù)包,值得注意的是,我們并不需要為待發(fā)送的數(shù)據(jù)申請緩沖區(qū)。但在什么時候去檢測鏈路的這些變化,就需要一個定時器來確定。 unsigned long data。內(nèi)核定時器初始化,并且添加到內(nèi)核的一個合適的定時器鏈表中,內(nèi)核就會在定時器時間到達時調(diào)用定時器的回調(diào)函數(shù),在驅(qū)動程序中,定時器執(zhí)行的回調(diào)函數(shù)是rmi_phnx_mac_timer。端口配置完畢,要使端口可以正常的工作,我們必須使能端口,即讓端口可以接收或者發(fā)送數(shù)據(jù),并將將這一關(guān)鍵設置的值寫入到寄存器,讓內(nèi)核知道該端口可以正常工作了。如果沒有解除自旋鎖,系統(tǒng)將出現(xiàn)”panic”甚至崩潰。設備要關(guān)閉,首先讓端口不可用,即進行使能的逆操作,使端口不能進行數(shù)據(jù)的發(fā)送和接收。設備關(guān)閉后不應該再有數(shù)據(jù)傳輸?shù)墓δ?,所以關(guān)閉設備時還要停止端口的傳輸隊列,這一操作調(diào)用的是netif_start_queue(dev)的逆操作函數(shù)netif_stop_queue(dev)來實現(xiàn)的,通過它來標記設備不能傳輸數(shù)據(jù)包了。傳遞給rmi_phnx_mac_xmit的套接字緩沖區(qū)包含了物理數(shù)據(jù)包,并且擁有完整的的傳輸層數(shù)據(jù)包頭,接口不需要修改待傳輸?shù)臄?shù)據(jù),skbdata指向的就是要傳輸?shù)?
點擊復制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1