Linuxカーネルコードを調べて調べたところ、私は次の機能を見つけました。make_request_fn。存在するこれリンクによると、この関数型定義は次の場所にあります。include/linux/blkdev.h、211行目:
typedef void (make_request_fn) (struct request_queue *q, struct bio *bio);
しかし、.cファイルからソースコードへの実装がどこにあるかについての言及はありません。私の質問は、この関数のソースコードはどこですか?
答え1
typedef void (make_request_fn) (struct request_queue *q, struct bio *bio);
これはない関数宣言。その定義は機能タイプ。後で同じファイルにinclude/linux/blkdev.h、299行、request_queue
同じ名前の構造体のフィールドを取得します。
そしてdrivers/md/bcache/request.cファイルの1140行、このフィールドには関数が割り当てられているので関数をflash_dev_make_request
呼び出したと思いますmake_request_fn()
が実際には呼び出しましたflash_dev_make_request()
。
これはカプセル化と多型を提供する本当に基本的な方法であり、Cの本当に基本的なOOPモデルです。
答え2
カーネルバージョンごとに機能的なレイアウトが異なるようです。私はLinuxカーネル4.9で作業しています。 make_request_fn は blk-core.c の blk_queue_make_request() 関数によって初期化されます。