在处理init之前强制加载Linux内核

时间:2014-05-19 15:39:32

标签: linux linux-kernel embedded init buildroot

我很难找到解决这个问题的好方法。我有两个运行Buildroot Linux的SBC几乎完全相同,除了我试图在启动时检测的USB ACM卡和基于SBC动态的加载服务(例如,有一个脚本"触摸sbc1& #34;如果检测到卡或"触摸sbc2"如果不是,则使用此文件加载网络的不同配置。

我正在使用静态开发表,Busybox init和3.12.20内核(USB CDC作为内置驱动程序编译;我禁用了模块)。这是问题所在:我编写了一个脚本(S00setup,因此它是rcS中应该运行的第一个脚本;此脚本必须在网络脚本之前运行)以检查是否存在此卡。似乎CDC ACM驱动程序加载在两块板上,无论它是否存在,以便检查不起作用(缓冲区总是说usbcore:注册的新接口驱动程序cdc_acm后跟cdc_acm:用于USB调制解调器和ISDN适配器的USB抽象控制模型驱动程序) 。此外,我的dmesg输出大约在2秒内从脚本调用它,并且只有在那之后它才会实际将/ dev / ttyACM0分配给设备。在处理此init文件之前,如何强制内核完成引导,以便我可以正确检测它?会睡觉吗?#34;在这里工作?如果没有,那又怎样? Bash / Linux是否有某种类型的DoEvents()?使用lsusb检测卡的情况与之相同,因为设备在脚本处理之后才会显示,这对我来说没有意义。所以要问一个类似的问题,我想另一种方法是强制轮询USB设备;无论如何都要这样做吗?

我在这里发布了这个问题,而不是Unix和Linux,因为你们这里的人似乎对此更有经验,如果有任何快速程序我可以编写强制内核完成处理。当它实际将设备分配给ttys等等时,我只缺少1-2秒的内核缓冲区。这是我需要区分两块板的输出。显然,我这样做的原因是因为我想在两个系统上使用相同的操作系统映像;出于配置管理的目的,这种方式更容易。

1 个答案:

答案 0 :(得分:4)

USB设备是可热插拔的,因此可以随时出现。当谈到USB时,没有关于“完成引导”的概念,因此Linux没有理由等待所有当前连接的设备枚举。毕竟,最终结果与稍后连接的设备相同。

你应该做的是将脚本挂钩到udev / systemd中该设备的外观并从那里开始工作。

或者更简单,只需在脚本中sleep并希望获得最佳效果。 udevadm settle 可能有助于等到设备出现,如果它们已经导致了udev事件。