在“使用命令重启系统”后,引导加载程序如何获取命令?

时间:2011-03-29 12:49:04

标签: android linux linux-kernel bootloader u-boot

查看android source for the reboot command,我们找到以下行:

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, \
         LINUX_REBOOT_CMD_RESTART2, argv[optind]);

使用特定命令重启系统的标准Linux系统调用是哪个,请参阅Unix System Call Reboot

在Android中,此命令用于告诉引导加载程序在恢复模式下启动内核或在引导加载程序中启动快速启动模式。

我的问题是:引导加载程序如何获取命令?这个功能是在U-Boot中实现的吗?(我无法通过Google或U-Boot源找到它。)

此外,它似乎并非特定于Android,而是Linux执行“使用命令重启”的方式。有关如何在Linux中“正常”处理/使用它的任何信息?

4 个答案:

答案 0 :(得分:6)

使用LINUX_REBOOT_CMD_RESTART2重新启动系统时,提供的命令字符串将传递给使用register_reboot_notifer()注册的所有通知程序,最后传递给machine_restart() - 实际的体系结构特定功能执行系统重启。

大多数架构完全忽略传递的命令 - 对于没有传递命令的示例,请参阅SPARC。 SPARC implementation of machine_restart()将提供的字符串传递给PROM的boot命令。

ARM implementation of machine_restart()最终将提供的命令传递给arch_reset(),这是在每个ARM平台上单独实现的 - 从我所看到的,大多数(如果不是所有的)实现都忽略了传递的命令,至少在上游内核中。这可能不是你正在寻找的机器人。

答案 1 :(得分:1)

我不知道他们是如何在Android中做到的,但在我们使用u-boot的系统上,我们也有类似的机制。

我们保留一个非常小的内存部分,保留用于从引导加载程序到内核的“通信”以及相反的方向。如果此内存可以在重新启动后继续运行(在重新启动之前将RAM置于自刷新模式,或者在Flash中),则可以轻松读取引导加载程序启动时的值并确定是否必须启动内核,然后通常启动系统或者你想进入引导程序的特殊模式。

答案 2 :(得分:1)

在MSC分区中写入“boot-recovery”命令。引导加载程序从MSC分区读取字符串并加载恢复内核。这就是在Froyo之前和以前加载恢复内核的方式。 GB / HC / ICS可以采用相同的方法。

另一种方法是创建一些内存并传递一些从引导加载程序读取的标志。唯一的问题是,在重启期间DRAM内容可能会丢失,除非您将SDRAM置于自我refesh模式。所以在重启期间需要注意这一点。

在更新过程中断电时,第一种方法很有用。在这种情况下,设备需要再次进入恢复内核。在这种情况下,只有在整个更新过程成功后才能清除MSC分区。

答案 3 :(得分:0)

在某些ARM处理器上,正在运行的内核在其中一个CPU寄存器中设置一个标志,然后由UBOOT读取,如果非常特定于硬件,请记住这些内容。