出于安全原因,我必须从 u-boot 启动 Linux,并隐藏(静默)所有输出,直到输入密码。我已将 uBoot 配置为使用CONFIG_AUTOBOOT_KEYED
宏正确执行此操作,并且可以成功地以静默方式启动。
我遇到的问题是,当 uBoot 启动 Linux 内核并启用静默模式时,它会console=
作为 bootargs 的一部分传递给 Linux 内核。这对于静默启动来说很好,但我似乎找不到在启动后再次重新启用控制台的方法。
我还尝试正常启动并附加到loglevel=0
适用于静默启动的内核启动参数,但我再次无法重新启用控制台。我试过了:
dmesg -n 4
和
klogd -c 4
尝试将内核日志级别设置回 KERN_WARNING (4),但没有成功。当我正常启动内核时,这些命令可以正常工作。
我在这个问题上找到的最好的指南是静音启动过程在 blackfin.uclinux.org 上。
理想情况下,我想使用 uBoot 的静默模式,它console=
作为 bootargs 的一部分传递,但仍然在控制台上接受输入,并在输入密码时重新启用输出。
答案1
如果其他人遇到这个问题,我从来没有找到好的解决办法。我最终破解了 u-boot 和 Linux 内核串行驱动程序,并基本上检查是否已输入密码。如果有,我允许代码正常运行。如果没有,我就从函数中返回,这样控制台上实际上就没有打印出任何内容。
对于内核,我编辑了 receive_chars() 函数来查找密码(输入),并编辑了 Transmission_chars() 来屏蔽输出。我让 u-boot 将密码作为 bootargs 的一部分传递。如果它为空,则密码已经输入,我们忽略了特殊代码。如果它是一个值,那么我们通过 receive_chars() 获取输入字符并将它们与 bootargs 中存储的字符串进行比较。
在 u-boot 中,我只使用 CONFIG_AUTOBOOT_KEYED 和相关的默认宏来输入密码。然后,我将 common/cmd_bootm.c 更改为不调用 fixup_silent_linux() 来屏蔽 console= 值,并让内核按上述方式处理它。
希望这对其他人有帮助。