module是什么类型_Linux驱动开发:为什么教程都不讲MODULE_DEVICE_TABLE的作用

1.疑问
在阅读linux源代码时发现,在驱动中大量使用了MODULE_DEVICE_TABLE这个宏。
MODULE_DEVICE_TABLE(platform, s3c_adc_driver_ids);
MODULE_DEVICE_TABLE(of, of_flash_match);
MODULE_DEVICE_TABLE(of, dma_match);
而网上大部分的教程都没有介绍过这个宏,那么这个宏究竟是做什么的那?
2.分析
看看它是如何实现的:
这个宏定义在:/include/linux/module.h 中
#ifdef MODULE
/* Creates an alias so file2alias.c can find device table. */
#define MODULE_DEVICE_TABLE(type, name)
extern const typeof(name) __mod_##type##__##name##_device_table __attribute__ ((unused, alias(__stringify(name))))
#else /* !MODULE */
#define MODULE_DEVICE_TABLE(type, name)
#endif
根据代码把这个宏展开之后会发现:
生成了一个 _mod_type__name_device_table 的符号表,其中type为类型,name是这个驱动的名称。在内核编译的时候将这部分符号单独放置在一个区域。
3.原因
当内核运行的时,用户通过类型(tpye)和类型对应的设备表中名称(name)中动态的加载驱动,在表中查找到了这个符号之后可以迅速的加载驱动。
4. 结论
由以上可以得出结论,MODULE_DEVICE_TABLE一般用于动态加载驱动也就是热插拔的时候使用,这也就是为什么网上大部分教程不讲这个驱动的原因了。