看门狗

Posted by Underdog Linux on October 17, 2023

QNX hypervisors 提供虚拟看门狗设备,您可以在虚拟机中使用,就像在非hypervisors 系统中使用主板上的硬件看门狗一样。

您有责任确定如何最好地为hypervisor 主机和guest使用硬件和软件看门狗。这在安全相关系统中尤为重要。 请参阅 《QNX Hypervisor for Safety 2.2》 和 《QNX OS for Safety 2.2.1 Safety Manuals》,了解有关看门狗的安全要求和建议。 如果您需要有关如何实施看门狗的建议,请联系您的 QNX representative

Hypervisor host中的看门狗

QNX Hypervisor for Safety 为看门狗提供与 QNX OS for Safety 微内核相同的支持,后者是其超集。 如果存在硬件看门狗,则可以使用特定于主板的实用程序将其启动,并使用高可用性管理器 (HAM:High Availability Manager) 或系统启动和监视器 (SLM:System Launch and Monitor) 服务在看门狗检测到主机行为异常时管理主机。(参考QNX Neutrino Utilities Reference中的hamslm)。

要了解有关看门狗的更多信息,请参阅 OS Core Components documentation; 要了解有关主板特定看门狗kicker 实用程序的更多信息,请参阅 BSP User's Guide

guest中的看门狗

使用 QNX hypervisors 实施的看门狗 vdev 模拟虚拟机中的硬件看门狗。 在guest中运行的看门狗kicker实用程序启用其虚拟硬件看门狗,然后以特定的时间间隔写入由看门狗 vdev 监控的guest物理寄存器,以通知看门狗guest正在运行(它“kicks”看门狗)。

如果看门狗kicker 未能在要求的延迟内写入寄存器,则看门狗 vdev 可以触发适当的操作,例如强制 qvm 进程实例退出。这种后续操作的触发称为看门狗bite

由于 qvm 进程是 QNX 中微子进程,因此您可以像捕获任何操作系统进程一样捕获其退出代码。 如果要为guest实施看门狗服务,则应将hypervisor 主机配置为捕获 qvm 进程退出代码,以便您可以决定在 qvm 进程实例意外终止时希望主机执行的操作。(参考Monitoring and Troubleshooting章节的qvm exit codes)。 这些操作的范围可以从简单地记录错误并等待用户干预,到使用 HAM 尝试重新启动 qvm 进程及其guest操作系统。

有关如何使guest在看门狗bite时dump的信息,参考Monitoring and Troubleshooting章节的Getting a guest dump

当看门狗 vdev 有序终止 qvm 进程实例时,此终止也必然会阻止guest执行。从guest的角度来看,这不是有序终止。

在guest中实现看门狗

