d4577392b70efb61b58c01bbcf0b04c6.png

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一般用于动态加载驱动也就是热插拔的时候使用,这也就是为什么网上大部分教程不讲这个驱动的原因了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