当前位置: 首页 > news >正文

【AUTOSAR OS】 保护功能解析:从原理到应用与源代码解析(下篇)

在这里插入图片描述
本文是AUTOSAR OS 保护功能解析:从原理到应用与源代码解析的下篇,主要从具体的实现来看上篇中的主要技术内容的具体实现,从代码角度来理解主要的概念。以下是对代码主要在文件 Os_Sprot.c 中:

一、总体功能概述

Os_Sprot.c是 AUTOSAR Classic Platform(CP) 中操作系统(OS)的安全保护模块实现,主要负责:

  1. 可信函数调用管理(Trusted Function Call):
    实现跨应用(OS-Application)的可信服务调用,确保调用过程的安全性和时序正确性。
  2. 服务保护机制(Service Protection):
    验证服务调用的上下文合法性、内存地址可写性,防止非法访问和中断嵌套。
  3. 任务与中断的时序保护(Timing Protection):
    监控任务和中断的执行时间,确保不超出预设的时间边界,符合AUTOSAR的时序保护规范。

二、重要函数详细说明

1. Os_InitTrustedFunction()
  • 功能:初始化可信函数调用模块,配置多核系统中的可信服务队列和核心参数。
  • 关键逻辑
    • 根据当前核心ID(vCoreId)获取配置的可信服务最大数量(Os_CfgTrustedServiceMax_Inf)。
    • 初始化可信函数嵌套队列(Os_TrustedFuncNestQueue),填充无效应用ID(INVALID_OSAPPLICATION)。
  • 代码片段
    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_SERVICEIDE_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),检查中断禁用计数(taskDisableAllCountisrC2DisableAllCount)和挂起计数。
    • 返回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),获取对应栈空间范围(stackTopstackBottom)。
    • 调用Os_CheckTaskMemoryAccessOs_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的层级隔离规范。

三、代码关键特性与规范遵循

  1. 多核支持

    • 通过Os_SCB.sysCoreOs_GetObjCoreId确保跨核心调用被禁止,符合AUTOSAR CP的核心隔离要求。
    • 可信服务配置按核心拆分(Os_CfgTrustedServiceMax_Inf[vCoreId]),支持多核系统的分布式部署。
  2. 时序保护集成

    • CallTrustedFunction中通过Os_TrustedFuncTporFlag触发时序保护钩子,结合Os_TmProtTaskEnd实现任务执行时间监控。
    • 嵌套队列(Os_TrustedFuncNestQueue)用于跟踪调用链,确保多层调用的时序一致性。
  3. 内存保护与错误处理

    • 硬件级内存访问检查(Os_CheckTaskMemoryAccess)与软件栈范围验证结合,防止非法内存操作。
    • 全面的错误码体系(如E_OS_ILLEGAL_ADDRESSE_OS_DISABLEDINT)和钩子函数(Os_ErrorHook)支持故障诊断和追溯。
  4. MISRA合规性

    • 代码通过PRQA静态分析工具检查,遵循MISRA C规范(如PRQA S 3469禁止未检查的强制类型转换)。
    • 使用OS_ARCH_ENTRY_CRITICAL()等宏实现平台无关的临界区保护,确保可移植性。

四、总结

Os_Sprot.c 是AUTOSAR CP操作系统中安全保护模块的核心实现,通过可信函数调用管理、上下文验证、内存保护和时序监控,确保系统在多核环境下的确定性和安全性。其设计严格遵循AUTOSAR规范,通过分层验证和硬件级检查,为汽车电子中的安全关键型应用(如制动系统、动力控制)提供了可靠的底层保障。

相关文章:

  • SSE vs WebSocket:两种通讯方案该如何选择?
  • Python学习(3) ----- Python的函数定义及其使用
  • 去除ai写作痕迹的软件有哪些
  • 打卡第31天:模块和库的导入
  • 生成式引擎的认知霸权:为什么传统内容失效?
  • 【超详细教程】零基础本地部署DeepSeek-Coder-v2 16B!Ollama+GPU加速,100%跑通!
  • 政策支持下的PLM国产化浪潮:国产PLM的最新应用、前沿技术、反超路径
  • 02-BTC-密码学原理 对hash算法如果出现漏洞的思考
  • Linux线程机制揭秘:从内核实现到用户态编程(二)
  • ROC和生存曲线的绘制-spss
  • C语言中:递归问题的深入研究
  • 华南会议|AI驱动仿真未来 2025 Altair区域技术交流会华南站,报名开启!
  • C 语言学习笔记(结构体2)
  • 相机Camera日志分析之二十二:高通相机Camx 基于预览1帧的ConfigureStreams重要完整日志
  • libevent的粘包笔记
  • Python编程6——面向对象编程1
  • Java基础 Day23
  • 宏的高级应用 ——一种 C 语言的元编程技巧(X-Macro)
  • ArgoDB表类型及常用命令
  • Cancer Cell|从临床病例到AI空间组学 | 空间生物标志物如何精准预测HER2阳性乳腺癌ADC疗效?
  • 发布自己的做家教的网站/seo整站优化一年价格多少
  • wordpress子站点404/神马推广
  • 吉林省长春市长春网站建设哪家好/优化大师
  • js动效网站/seo研究所
  • 什么是企业年金/seo技术交流
  • 企业网站建设定制网站建设公司/郑州网络推广哪家口碑好