【问题标题】:How does the bootloader pick up the command after a "restarting system with command"?在“使用命令重新启动系统”之后,引导加载程序如何获取命令?
【发布时间】:2011-07-25 06:31:29
【问题描述】:

查看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 中“通常”处理/使用的任何信息?

【问题讨论】:

  • 我认为他们这里所说的命令是用来重启机器的,而不是机器重启后会运行的命令。但是我不知道,这是我第一次看到这个。
  • @Carlos:当引导加载程序被要求“重新启动进入恢复模式”时,它需要使用特殊的恢复根文件系统启动 linux 内核。这发生在 OTA 更新期间,或者当您执行“adb reboot recovery”或类似操作时。所以这个重启到恢复模式的请求必须在重启后从正在运行的 linux 内核传递给引导加载程序。
  • 嗯,是的,你是对的。通过setenv bootargs something查看相关问题how does one tell -uboot to tell the linux kernel which runlevel to boot to 可能是相同的方式@
  • 是的,U-boot 可以为 Linux 内核提供选项,这很简单(只需使用内核命令行。)这里发生的是内核正在提供选项(即命令)引导加载程序,在重新启动时。我需要了解它是如何工作的?
  • 我今天很糟糕。我想我要喝杯咖啡了。

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


【解决方案1】:

当使用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 平台上单独实现 - 据我所知,大多数(如果不是全部)这些实现忽略传递的命令,至少在上游内核中.这可能不是您要寻找的机器人。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,我在想一些类似的事情。查看man 2 reboot (linux.die.net/man/2/reboot) 似乎“使用命令重启”模式是标准的 linux 选项 (LINUX_REBOOT_CMD_RESTART2)。因此,它似乎不是特定于 Android 的。
      【解决方案4】:

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

      【讨论】:

      • 它确实是非常特定于硬件的。在某些 Android 设备上,应用程序处理器甚至不会自行重置,而是要求无线电协处理器重置它,它可能(?)然后通知启动它应该处于什么模式。
      猜你喜欢
      • 2016-07-05
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      相关资源
      最近更新 更多