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