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