【AUTOSAR OS】 保护功能解析:从原理到应用与源代码解析(下篇)
本文是AUTOSAR OS 保护功能解析:从原理到应用与源代码解析的下篇,主要从具体的实现来看上篇中的主要技术内容的具体实现,从代码角度来理解主要的概念。以下是对代码主要在文件 Os_Sprot.c 中:
一、总体功能概述
Os_Sprot.c是 AUTOSAR Classic Platform(CP) 中操作系统(OS)的安全保护模块实现,主要负责:
- 可信函数调用管理(Trusted Function Call):
实现跨应用(OS-Application)的可信服务调用,确保调用过程的安全性和时序正确性。 - 服务保护机制(Service Protection):
验证服务调用的上下文合法性、内存地址可写性,防止非法访问和中断嵌套。 - 任务与中断的时序保护(Timing Protection):
监控任务和中断的执行时间,确保不超出预设的时间边界,符合AUTOSAR的时序保护规范。
二、重要函数详细说明
1. Os_InitTrustedFunction()
- 功能:初始化可信函数调用模块,配置多核系统中的可信服务队列和核心参数。
- 关键逻辑:
- 根据当前核心ID(
vCoreId
)获取配置的可信服务最大数量(Os_CfgTrustedServiceMax_Inf
)。 - 初始化可信函数嵌套队列(
Os_TrustedFuncNestQueue
),填充无效应用ID(INVALID_OSAPPLICATION
)。
- 根据当前核心ID(
- 代码片段:
FUNC(void, OS_CODE) Os_InitTrustedFunction(void) {VAR(uint8, OS_VAR) i;VAR(uint16, OS_VAR) vCoreId = Os_SCB.sysCore;// 初始化嵌套计数器和标志位Os_TrustedFuncNest = 0;Os_TrustedFuncTportDelayCall = 0;Os_TrustedFuncTporFlag = FALSE;// 多核场景下的配置if (Os_CfgTrustedServiceMax_Inf[vCoreId] > 0U) {Os_TrustedFuncNestQueue = Os_TrustedFuncNestQueue_Inf[vCoreId];Os_CfgTrustedServiceMax = Os_CfgTrustedServiceMax_Inf[vCoreId];for (i = 0u; i < Os_CfgTrustedServiceMax; i++) {Os_TrustedFuncNestQueue[i] = INVALID_OSAPPLICATION;}} }
- 应用场景:在系统初始化阶段(
Os_InitSystem
)调用,为可信函数调用建立基础环境。
2. CallTrustedFunction()
- 功能:执行可信函数调用,验证调用合法性并处理上下文切换和时序保护。
- 关键逻辑:
- 参数验证:检查函数参数指针有效性(
NULL_PTR
)、调用上下文合法性(Os_WrongContext
)、内存地址可写性(Os_AddressWritable
)。 - 多核隔离:确保可信函数调用仅在同一核心内进行,避免跨核心访问(
Os_SCB.sysCore == Os_GetObjCoreId(FunctionIndex)
)。 - 嵌套管理:使用队列(
Os_TrustedFuncNestQueue
)记录调用嵌套层次,维护当前应用ID和时序保护标志。 - 错误处理:调用失败时触发错误钩子(
Os_TraceErrorHook
),记录错误码(如E_OS_SERVICEID
、E_OS_ACCESS
)。
- 参数验证:检查函数参数指针有效性(
- 代码片段:
FUNC(StatusType, OS_CODE) CallTrustedFunction(...) {OS_ENTER_KERNEL();// 验证参数指针(扩展状态模式)#if (OS_STATUS_EXTENDED == CFG_STATUS)if (NULL_PTR == FunctionParams) { err = E_OS_PARAM_POINTER; }#endif// 验证调用上下文和内存地址#if (TRUE == CFG_SERVICE_PROTECTION_ENABLE)if (!Os_WrongContext(OS_CONTEXT_CALL_TRUSTED_FUNCTION) || !Os_AddressWritable(...)) {err = E_OS_CALLEVEL / E_OS_ILLEGAL_ADDRESS;}#endif// 多核场景下的核心一致性检查#if (OS_AUTOSAR_CORES > 1)if (Os_SCB.sysCore != Os_GetObjCoreId(FunctionIndex)) { err = E_OS_ACCESS; }#endif// 嵌套队列操作和函数调用Os_TrustedFuncNestQueue[Os_TrustedFuncNest] = (0x0F00u & FunctionIndex) >> 8u;(*(Os_TrustedServiceList[FunctionIndex]))(FunctionIndex, FunctionParams);// 时序保护钩子触发if (Os_TrustedFuncTporFlag && !Os_TrustedFuncTportDelayCall) {(void)Os_CallProtectionHook(E_OS_PROTECTION_ARRIVAL, OS_TMPROT_HOOK_TASK);}OS_EXIT_KERNEL();return err; }
- 应用场景:跨应用服务调用(如安全关键型任务间通信),确保调用过程的确定性和安全性。
3. Os_IgnoreService()
- 功能:判断是否忽略当前服务调用(如中断禁用时),确保系统在异常上下文中不执行敏感操作。
- 关键逻辑:
- 根据当前系统层级(任务层
OS_LEVEL_TASK
或中断层OS_LEVEL_ISR2
),检查中断禁用计数(taskDisableAllCount
、isrC2DisableAllCount
)和挂起计数。 - 返回
FALSE
时表示服务应被忽略(如中断被禁用时禁止任务调度)。
- 根据当前系统层级(任务层
- 代码片段:
FUNC(boolean, OS_CODE) Os_IgnoreService(void) {boolean status = TRUE;if (OS_LEVEL_TASK == Os_SCB.sysOsLevel) {if (Os_SCB.sysRunningTCB->taskDisableAllCount > 0u || ...) {status = FALSE; // 忽略服务}} else if (OS_LEVEL_ISR2 == Os_SCB.sysOsLevel) {if (Os_ICB[...].isrC2DisableAllCount > 0u || ...) {status = FALSE;}}return status; }
- 应用场景:在调用敏感服务(如获取报警)前调用,避免在中断禁用时执行不安全操作。
4. Os_AddressWritable()
- 功能:验证内存地址是否可被当前任务/中断写入,防止越界访问。
- 关键逻辑:
- 根据对象类型(任务
OBJECT_TASK
或中断OBJECT_ISR
),获取对应栈空间范围(stackTop
、stackBottom
)。 - 调用
Os_CheckTaskMemoryAccess
或Os_CheckISRMemoryAccess
进行硬件级内存访问检查(如MMU权限)。
- 根据对象类型(任务
- 代码片段:
FUNC(boolean, OS_CODE) Os_AddressWritable(uint32 Address) {if (OBJECT_TASK == ObjType) {if (Address在任务栈范围内) {Access = OSMEMORY_SET_WRITEABLE(Access); // 栈空间默认可写} else {Access = Os_CheckTaskMemoryAccess(...); // 调用硬件检查}} else if (OBJECT_ISR == ObjType) { /* 类似中断栈检查 */ }return (0U != OSMEMORY_IS_WRITEABLE(Access)); }
- 应用场景:在可信函数调用或数据传输前验证目标地址合法性,防止缓冲区溢出。
5. Os_WrongContext()
- 功能:检查当前调用上下文是否允许执行目标服务(如任务层禁止调用中断专属服务)。
- 关键逻辑:
- 将当前系统层级(
Os_SCB.sysOsLevel
)映射为位掩码(Os_LevelBit
),与允许的上下文掩码(AllowedContext
)进行按位与运算。 - 返回
FALSE
表示上下文错误(如在中断中调用任务级服务)。
- 将当前系统层级(
- 代码片段:
FUNC(boolean, OS_CODE) Os_WrongContext(uint16 AllowedContext) {uint16 Os_LevelBit;switch (Os_SCB.sysOsLevel) { /* 映射层级到位掩码 */ }if ((Os_LevelBit & AllowedContext) == 0U) { return FALSE; } // 上下文不匹配return TRUE; }
- 应用场景:所有服务调用的前置检查,确保符合AUTOSAR的层级隔离规范。
三、代码关键特性与规范遵循
-
多核支持:
- 通过
Os_SCB.sysCore
和Os_GetObjCoreId
确保跨核心调用被禁止,符合AUTOSAR CP的核心隔离要求。 - 可信服务配置按核心拆分(
Os_CfgTrustedServiceMax_Inf[vCoreId]
),支持多核系统的分布式部署。
- 通过
-
时序保护集成:
- 在
CallTrustedFunction
中通过Os_TrustedFuncTporFlag
触发时序保护钩子,结合Os_TmProtTaskEnd
实现任务执行时间监控。 - 嵌套队列(
Os_TrustedFuncNestQueue
)用于跟踪调用链,确保多层调用的时序一致性。
- 在
-
内存保护与错误处理:
- 硬件级内存访问检查(
Os_CheckTaskMemoryAccess
)与软件栈范围验证结合,防止非法内存操作。 - 全面的错误码体系(如
E_OS_ILLEGAL_ADDRESS
、E_OS_DISABLEDINT
)和钩子函数(Os_ErrorHook
)支持故障诊断和追溯。
- 硬件级内存访问检查(
-
MISRA合规性:
- 代码通过
PRQA
静态分析工具检查,遵循MISRA C规范(如PRQA S 3469
禁止未检查的强制类型转换)。 - 使用
OS_ARCH_ENTRY_CRITICAL()
等宏实现平台无关的临界区保护,确保可移植性。
- 代码通过
四、总结
Os_Sprot.c 是AUTOSAR CP操作系统中安全保护模块的核心实现,通过可信函数调用管理、上下文验证、内存保护和时序监控,确保系统在多核环境下的确定性和安全性。其设计严格遵循AUTOSAR规范,通过分层验证和硬件级检查,为汽车电子中的安全关键型应用(如制动系统、动力控制)提供了可靠的底层保障。