gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:55 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

您应该做的是在 udev/systemd 中将脚本挂接到该设备的外观,然后从那里开始工作。

或者更简单,只需在脚本中 sleep 并希望一切顺利。 udevadm settle可能有助于等待设备出现(如果它们已经引起了 udev 事件)。

关于linux - 在处理 init 之前强制加载 Linux 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23741843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com