bdevsw
意図的にスルーしてた (?) んですがやっぱ気になってて再読。一つは unix/conf.h にて構造体の宣言とその配列の定義な記述。
4609 /* 4610 * ブロックデバイススイッチの宣言。 4611 * 各エントリ (行) は unix の主コードと 4612 * ドライバ間の唯一の結合である。 4613 * デバイススイッチの初期設定は 4614 * ファイル conf.c 内で 4615 * 行なわれる。 4616 */ 4617 struct bdevsw { 4618 int (*d_open)(); 4619 int (*d_close)(); 4620 int (*d_strategy)(); 4621 int *d_tab; 4622 } bdevsw[];
あ、配列の定義、ではないですね。ポインタ宣言、にあたるんかな。
そして unix/conf.c の先頭で以下な配列定義。
4656 int (*bdevsw[])() 4657 { 4658 &nulldev, &nulldev, &rkstrategy, &rktab, /* rk */ 4659 &nodev, &nodev, &nodev, 0, /* rp */ 4660 &nodev, &nodev, &nodev, 0, /* rf */ 4661 &nodev, &nodev, &nodev, 0, /* tm */ 4662 &nodev, &nodev, &nodev, 0, /* tc */ 4663 &nodev, &nodev, &nodev, 0, /* hs */ 4664 &nodev, &nodev, &nodev, 0, /* hp */ 4665 &nodev, &nodev, &nodev, 0, /* ht */ 4666 0 4667 };
上記、おそらくは int の戻りで引数なしの関数ポインタの一次元配列を定義して初期化もしている、という表現なはず。
ここから先は推測ベースなんですが
- (*bdevsw[2])()
- (*bdevsw[0].d_strategy)()
という呼び出しかたができるのかな、と思いきや引数渡しとるw
5212 (*bdevsw[swapdev>>8].d_strategy)(&swbuf);
かなり何でもアリな状態らしい。
つうか、よくよく見てみるに名前がアレ。俗に言う多重定義?
とりあえず配列定義てきに間違ってはいない、というのも C 言語ですよねw