我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。
老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:
一直无法对人撒娇的孩子,多数都会成长为过分认真的大人,认为唯有处处认真,他人才可能喜欢自己,这些过于认真的成年人,即使有时想要撒娇,也没办法表现出来,他们往往是客客气气,对人敬而远之。
本文主要分享关于车载操作系统中关键技术——车载软件的核心:操作系统关键技术健康监控解析。
健康监控
在汽车安全车控和智能驾驶应用领域,操作系统内核除了要满足应用的实时性和确定性要求外,功能安全的保证也同等重要的。由于操作系统内核是由软件代码组成,从软件工程的角度来看,缺陷几乎是不可避免的,而这些缺陷在某些特定条件下有可能会引发功能安全故障。因此,为了及时在系统运行过程中发现这些故障,并及时处理以防止故障的扩散,避免引发功能安全事故,采取健康监控是一种必要的解决方案。
健康监控系统用于监视硬件、应用程序和操作系统的状态。当发现故障时,需进行记录故障、识别故障等级、按故障等级进行不同的故障处理分派、提供防止故障蔓延的处置手段的操作。在安全可靠性要求极高的飞行器航空电子领域中,健康监控功能已经成为飞行器安全的重要保障机制。国际航空电子标准中定义的系统层次的健康监控中,将单一 CPU 内的健康监控体系分为三层故障处理级别。与之类似,汽车电子系统虽然没有统一的故障处理级别标准,但也可以参考航空电子标准中的健康监控机制,例如可将故障级别划分为分区级、管理级和核心级三个等级,并可对不同级别的故障设置不同的处理策略。
分区级、管理级和核心级处理的异常是对应ECU核心处理件CPU硬件可捕获的异常。当产生CPU异常时,操作系统底层硬件抽象层的异常处理程序首先会根据异常产生的位置来判定异常处理级别,然后健康监控系统根据异常级别做相应处理。CPU异常处理级别的确定方式如下所述:
1、如果 CPU 异常产生的位置是在操作系统内核态,则该异常属于核心级异常; 2、如果 CPU 异常产生的位置是用户态,则进行以下判断:
-> 如果用户分区产生的异常不是二次异常(用户分区触发异常的处理过程中再次触发的异常被认定为二次异常),则作为分区级异常;
-> 如果用户分区产生的异常是二次异常,且此用户分区的管理分区不是自身,则作为管理级异常;
-> 如果产生二次异常的用户分区对应的管理分区处于休眠态,那么该异常升级为核心级异常。
针对分区级、管理级和核心级的异常,其健康监控处理方式如下描述:
1、分区级
主要处理用户分区运行过程中用户态产生的一些异常,如:进程自身报错、被零除、内存保护、非法系统调用等。分区级异常由用户安装的用户分区异常处理程序处理。
2、管理级
每个用户分区可以配置一个管理分区,用来帮助被管理用户分区处理自身无法处理的异常。被升级到管理分区处理的异常称为管理级异常,如用户分区产生的二次异常。
当用户分区产生的异常升级为管理级时,健康监控就会对产生异常的用户分区进行默认处理(如挂起)及后续一系列预设的异常处理。
3、核心级
主要处理内核态程序运行过程中产生的一些异常和管理分区无法处理的被管理用户分区产生的异常,如:内核态程序产生了非法指令;管理分区是自身的用户分区产生的二次异常。内核态程序运行过程中产生的异常需要执行健康监控中的内核默认异常处理,如记录异常上下文信息,停止整个系统,防止故障的蔓延。
整个健康监控系统的故障分派及处理的架构如图所示,其核心是由操作系统内核所维护的系统健康监控表,该表由系统集成者进行静态配置,作为系统逻辑配置的一部分。当处理器或操作系统内核检测到一个故障时,在系统健康监控表中通过系统状态和故障类型,获取事先定义的故障处理级别。
系统健康监控表根据错误代码和注入时的系统状态指定故障的分派级别(分区级、管理级或核心级)。系统健康监控表是作为健康监控总体故障处理派发的一级表,当故障处理进入对应故障级别的处理流程后,根据各自故障级别的健康监控表(分区健康监控表、管理健康监控表、核心健康监控表)中对应的故障类型调用相应的处理程序(系统默认处理或用户自定义处理)。
分享完毕!
愿你我相信时间的力量,
做一个长期主义者!