Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
静的リンクの場合、モジュールの場合どちらでも最初に一度ドライバ初期化関数が呼びだされる。(baaドライバであれば、一般にbaa_probe()という名前がつけれている)ドライバ初期化関数では「struct net_device」構造体の初期化を行う。この構造体は上位プロトコル層に対するインターフェイス定義として利用される。イーサドライバではether_setup関数により、イーサドライバで共通データの初期化を行うことができるため、ドライバ初期化関数では、そのハードに特化した部分のみの初期化を行えばよい。
ifconfigコマンドなどからインターフェイスのUP処理要求が発生するとdev_open関数が呼び出される。dev_open関数は、まずネットワークドライバのopen関数を呼び出す(baaドライバであれば、一般にbaa_open()という名前がつけれている)。割り込みハンドラ登録もこのときに行われる。(baaドライバであれば、一般にbaa_interrupt()という割り込みハンドラをrequest_irq関数で登録する)
次に送受信用のパケットを繋ぐ送信データキュー(Qdisc)の初期化を行う(dev_activate関数)。
このときからドライバが利用可能となる。
struct net_device { char *name; //インターフェイス名 unsigned short type; //ハードウェア種別(イーサなど) unsigned char dev_addr[]; //ハードウェアアドレス(イーサアドレス等) struct Qdisc *qdisc; //送信データキュー : /*各種ドライバ操作関数*/ int (*open)(); int (*stop)(); int (*hard_start_xmit)(); : : }
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:17:52, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members