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

正文內(nèi)容

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

2025-01-22 13:04本頁面
  

【正文】 率。Linux驅(qū)動程序的加載有兩種方式:一種是編譯成模塊以供動態(tài)加載,使用insmod或者rmmod加載或卸載設備驅(qū)動程;另一種是靜態(tài)編譯進內(nèi)核。由于使用了原子性的kmap,因此不能一次映射多個片段。int skb_headlen(struct sk_buff *skb);返回skb的第一個片的長度(該部分指向skbdata)。它遞減skblen和遞增skbdata;這是從傳入的數(shù)據(jù)包的頭部剝離硬件頭所使用的方法。大部分以太網(wǎng)接口在數(shù)據(jù)包之前保留2個字節(jié),這樣IP頭可在14字節(jié)的以太網(wǎng)頭之后,在16字節(jié)邊界上對齊。void skb_reserve(struct sk_buff *skb, int len);這個函數(shù)遞增data和tail。int skb_headroom(struct sk_buff *skb);。int skb_tailroom(struct sk_buff *skb);該函數(shù)返回緩沖區(qū)中可用空間的大小。除了數(shù)據(jù)是添加到報文的開始而不是結尾以外,它們的功能與skb_put相似。unsigned char *skb_put(struct sk_buff *skb, int len);unsigned char *__skb_put(struct sk_buff *skb, int len);更新sk_buff構中的tail和len成員;可用這些函數(shù)在緩沖區(qū)尾部添加數(shù)據(jù)。一個驅(qū)動應當使用一種dev_kfree_skb形式的函數(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ū)。alloc_skb函數(shù)分配一個緩存并且將skbdata和skbtail 都初始化成skbhead。下面是最常用的幾個函數(shù)。shinfo(struct sk_buff *skb);unsigned int shinfo(skb)nr_frags;skb_frag_t shinfo(skb)frags;處于對性能方面的考慮,skb中的一些信息分散存儲在內(nèi)中與其緊鄰的其他結構中。驅(qū)動程序負責將其設置為PACKET_HOST (數(shù)據(jù)包是給我的),PACKET_OTHERHOST,PACKET_BROADCAST,或者PACKET_MULTICAST。該成員由驅(qū)動程序?qū)魅霐?shù)據(jù)包進行設置。unsigned int len;unsigned int data_len;len是報文中全部數(shù)據(jù)的長度,data_len是報文存儲于單個片中的數(shù)據(jù)片段的長度,如果使用sctter/gather I/O,data_len 成員的值為0。head 指向分配內(nèi)存的開頭,data是有效字節(jié)的開始(并且常常稍微比head大一些),tail是有效字節(jié)的結尾,end指向tail能夠到達的最大地址。網(wǎng)絡驅(qū)動程序要負責設置傳入數(shù)據(jù)包的mac指針,這個任務正常是由 eth_type_trans 處理,但是非以太網(wǎng)驅(qū)動不得直接設置skb。union中的每個成員都是一個不同數(shù)據(jù)結構類型的指針。struct net_device *dev;接收或發(fā)送該緩沖區(qū)的設備。在linux/中, 能看到該結構和函數(shù)原型。通過這些可選的方法,實現(xiàn)禁止中斷、輪詢模式操作接口、執(zhí)行接口特有的ioctl命令、改變硬件地址、改變接口的MTU、以及hhcache的查詢更新等功能。在探測不到接口時,系統(tǒng)管理員可使用該函數(shù)。int (*set_config)(struct net_device *dev, struct ifmap *map);在改變接口配置時,這個方法是配置驅(qū)動的入口點。struct net_device_stats *(*get_stats)(struct net_device *dev);任何時候當一個應用程序需要獲取接口的統(tǒng)計信息,則調(diào)用這個方法。在以太網(wǎng)設備使用的缺省的函數(shù)中通過使用ARP協(xié)議來填充數(shù)據(jù)包缺少的硬件地址信息。eth_header是以太網(wǎng)類型接口的默認函數(shù), ether_setup將該成員賦值成eth_header。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)用。int (*hard_start_xmit) (struct sk_buff *skb, struct net_device *dev);該方法初始化數(shù)據(jù)包的傳輸。當接口終止時當它應該被關閉。open方法應該注冊設備需要的所有系統(tǒng)資源(I/O口、IRQ、DMA等等),打開硬件,并對設備執(zhí)行其他所需的設置。下面的是基本方法:int (*open)(struct net_device *dev);打開接口。網(wǎng)絡接口的設備方法可分為兩個類型:基本的和可選的。在這里討論一下能夠?qū)W(wǎng)絡接口進行的操作。有效的標志定義在linux/中。unsigned short flags;int features;這個flags 成員是一個位掩碼。ether_setup會對上述值進行正確地設置。unsigned char addr_len;unsigned char broadcast[MAX_ADDR_LEN];unsigned char dev_addr[MAX_ADDR_LEN];硬件(MAC)地址長度和設備硬件地址。對以太網(wǎng)接口正確的值是ARPHRD_ETHER,這是由ether_setup設置的值。unsigned short type;接口的硬件類型.。這個值由ether_setup設置為100,但是可以改它。以太網(wǎng)的MTU是1500octet (ETH_DATA_LEN)。unsigned mtu;最大傳輸單元(MTU)[5]。硬件頭部長度,即數(shù)據(jù)包中位于IP頭、或者其他協(xié)議信息之前的octet數(shù)目。大部分設備都歸于這些類別中的一類。void hippi_setup(struct net_device *dev);初始化高性能并行接口(HIPPI)的高速互連驅(qū)動的成員。void fc_setup(struct net_device *dev);初始化光通道設備。一些非以太網(wǎng)接口可以使用類似ether_setup的輔助函數(shù)。c).接口信息有關接口的大部分信息由ether_setup函數(shù)正確設置,或者任何其他對給定硬件類型適合的設置函數(shù)。這個成員只對某些外設總線有意義,例如 ISA。完整的已知端口類型設置定義在linux/。unsigned char if_port;指定在多端口設備中使用哪個端口。當接口被列出時,ifconfig命令打印出devirq的值。這個成員和內(nèi)存成員一樣,內(nèi)核不使用它們。 Ifconfig命令可用來顯示或修改當前值。unsigned long base_addr;網(wǎng)絡接口的I/O基地址。rmem成員在驅(qū)動之外從不被引用。這些成員保存了設備使用的共享內(nèi)存的開始地址和結束地址。它們是早期 Linux 網(wǎng)絡特點的延續(xù),大部分現(xiàn)代驅(qū)動程序仍然使用它們。大部分現(xiàn)代的網(wǎng)絡驅(qū)動程序不再使用這個函數(shù)了,相反,它們是在注冊接口前完成初始化工作的。int (*init)(struct net_device *dev);初始化函數(shù)。struct net_device *next;指向全局列表中下一個設備的指針。這個成員包括若干個標志。如果名稱由驅(qū)動程序設置,會包含一個%d格式串, register_netdev 將用一個數(shù)字來替換它,使它成為一個唯一的名子,分配的編號從0開始。 它也是我們了解一個網(wǎng)卡設備的最好入口點。 Linux下網(wǎng)卡驅(qū)動程序設計的數(shù)據(jù)結構和基本方法網(wǎng)絡驅(qū)動程序能夠完成數(shù)據(jù)的接收和傳輸,依靠的是網(wǎng)絡驅(qū)動程序的數(shù)據(jù)結構以及其對該數(shù)據(jù)結構進行操作的設備方法。網(wǎng)絡驅(qū)動程序異步地接收來自外部世界的數(shù)據(jù)包,并且向內(nèi)核請求把外部獲得的數(shù)據(jù)包發(fā)送給內(nèi)核。在網(wǎng)絡驅(qū)動程序中,如果硬件沒有中斷功能,定時器可以提供輪詢(poll)方式對硬件進行存取,或者是實現(xiàn)某些協(xié)議時需要的超時重傳等。時鐘:在實現(xiàn)驅(qū)動程序時,很多地方會用到時鐘。一般是把一個中斷處理程序注冊到系統(tǒng)中去,操作系統(tǒng)在硬件中斷發(fā)生后調(diào)用驅(qū)動程序的處理程序。操作系統(tǒng)必須提供驅(qū)動程序響應中斷的能力。這里,操作系統(tǒng)必須要提供兩個機制,一個是找到驅(qū)動程序的發(fā)送函數(shù),一個是驅(qū)動程序把收到的數(shù)據(jù)送給系統(tǒng)。一塊網(wǎng)卡所做的工作無非就是數(shù)據(jù)的發(fā)送和接收,所以在驅(qū)動程序中必須要告訴系統(tǒng)數(shù)據(jù)的發(fā)送函數(shù)在哪里,系統(tǒng)在有數(shù)據(jù)要發(fā)送時就會調(diào)用發(fā)送程序。操作系統(tǒng)提供給驅(qū)動程序的支持也大致相同。內(nèi)核和網(wǎng)絡設備驅(qū)動程序間的通信,完全不同于內(nèi)核和字符設備以及塊驅(qū)動程序之間的通信,內(nèi)核調(diào)用一套和數(shù)據(jù)傳輸相關的函數(shù)而不是read、write等。由于不是面向流的設備,因此將網(wǎng)絡接口映射到文件系統(tǒng)中的節(jié)點(比如/dev/tty1)比較困難。許多網(wǎng)絡連接是面向流的,但網(wǎng)絡設備卻圍繞數(shù)據(jù)包的傳輸和接收而設計。通常,接口都是硬件設備,但也可能是純軟件設備,比如回環(huán)(loopback)接口。在內(nèi)核中,和字符驅(qū)動程序相比,塊驅(qū)動程序具有完全不同的接口,但這些不同對上層用戶來說是完全透明的。塊設備上能夠容納文件系統(tǒng)。例如,幀抓取器就是這樣一個設備,應用程序可以用mmap或lseek訪問抓取的整個圖象。這些設備和普通文件之間的唯一差別在于對普通文件的訪問可以前后移動訪問位置,而大多數(shù)字符設備是一個只能順序訪問的數(shù)據(jù)通道。字符終端(/dev/console)和串口(/dev/ttys0以及類似設備)就是兩個字符設備,他們能夠良好的說明“流”這種抽象概念。workdevice),塊設備(block Linux設備驅(qū)動程序分類Linux設備驅(qū)動程序在Linux的內(nèi)核源代碼中占有很大的比例,源代碼的長度日益增加,主要是驅(qū)動程序的增加。 這個編程接口能夠使得驅(qū)動程序獨立于內(nèi)核的其他部分而建立,必要的情況下可在系統(tǒng)運行時“插入”到內(nèi)核。用戶的活動通過一套標準化的調(diào)用來執(zhí)行,而這些調(diào)用獨立于特定的驅(qū)動程序。 Linux設備驅(qū)動程序概述驅(qū)動程序在 Linux內(nèi)核里扮演著特殊的角色。一般來說,系統(tǒng)調(diào)用是操作系統(tǒng)的設計者提供給用戶使用內(nèi)核功能的接口,但Linux開放的源代碼也允許你設計自己的系統(tǒng)調(diào)用,然后把它加入到內(nèi)核。模塊機制可以使內(nèi)核很容易地增加一個新的模塊(如一個新的設備驅(qū)動程序),而無需重新編譯內(nèi)核;同時,模塊機制還可以把一個模塊按需添加到內(nèi)核或從內(nèi)核中卸下,這使得我們可以按需要定制自己的內(nèi)核。虛擬文件系統(tǒng)不僅為多種邏輯文件系統(tǒng)(如ext2,fat等)提供了統(tǒng)一的接口,而且為各種硬件設備(作為一種特殊文件)也提供了統(tǒng)一接口。內(nèi)存管理是和硬件平臺密切相關的部分,為了支持不同的硬件平臺而又保證虛擬存儲管理技術的通用性,Linux的虛擬內(nèi)存管理為不同的硬件平臺提供了統(tǒng)一的接口,因此把Linux內(nèi)核移植到一個新的硬件平臺并不是一件很困難的事。內(nèi)核線程可以說是用戶進程,但和一般的用戶進程又有不同,它象內(nèi)核一樣不被換出,因此運行效率較高。內(nèi)核線程是在后臺運行而又與終端或登錄shell結合在一起的進程。對于用戶進程,Linux采用簡單的動態(tài)優(yōu)先級調(diào)度方式;對于內(nèi)核中的例程(如設備驅(qū)動程序、中斷服務程序等)則采用了一種獨特的機制—軟中斷機制,這種機制保證了內(nèi)核例程的高效運行。Linux的進程調(diào)度方式簡單而有效。這種結構的最大特點是內(nèi)部結構簡單,子系統(tǒng)間易于訪問,因此內(nèi)核的工作效率較高。整個Linux內(nèi)核由很多過程組成,每個過程可以獨立編譯,然后用連接程序?qū)⑵溥B接在一起成為一個完整的目標程序。它不僅繼承了Unix的特征,而且在許多方面超過了Unix。內(nèi)核負責處理所有這些請求,根據(jù)內(nèi)核完成任務的不同,可以將內(nèi)核劃分成如下圖22的功能模塊:圖22 Linux系統(tǒng)模塊及功能圖 Linux的特性Linux是個人計算機和工作站上的Unix類操作系統(tǒng),但是,它絕不僅僅是簡化的Unix系統(tǒng)。例如,處理系統(tǒng)調(diào)用(從用戶空間切換到內(nèi)核空間)的機制可能在各個體系結構上都不相同。這點非常重要,因為內(nèi)核和用戶空間的應用程序使用的是不同的保護地址空間,每個用戶空間的進程都使用自己的虛擬地址空間,而內(nèi)核則占用單獨的地址空間。用戶空間之下是內(nèi)核空間,Linux 內(nèi)核正是位于這里。首先來分析一下Linux操作系統(tǒng)的體系結構,可以從兩個層次上來考慮操作系統(tǒng),如下圖 21所示:圖21 GNU/Linux操作系統(tǒng)的基本體系結構圖最上面是用戶(或應用程序)空間。今天,在全世界的Internet上的自愿參加的程序員們和計算機公司的共同努力下,Linux繼續(xù)飛速的向前發(fā)展。Linux 目前是計算機技術的一大熱點之一,最近幾年在我國得到迅猛發(fā)展,被廣泛應用在嵌入式系統(tǒng)、安全產(chǎn)品、服務器和桌面應用等領域。在本章節(jié)中,從介紹Linux的誕生開始,由淺入深的進入到Linux內(nèi)核,最后過渡到對網(wǎng)絡設備驅(qū)動的介紹。最后,每個網(wǎng)絡設備都聲明了很多能操作它的函數(shù),應該熟悉較多的能夠?qū)W(wǎng)絡接口進行操作的函數(shù),論文深入的研究了Linux下模塊設計的必要性,并通過編寫這些操作函數(shù)來實現(xiàn)網(wǎng)卡驅(qū)動模塊的加載以及網(wǎng)絡設備的初始化、設備打開與關閉、數(shù)據(jù)的發(fā)送與接收、信息統(tǒng)計、網(wǎng)卡驅(qū)動模塊的卸載等功能,章節(jié)中對重要函數(shù)都進行了詳細的說明,這些實現(xiàn)了網(wǎng)卡驅(qū)動的基本要求。其次,論文從整體上對驅(qū)動程序進行了分塊設計,主要由模塊加載、網(wǎng)絡設備初始化、注冊、設備打開與關閉、數(shù)據(jù)的發(fā)送與接收等模塊構
點擊復制文檔內(nèi)容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1