UNDI的驅動程序結構:

struct pci_driver undipci_driver __pci_driver = {

         .ids = undipci_nics,

         .id_count = ( sizeof ( undipci_nics ) / sizeof ( undipci_nics[0] ) ),

         .probe = undipci_probe,                     //undi探測,獲取創建設備的函數

         .remove = undipci_remove,              //

};

 

undipci_probe函數的主要功能及流程是

1.       通過undipci_find_rom函數來查找undi rom

2.       通過undinet_probe函數來記錄pxe的入口,然后完成設備注冊,并依次調用pxePXENV_START_UNDIPXENV_UNDI_STARTUPPXENV_UNDI_INITIALIZEPXENV_UNDI_GET_INFORMATIONPXENV_UNDI_GET_IFACE_INFO來完成pxe的初始化,

3.       其中設備注冊會注冊如下結構體指針

/** UNDI network device operations */

static struct net_device_operations undinet_operations = {

.open                 = undinet_open,

.close                 = undinet_close,

.transmit          = undinet_transmit,

.poll                    = undinet_poll,

.irq                  = undinet_irq,

};

如此一來,但此時還不能收發包,必須先調用open來打開設備,當調用open來打開設備的時候,undinet_open做了哪些操作呢?

1.       調用undinet_hook_isr函數來hook pci中斷的irq,即網卡產生的irq,那么該IRQ號是多少,從哪里來呢,該IRQ號由前面的undinet_probe函數中調用PXENV_UNDI_GET_INFORMATION來獲取,具體數值見s_PXENV_UNDI_GET_INFORMATION結構體中的IntNumber

2.       調用enable_irq來使能irq

3.       調用send_eoi來發送一個eoi到網卡

4.       依次調用PXENV_UNDI_SET_STATION_ADDRESSPXENV_UNDI_OPEN來進一步初始化UNDI

5.       此時網卡產生的中斷都會調用undinet_hook_isr函數注冊的irq handler了,該handler的實現在undiisr.S文件中,undiisr函數即是.


gpxe編譯vmware對應的鏡像調試版本命令

make DEBUG=pcnet32 bin/pcnet32.dsk

gpxe通過顯示調試

http://etherboot.org/wiki/debug

還可以通過gdb調試