Matrix653 实现

更新时间:
2024-02-26
下载文档

Matrix653 实现

本节介绍 Matrix653 分时分区操作系统中健康监控的实现原理。

健康监控简介

健康监控用于监视硬件、操作系统和应用软件的状态。当发生故障时,记录故障、隔离故障并且按照故障级别(模块级、分区级和进程级)执行相应的恢复动作进行必要的恢复。在核心模块初始化期间,Matrix653 的健康监控对配置表的完整性和连续性进行验证。在分区初始化期间,健康监控处理软件和软件、软件和硬件之间的不匹配错误。

  • 应用分区:通过 HM 服务调用将错误数据传递给操作系统;
  • 操作系统:所有的 HM 错误都将通过操作系统内核执行配置表预定义处理;
  • 系统分区:自定义错误处理使用系统分区来进行错误响应。

健康监控作用

健康监控模块负责响应和报告硬件、应用和操作系统的错误和故障。其有助于隔离错误,并且防止故障传播,其在操作系统内核中实现,来监控应用程序、分区以及模块中发生的各种错误。

健康监控由操作系统的内核实现,向上层用户态、下层硬件提供健康监控功能来获取以及处理发生的错误,其在系统中位置如下图所示:

健康监控决策逻辑

Matrix653 操作系统基于 HM 决策逻辑和 HM 配置表来评估错误。如若 HM 决策逻辑确定此错误已作为进程级别的错误分配给了此分区,并且该分区存在进程级别错误处理程序,操作系统就会激活错误处理程序进行处理。

当操作系统检测到或者应用错误报告一个错误,内核中的健康监控程序会做三次判断来区分出不同的错误等级,并进行不同的恢复操作。首先判断错误是否发生在分区上下文中,若不是则该错误判定为模块级错误,就去执行模块健康监控表中与之对应的恢复操作;若发生在分区上下文中,则获得本分区对应的多分区共用健康监控表,继而查找错误在多分区共用健康监控表;若该错误为模块级错误,则执行多分区共用健康监控表中与之对应的恢复操作,若为分区级错误,则要查找错误在分区内健康监控表中对应的等级;若等级为分区级、处理线程不存在或者是有处理线程引发的错误,则判定为分区级错误,若等级为进程级且处理线程存在且不是有处理线程引发,即为进程级错误,激活分区中的错误处理线程处理。健康监控的决策逻辑如下图所示:

健康监控表

为满足不同开发者的需求,RealEvo-Matrix653 组件提供了灵活的配置与编译过程, 开发者可通过 Matrix653 Integrator 工程提供的 “integrator.xml” 配置文件对 Matrix653 操作系统的健康监控进行参数配置,且通过 RealEvo-IDE 进行工程编译。

RealEvo-Matrix653 组件中的 Matrix653 Integrator 工程提供了基础参数配置模板以及 XML 配置工具 “Matrix653 Smart Editor”,基础参数配置模板包含了 Matrix653 操作系统模块的主要组件的配置和构建以及最常用的可选特性。开发者可以直接通过修改模板配置自行对健康监控进行自定义配置。XML 配置的具体操作如下图:

需要配置的 XML 文件,右键选择 “Open With” 中的 “Matrix653 Smart Editor” 工具打开 XML 配置文件。

1. 系统错误ID及定义

系统错误(SysErrors)ID 以及错误描述为系统内部定义,用户不可修改;用户可以通过 Module -> HealthMonitoring -> SystemErrors 看到其详细定义,对应 ID 及其描述如下表所示。

ErrorldentifierDescription描述
1configuration error配置错误
2module config error模块配置错误
3partition config error分区配置错误
4partition init error分区初始化错误
5segmentation error段错误
6time duration exceeded时间超时
7invalid OS call无效的操作系统调用
8divide by 0除 0 错误
9floating point error浮点错误
10supervisor priv. Violation特权违反
11power interrupt电源中断
12power failure掉电
13application raise error应用程序 raise 的错误
14alignment error非对齐错误
15illegal instruction error不合法指令错误
16fpu unavailable errorFPU 不可用错误
17fpu assist errorFPU ASSIST 错误
18altivec unavailable errorALTIVEC 不可用错误
19altivec assist errorALTIVEC ASSIST 错误
20unknown error未知错误
21serror errorserror 错误
22machine check exception机器检查异常
23performance monitor性能监视器
24system management interrupt系统管理中断

2. 分区健康监控表

分区健康监控表用来对于分区内的故障进行恢复动作设置,其中的错误等级分为分区(Partition)级和进程(Process)级。

  • 当错误为分区级时,可以进行 IGNORE、IDLE、WARM_RESTART 以及 COLD_RESTART 恢复动作。
  • 当错误为进程级时,将会返回用户自己设置的错误码,系统会调用用户创建的错误处理进程进行处理。

可在 XML 工具界面选择 Module → HealthMonitoring → PartitionHM 进行详细参数配置。分区健康监控表如下图所示:

如图所示,点击 “Add” 按钮可增加一条分区健康监控表错误动作配置,红色表示必填选项选中一条配置可点击 “Remove” 按钮删除或者点击 “Modify” 按钮进行修改。

