重启系统带命令后,引导程序如何接收命令?

12

查看Android源代码中的重启命令,我们可以找到以下这行代码:

__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中如何“通常”处理/使用这一点的任何信息?


我认为他们在这里谈论的命令是用于重新启动机器的,而不是在机器重新启动后运行的命令。但我不确定,这是我第一次看到这个。 - Carlos Campderrós
@Carlos:当被要求“重新启动进入恢复模式”时,引导加载程序需要使用特殊的恢复根文件系统来引导Linux内核。这通常发生在OTA更新期间或执行“adb reboot recovery”等操作时。因此,在重启后,必须将从正在运行的Linux内核传递到引导加载程序的恢复模式请求。 - Bjarke Freund-Hansen
嗯,是的,你说得对。看着那个相关的问题如何告诉-uboot告诉Linux内核要引导到哪个运行级别,可能是通过setenv bootargs something的方式实现的。 - Carlos Campderrós
是的,U-boot可以向Linux内核提供选项,这很简单(只需使用内核命令行)。这里发生的是内核向引导加载程序提供选项(即命令),跨越重新启动。我需要了解这是如何工作的? - Bjarke Freund-Hansen
我今天感觉很糟糕。我想喝点咖啡。 - Carlos Campderrós
@Carlos:嘿嘿。无论如何感谢你的意见,享受你的咖啡吧。 :) - Bjarke Freund-Hansen
4个回答

7
当使用LINUX_REBOOT_CMD_RESTART2重新启动系统时,提供的命令字符串将传递给所有已注册register_reboot_notifer() 的通知程序,最终传递给machine_restart() - 这是实际执行系统重启的体系结构特定功能。
大多数架构完全忽略传递的命令 - 关于不忽略的示例,请参见SPARC。 SPARC实现的machine_restart() 将提供的字符串传递给PROM的boot命令。 machine_restart()ARM实现 最终将提供的命令传递给在每个ARM平台上单独实现的arch_reset() - 从我所看到的内容来看,在上游内核中,大多数(如果不是全部)这些实现都忽略了传递的命令。这可能不是您要找的东西。

2
在MSC分区中写入“boot-recovery”命令。引导加载程序从MSC分区读取该字符串并加载恢复内核。这是在Froyo及之前加载恢复内核的方法。在GB / HC / ICS中可以采用相同的方法。
另一种方法是划分一些内存并传递一些标志,引导加载程序会从中读取。唯一的问题是,DRAM内容可能会在重新启动时丢失,除非将SDRAM置于自刷新模式。因此,在重新启动时需要注意这一点。
第一种方法在更新过程中断电时非常有用。在这种情况下,设备需要再次进入恢复内核。在这种情况下,必须在整个更新过程成功后才能清除MSC分区。

1

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

我们保留了一个非常小的内存部分,专门用于从引导加载程序到内核以及相反方向的“通信”。如果这个内存可以在重启后存活下来(将RAM置于自刷新模式或Flash中),那么在引导加载程序启动时读取该值就很容易了,然后确定是否需要启动内核,通常是启动您的系统,或者您想进入引导加载程序的特殊模式。


是的,我也是这么想的。看一下man 2 reboot(http://linux.die.net/man/2/reboot),似乎“带命令重启”模式是标准Linux选项(LINUX_REBOOT_CMD_RESTART2)。因此,它似乎不是Android特有的。 - Bjarke Freund-Hansen

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

这确实是极其硬件特定的。在某些Android设备上,应用处理器甚至不会重置自身,而是要求无线电协处理器将其重置,然后可能会通知启动程序应该处于哪种模式。 - Chris Stratton
这种方法还有更多信息,请参考 https://groups.google.com/forum/#!topic/android-porting/t4aD6IeHZ-0 - pevik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接