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) のカラミが微妙。

とりあえず

コマいあたりに拘らず、カーネル解析入門に沿ってすすめる事ができるのかどうか。