分区健康监控表具体参数(可设置多个分区健康监控表):

  • MultiPartitionHMTableNameRef:采用的多分区健康监控表名称,可修改,需与 MultiPartitionHM 的 TableName 对应;
  • TableIdentifier:多分区健康监控表 ID,唯一标识,10 进制数字或 0x 开头的 16 进制数字;
  • TableName:分区健康监控表名称;
  • ErrorAction:错误动作(可以设置多个错误动作)
  • ErrorIdentifierRef:错误号 ID,只能引用存在的系统错误ID;
  • ErrorLevel:错误等级,分为 Process(进程)级、Partition(分区)级;
  • ErrorCode:错误码,当 ErrorLevel 为 Partition(分区)级,则无此项设置;
  • PartitionRecoveryAction:分区恢复动作,当 ErrorLevel 为 Partition 级时,分区恢复动作可设置为 IGNORE、IDLE、WARM_RESTAR 以及 COLD_RESTART, 当 ErrorLevel 为 Process(进程)级,用户可自定义错误描述。

3. 多分区健康监控表

多分区健康监控表用来对于分区出现错误时进行恢复动作设置,错误等级分为模块(Module)级和分区(Partition)级。

  • 当错误为 Module 级时,设置对应的 Module 级别的恢复动作。
  • 当错误为 Partition 级时,系统会继续查询分区健康监控表进行对应的操作。

进行参数配置可在 XML 工具界面选择 Module → HealthMonitoring → MultiPartitionHM 进行详细参数配置。多分区健康监控表如下图所示:

如图所示,点击 “Add” 按钮可增加一条分区健康监控表错误动作配置,红色表示必填选项选中一条配置可点击 “Remove” 按钮删除或者点击 “Modify” 按钮进行修改。

多分区健康监控表具体参数介绍:

  • TableIdentifier:多分区健康监控表 ID,唯一标识;
  • TableName:多分区健康监控表名称,可修改,需与 PartitionHM(分区健康监控表)的 MultiPartitionHMTableNameRef 对应;
  • ErrorAction:错误动作(可以设置多个错误动作);
  • ErrorIdentifierRef:错误号 ID,只能引用存在的系统错误 ID;
  • ErrorLevel:错误等级,分为 Module(模块)级、Partition(分区)级;
  • ModuleRecoveryAction:模块恢复动作,当错误等级为模块级时设置为 IGNORE、SHUTDOWN 以及 RESET,为分区级时,此项不设置。

4. 模块健康监控表

模块健康监控表(ModuleHM)用来配置对于模块级别的故障进行的响应操作,模块内的错误分为分区级和模块级。

当内核发现错误或者应用分区报告错误时,首先判断是否在分区上下文发生的该错误,若是,该错误则为模块级错误,执行模块健康监控表中与之对应的恢复操作,用户可以根据自己的需求选择需要响应的系统错误,并设置相应的模块级恢复动作(IGNORE、SHUTDOWN 及 RESET)。

进行参数配置可在XML工具界面选择 Module → HealthMonitoring → ModuleHM 进行详细参数配置。模块健康监控表如下图所示:

模块健康监控表具体参数如下:

  • StateIdentifier:模块健康监控表 ID,唯一标识;
  • Description:模块健康监控表描述;
  • ErrorAction:错误动作(可以设置多个错误动作)
  • ErrorIdentifierRef:系统错误号 ID,只能引用存在的系统错误 ID,点击选择框即可选择;
  • ModuleRecoveryAction:模块恢复动作,可设置为 IGNORE、SHUTDOWN 以及 RESET。

错误级别

在模块、分区或进程级别上可能会发生错误。根据检测到的错误和系统的状态,在模块 HM、多分区 HM 和分区 HM 表中定义了错误的级别。

1. 进程级错误

进程级别错误会影响分区或整个分区中的一个或多个进程。进程级错误例子如下:

  • 由应用程序进程引发的应用程序错误
  • 进程运行错误(堆栈溢出、内存冲突等)
  • 非法的操作系统请求

2. 分区级错误

分区级错误只影响一个分区。分区级错误例子如下:

  • 分区初始化过程中出现分区配置表错误
  • 进程管理期间发生错误
  • 错误处理进程中存在错误

3. 模块级错误

模块级错误可能会影响集成模块内的所有分区。模块级错误例子如下:

  • 集成模块初始化期间的模块发生错误
  • 集成模块初始化进程中检测到一个分区的检验和错误
  • 分区切换期间出现错误等

恢复动作

恢复动作分为系统默认操作以及通过自定义错误处理程序来实现针对特定的错误情况进行想要的恢复动作。

1. 默认恢复动作

恢复操作包括模块级、分区级和进程级的操作。

所有级别的恢复操作都包括忽略错误的能力。但是,只有当错误没有使模块、分区或进程处于未定义状态时,才应该忽略它。例如,忽略内存冲突可能会使分区处于未定义状态。

恢复动作及描述如下表所示:

