資源描述:
《Linux內(nèi)核數(shù)據(jù)包處理流程.doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、Linux內(nèi)核數(shù)據(jù)包處理流程-數(shù)據(jù)包接收與其說這篇文章分析了網(wǎng)卡驅(qū)動中中數(shù)據(jù)包的接收,還不如說是以e100為例,對網(wǎng)卡驅(qū)動編寫的一個(gè)說明。當(dāng)然,對數(shù)據(jù)包的接收說的很清楚。轉(zhuǎn)載數(shù)據(jù)包的接收作者:kendoKernel:2.6.12一、從網(wǎng)卡說起這并非是一個(gè)網(wǎng)卡驅(qū)動分析的專門文檔,只是對網(wǎng)卡處理數(shù)據(jù)包的流程進(jìn)行一個(gè)重點(diǎn)的分析。這里以Intel的e100驅(qū)動為例進(jìn)行分析。大多數(shù)網(wǎng)卡都是一個(gè)PCI設(shè)備,PCI設(shè)備都包含了一個(gè)標(biāo)準(zhǔn)的配置寄存器,寄存器中,包含了PCI設(shè)備的廠商ID、設(shè)備ID等等信息,驅(qū)動程序使用
2、來描述這些寄存器的標(biāo)識符。如下:CODE:structpci_device_id{????__u32vendor,device;????????/*VendoranddeviceIDorPCI_ANY_ID*/????__u32subvendor,subdevice;????/*SubsystemID'sorPCI_ANY_ID*/????__u32class,class_mask;????/*(class,subclass,prog-if)triplet*/????kernel_ulong_tdri
3、ver_data;????/*Dataprivatetothedriver*/};這樣,在驅(qū)動程序中,常常就可以看到定義一個(gè)structpci_device_id類型的數(shù)組,告訴內(nèi)核支持不同類型的PCI設(shè)備的列表,以e100驅(qū)動為例:#defineINTEL_8255X_ETHERNET_DEVICE(device_id,ich){????PCI_VENDOR_ID_INTEL,device_id,PCI_ANY_ID,PCI_ANY_ID,????PCI_CLASS_NETWORK_ETHERN
4、ET<<8,0xFFFF00,ich}????staticstructpci_device_ide100_id_table[]={????INTEL_8255X_ETHERNET_DEVICE(0x1029,0),????INTEL_8255X_ETHERNET_DEVICE(0x1030,0),????INTEL_8255X_ETHERNET_DEVICE(0x1031,3),……/*略過一大堆支持的設(shè)備*/????{0,}};在內(nèi)核中,一個(gè)PCI設(shè)備,使用structpci_driver結(jié)構(gòu)來描述
5、,structpci_driver{????structlist_headnode;????char*name;????structmodule*owner;????conststructpci_device_id*id_table;????/*mustbenon-NULLforprobetobecalled*/????int??(*probe)??(structpci_dev*dev,conststructpci_device_id*id);????/*Newdeviceinserted*/????
6、void(*remove)(structpci_dev*dev);????/*Deviceremoved(NULLifnotahot-plugcapabledriver)*/????int??(*suspend)(structpci_dev*dev,pm_message_tstate);????/*Devicesuspended*/????int??(*resume)(structpci_dev*dev);????????????????/*Devicewokenup*/????int??(*enab
7、le_wake)(structpci_dev*dev,pci_power_tstate,intenable);??/*Enablewakeevent*/????void(*shutdown)(structpci_dev*dev);????structdevice_driver????driver;????structpci_dynidsdynids;};因?yàn)樵谙到y(tǒng)引導(dǎo)的時(shí)候,PCI設(shè)備已經(jīng)被識別,當(dāng)內(nèi)核發(fā)現(xiàn)一個(gè)已經(jīng)檢測到的設(shè)備同驅(qū)動注冊的id_table中的信息相匹配時(shí),它就會觸發(fā)驅(qū)動的probe函數(shù)
8、,以e100為例:/**定義一個(gè)名為e100_driver的PCI設(shè)備*1、設(shè)備的探測函數(shù)為e100_probe;*2、設(shè)備的id_table表為e100_id_table*/staticstructpci_drivere100_driver={????.name=??????DRV_NAME,????.id_table=????e100_id_table,????.probe=??????e100_probe,????.remove=????__dev