在我的学习和检查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 行,这个字段被分配了 function flash_dev_make_request
,这让你以为你调用了 function make_request_fn()
,但实际上你调用了flash_dev_make_request()
。
它是提供封装和多态性的真正基本方法,也是 C 语言中真正基本的 OOP 模型。
答案2
看来不同的内核版本有不同的功能布局。我正在研究 Linux 内核 4.9。 make_request_fn由blk-core.c中的blk_queue_make_request()函数初始化。