Linux kernel初始化时调用的do_initcalls里面并行执行问题
本文是原「蜗窝讨论区」的历史存档(2016-10-10),来自版块「Linux kernel技术问答」,共 4 帖。讨论区已停止服务,此处仅供查阅。
我的Linux内核开发包里有两个I2C 触摸屏driver,都在driver/input/touchscreen/下面,两个driver的初始化函数都通过module_init,放在了__initcall_段里面,由do_initcalls依次调用执行。
现在项目组同事有观察到两个driver的probe 同时并发执行了。因为两个driver 的probe并发执行了,而且都会调用到同样的GPIO操作,所以我们不得不在两个probe里面都加了锁保护。
我的推测是kernel初始化时,即使是SMP架构,应该不会并发执行代码吧。但是我也不太确定我的推测。 如果两个probe并发执行的话,难道多核情况下,函数do_initcalls调用时,因为SMP架构已经初始化完毕,这个时候虽然两个drvier的init函数看代码样子是顺序执行的,但是init函数执行完,两个i2c driver在I2C 总线上的匹配成功后,两个driver的probe有可能是并发执行的吗(比如两个核各执行一个probe)?
请大家谁知道的,答疑下,谢谢。 (我的Linux内核版本是3.0.35)
温柔海洋 写道: 我的Linux内核开发包里有两个I2C 触摸屏driver,都在driver/input/touchscreen/下面,两个driver的初始化函数都通过module_init,放在了__initcall_段里面,由do_initcalls依次调用执行。
现在项目组同事有观察到两个driver的probe 同时并发执行了。因为两个driver 的probe并发执行了,而且都会调用到同样的GPIO操作,所以我们不得不在两个probe里面都加了锁保护。
我的推测是kernel初始化时,即使是SMP架构,应该不会并发执行代码吧。但是我也不太确定我的推测。 如果两个probe并发执行的话,难道多核情况下,函数do_initcalls调用时,因为SMP架构已经初始化完毕,这个时候虽然两个drvier的init函数看代码样子是顺序执行的,但是init函数执行完,两个i2c driver在I2C 总线上的匹配成功后,两个driver的probe有可能是并发执行的吗(比如两个核各执行一个probe)?
请大家谁知道的,答疑下,谢谢。 (我的Linux内核版本是3.0.35)
按理说,如果是build in kernel的driver的话,initcall只能在boot cpu上顺序执行,执行过程中,只有可能被中断打断. 因此不应该出现你所说的"并发执行"的现象.
以下是我的理解:initcall之前通过kernel_init(->kernel_init_freeable(->smp_init(已经开启了多核,只是do_initcalls调用每个level的初始化的时候选择了串行启动,也就是驱动的init函数,但是probe函数我的理解可以并行的,所以如果你需要串行走,通过init函数初始化应该是可以实现的。
可以参考编译出来的System.map,或者烧机后的/proc/kallsyms文件