要在 QNX hypervisor 虚拟机中运行的 QNX guest中实施看门狗服务,需要:

  • 在将托管guest 的 VM 的配置中包含相应的watchdog vdev(用于 ARM 的 wdt-sp805 或用于 x86 的 wdt-ib700) (参考Virtual Device Reference章节中的vdev wdt-sp805vdev wdt-ib700)。
  • 在guest中实现看门狗kicker,并将其配置为踢看门狗 vdev(对于 QNX guests,BSP 中提供了kicker, 参考QNX guest watchdog kicker (wdtkick)
  • 对于 Linux 和 Android guest,参考Implementing a watchdog in a Linux or Android guest
  • 使用主机中的 HAM 和/或 SLM 实用程序在watchdog 检测到guest行为异常并且其托管 qvm 进程实例已退出时管理 qvm 进程。 例如,SLM 可以使用退出之前具有的相同 VM 配置重新启动 qvm 进程实例(参考QNX Neutrino Utilities Reference中的hamslm

看门狗 vdev 模拟硬件看门狗提供的功能子集。有关硬件监视器的信息,请参阅芯片文档(例如,ARM 文档中心的 SP805 文档)。

启动和停止看门狗及其 kickers

QNX hypervisor BSP 包含用于启动和停止 QNX guest中的看门狗的脚本。这些位于 BSP 的脚本目录中:

  • watchdog-start.sh 在虚拟机(qvm 进程实例)中启用watchdog vdev,并在guest中以守护程序模式启动kicker 实用程序 (wdtkick)。
  • watchdog-stop.sh 禁用guest中的watchdog kicker vdev,然后立即将所需的值写入guest物理寄存器,以在 VM 注意到kicker 已停止之前停止 VM 中的watchdog vdev。

要启动或停止 QNX guest中的 watchdog vdev 和 kicker,请根据需要运行 watchdog-start.sh 或 watchdog-stop.sh。

QNX guest watchdog kicker (wdtkick)

wdtkick watchdog kicker是针对 QNX guest的主板特定的(参考QNX Neutrino Utilities Reference中的wdtkick)。 它在支持的板的 BSP 中提供。 对于 QNX hypervisor ,它包含在 src/hardware/support/wdtkick 的 QNX guest BSP 中。

hypervisor 提供的 QNX guest构建文件包括带有 wdtkick 配置的注释部分。 要使用这些实用程序,您可以取消注释这些文件并重建您的guest。

作为参考,下面是 ARM 和 x86 guest 虚拟机的 wdtkick 配置示例。

wdtkick in an ARM guest (SP805 emulation)

每隔1s喂狗一次,将超时时间设置为3s。 这实际上相当于6s,因为ARM平台上的计时器会倒计时俩次,并且仅在第二次计时器到期时才会断言重置。

wdtkick -v -a 0x1C0F0000 -t 1000 -E 8:3 -W 0:0x47868C0
  • -v sets the verbosity
  • -a 0x1C0F0000 设置看门狗将在guest-physical中使用的基址
  • -t 1000 设置喂狗时间,单位ms
  • -E 8:3 设置在看门狗寄存器 (8) 中写入的偏移量以启用定时器,以及写入时使用的掩码
  • -W 0:0x47868C0 设置要写入看门狗寄存器的偏移量 (0) 以及要写入其中的值(0x47868C0,指定 25 MHz 时为 3 秒)

有关如何配置看门狗和看门狗启动器的更多信息,请参阅 SP805 规格和 board manufacturer’s documentation

wdtkick in an x86 guest (IB700 emulation)

喂狗时间设置为5s,超时时间设置为10s

wdtkick -v -a 0x441 -t 5000 -w 8 -W 2:0xA
  • -v sets the verbosity
  • -a 0x441 设置看门狗将在guest-physical中使用的基址
  • -t 5000 设置喂狗时间,单位ms
  • -w 将看门狗写入寄存器的宽度设置为八 (8) 位
  • -W 2:0xA 将值0xA(指定为10s)设置到看门狗寄存器2

有关如何配置看门狗和看门狗kicker的更多信息,请参阅 IB700 规格和board manufacturer’s documentation

Watchdog kicker configuration

您可以在启动时通过命令行输入看门狗kicker配置,也可以修改guest启动以将其存储在guest系统页面的 hwinfo 部分中(参考Building Embedded SystemsSystem Page章节)。

有关特定于板的看门狗kicker 实用程序的最新信息,请参阅 BSP 中包含的 wdtkick.use 文件。

关于 watchdog vdevs的信息,参考Virtual Device Reference章节的vdev wdt-sp805(ARM)和 vdev wdt-ib700(X86)。

在Liunx / Android guest中实现 watchdog

如果您想在 Linux 或 Android guest中使用看门狗,则必须执行以下操作:

  1. 启用看门狗模块 - Linux 或 Android 内核必须包含适合您的目标(IB700 或 SP805)的正确看门狗内核模块。 在大多数 Linux 和 Android 发行版中,默认情况下不启用此模块。 有关如何在启用看门狗模块的情况下重建 Linux 内核的详细信息,请参阅 menuconfig和 Linux 内核配置文档的“Device Drivers”部分。
  2. 实现 Linux 或 Android 应用程序或 shell 脚本来控制看门狗。 有关如何控制 Linux 看门狗的文档可在互联网上公开获取。 一个有用的例子可以在以下位置找到:https://www.kernel.org/doc/Documentation/watchdog/watchdog-api.txt