引导程序如何在“使用命令重新启动系统”之后提取命令?

Android的源代码重新启动命令看,我们find以下行:

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

哪个是标准的Linux系统调用,用特定的命令重启系统,参见Unix系统调用重启 。

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

我的问题是: 引导程序如何拿起命令? 这个function是在U-Boot中实现的吗? (我无法通过Google或U-Boot源find它。)

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

Solutions Collecting From Web of "引导程序如何在“使用命令重新启动系统”之后提取命令?"

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

大多数体系结构完全忽视了通过的命令 – 对于一个不适用的例子,参见SPARC。 machine_restart()的SPARC实现将提供的字符串传递给PROM的boot命令。

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

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

我们保留一个非常小的内存部分,保留从bootloader到内核的“通信”和相反的方向。 如果这个内存可以在重新启动后存活(在重新引导之前或者在Flash中把内存置于自刷新模式),那么可以很容易地读取引导加载程序启动的值,并确定是否必须启动内核,然后通常是系统或者你想要进入bootloader的特殊模式。

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

另一种方法是挖出一些内存并传递从bootloader读取的一些标志。 唯一的问题是DRAM内容在重新启动时可能会丢失,除非您将SDRAM置于自我更新模式。 所以在重新启动时需要照顾。

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

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