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的入口,然后完成設備注冊,并依次調用pxe的PXENV_START_UNDI,PXENV_UNDI_STARTUP,PXENV_UNDI_INITIALIZE,PXENV_UNDI_GET_INFORMATION,PXENV_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_ADDRESS,PXENV_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調試