名称描述
IGNORE忽略错误
SHUTDOWN停止关闭分区或模块
RESET重置集成模块,重启分区(冷启动或热启动)
COLD_START冷启动,执行应用的初始化代码
WARM_START热启动,与冷启动类似,但其初始化硬件上下文时比冷启动的更加完整

(1) 进程级恢复动作

应用程序为进程级错误定义了分区的错误处理程序进程,可能的恢复操作如下:

  • 忽略,记录失败,但不采取任何措施
  • 操作恢复之前,忽略错误 n 次
  • 停止故障进程,从入口地址重新初始化它
  • 停止有故障的进程并启动另一个进程
  • 重新启动分区
  • 停止分区
  • 尝试停止并恢复故障进程

注:大多数致命异常(如内存冲突)的恢复可能不可行,因为恢复导致致命错误的错误进程将会执行导致错误的同一条指令。当存在进程级错误处理程序时,恢复操作总是在与错误进程相关联的分区的上下文中执行。HM 设计可能允许支持 Ada 异常,但 Ada 运行时系统和 HM 之间可能存在冲突。

(2) 分区级恢复动作

分区级错误恢复动作是为 HM 配置表中的分区错误指定的。对于每个分区,错误类型的响应会考虑分区行为能力(可重新设置的、不可重新设置的或降级模式的)。操作系统执行模块级错误恢复操作的上下文依赖与实现恢复操作如下:

  • 忽略(IGNORE)
  • 停止分区(IDLE)
  • 重启分区(冷启动或热启动)
  • 执行定义的恢复操作(依赖操作系统实现)

操作系统必须支持添加平台特定恢复操作的功能。

(3) 模块级恢复动作

根据系统的状态,在模块 HM 配置表中为模块错误指定恢复操作,可能的恢复操作如下:

  • 忽略(IGNORE)
  • 关闭(SHUTDOWN)、重置(RESET)集成模块
  • 执行定义的恢复操作

操作系统必须支持添加平台特定恢复操作的功能。

2. 自定义错误处理程序

错误处理程序是一个非周期性进程。它在分区窗口中运行,具有分区中所有进程中最高优先级,它可以抢占任何进程,即使对该分区禁用抢占。它没有进程 ID,不能被分区内的其他进程访问。其他进程无法暂停、停止或更改错误处理进程的优先级。 错误处理程序进程运行时发生的错误被定义为分区级错误

无论是进程级、分区级或模块级,都支持自定义对于错误的处理操作。

应用程序开发人员编写错误处理程序。它可以执行以下选择:

  • 获取有关错误的信息(GET_ERROR_STATUS)

错误状态结构体成员及描述如下表所示:

API描述
FAILED_ADDRESS故障地址
FAILED_PROCESS_ID故障进程的 ID
ERROR_CODE错误代码
LENGTH故障消息长度
MESSAGE故障消息
  • 获取有关失败进程的信息(发出 GET_PROCESS_STATUS);
  • 停止(发出 STOP)或重新启动(发出 START)失败的进程;
  • 重新启动分区(使用 WARM_START 或 COLD_START 发出SET_PARTITION_MODE);
  • 关闭分区(发出 SET_PARTITION_MODEwithIDLE);
  • 将错误升级到分区级别(发出 RAISE_APPLICATION_ERROR);
  • 使用运行状况监视器记录故障消息(REPORT_APPLICATION_MESSAGE);
  • 停止自身(STOP_SELF)。

错误处理程序进程不能执行以下操作:

  • 纠正错误。例如,它不能在溢出的情况下限制一个值;
  • 调用阻塞服务。

(1) 应用程序提供错误处理进程

应用程序调用参数为错误处理程序入口点和堆栈大小的 CREATE_ERROR_HANDLER 服务,为分区创建错误处理程序进程,将错误处理函数名和堆栈大小作为参数传给该函数即可创建。

(2) 通过 XML 文件配置注册错误处理进程

  • 实现错误处理函数

进入 bsp 工程中,/src/bsp_init.c 文件,如下图所示:

在下列代码中实现错误处理流程:

static RETURN_CODE_TYPE __mx_xxx_exception_handler (
    /*in */ MX_ERROR_ID_TYPE              error_id,
    /*in */ MX_ERROR_LEVEL_TYPE           error_level,
    /*in */ void                          *return_address,
    /*in */ MX_PROCESS_TYPE               *process,
    /*in */ MESSAGE_ADDR_TYPE             message_addr,
    /*in */ ERROR_MESSAGE_SIZE_TYPE       length,
    /*in */ void                          *extra_parameter  )
{
    mx_put_string_unsigned_dec_new_line("error_id:", error_id);
    mx_put_string_unsigned_dec_new_line("error_level:", error_level);
    mx_put_string_string_new_line("msg:", message_addr);
    mx_put_string_new_line("error_handle");
    return NO_ERROR;
}
  • 注册错误处理函数

首先将实现好的处理函数定义到板级支持包恢复动作结构体中,如下图示:

其次在相应级别的健康监控表中将错误处理程序入口地址和错误代码、级别进行绑定,如下图所示:

文档内容是否对您有所帮助?
有帮助
没帮助