8139too.c
NIC のドライバって面白そうって思いつつ、おそらくドライバの勉強に一番てっとり早い、というナニで平田さんもあの書籍を書かれたのだろうな、と。
がしかし、なかなかソコに手が伸びないこれまでとこの週末。
ポイント
を以下に列挙
- ソケットインターフェース
- sockfs
- ネットデバイス
家にある本が上記のキーワードで繋がりはじめてるんですが、とりあえず_エントリポイント_から確認開始。
entry point
とりあえずモジュールが load される時の手続きが以下
static int __init rtl8139_init_module (void) { /* when we're a module, we always print a version message, * even if no 8139 board is found. */ #ifdef MODULE printk (KERN_INFO RTL8139_DRIVER_NAME "\n"); #endif return pci_module_init (&rtl8139_pci_driver); }
バージョンは 2.6.10 だったりします。モジュールだったら printk してます。RTL8139_DRIVER_NAME の定義は以下で
#define RTL8139_DRIVER_NAME DRV_NAME " Fast Ethernet driver " DRV_VERSION
そこから参照されてるマクロが以下
#define DRV_NAME "8139too" #define DRV_VERSION "0.9.27"
で、呼び出されてる pci_module_init 手続きの定義が以下。
/* * pci_module_init is obsolete, this stays here till we fix up all usages of it * in the tree. */ #define pci_module_init pci_register_driver
obsolete な模様。本体は drivers/pci/pci-driver.c の pci_register_driver 手続きな模様。以下。
/** * pci_register_driver - register a new pci driver * @drv: the driver structure to register * * Adds the driver structure to the list of registered drivers. * Returns a negative value on error, otherwise 0. * If no error occured, the driver remains registered even if * no device was claimed during registration. */ int pci_register_driver(struct pci_driver *drv) { int error; /* initialize common driver fields */ drv->driver.name = drv->name; drv->driver.bus = &pci_bus_type; drv->driver.probe = pci_device_probe; drv->driver.remove = pci_device_remove; drv->driver.owner = drv->owner; drv->driver.kobj.ktype = &pci_driver_kobj_type; pci_init_dynids(&drv->dynids); /* register with core */ error = driver_register(&drv->driver); if (!error) pci_populate_driver_dir(drv); return error; }
最初のあたりが意味不明。include/linux/pci.h に pci_driver 構造体の定義があるんですが、どうも pci_driver 構造体と device_driver 構造体 (include/linux/device.h) のカラミが微妙。
とりあえず
コマいあたりに拘らず、カーネル解析入門に沿ってすすめる事ができるのかどうか。