12

android 源代码中查找 reboot 命令,我们发现以下行:

__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

4 回答 4

7

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

大多数体系结构完全忽略传递的命令 - 有关不传递的命令的示例,请参阅 SPARC。SPARC 实现machine_restart()将提供的字符串传递给bootPROM 的命令。

ARM 实现machine_restart()最终将提供的命令传递给该命令,该命令arch_reset()在每个 ARM 平台上分别实现 - 据我所知,大多数(如果不是全部)这些实现都会忽略传递的命令,至少在上游内核中是这样。这可能不是您要找的机器人。

于 2011-04-01T06:42:01.257 回答
2

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

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

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

于 2012-02-27T12:50:07.297 回答
1

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

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

于 2011-03-30T06:31:02.413 回答
0

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

于 2014-10-09T18:14:13.527 回答