当前位置: 首页 > 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规范,通过分层验证和硬件级检查,为汽车电子中的安全关键型应用(如制动系统、动力控制)提供了可靠的底层保障。

http://www.xdnf.cn/news/688699.html

相关文章:

  • 《Python+AI如何颠覆传统文书审查模式》
  • 【网络安全】——Modbus协议详解:工业通信的“通用语言”
  • JS 逆向太费劲,试试 JS 注入!
  • 服务器上用脚本跑python深度学习的注意事项(ubantu系统)
  • 【第2章 绘制】2.6 阴影
  • 基于stm32LORA无线抄表系统仿真
  • 人工智能在智能建筑中的创新应用与未来趋势
  • 将docker容器保存为镜像,让后将镜像打包保存到本地
  • WPF的基础控件:布局控件(StackPanel DockPanel)
  • React+Antd全局加载遮罩工具
  • 2. 数据结构基本概念 (2)
  • LLM 对齐新范式:深入解析 DPO (Direct Preference Optimization) 的原理与实践
  • Microsoft的在word中选择文档中的所有表格进行字体和格式的调整时的解决方案
  • 180 度 = π 弧度
  • 2025吉林ccpc【部分题解】
  • c++第三天(对象与构造函数)
  • ICDMC 2025:创新媒体模式,迎接数字时代的挑战
  • Redission学习专栏(一):快速入门及核心API实践
  • CORS跨域资源共享解析
  • 算法刷题记录:滑动窗口经典题目解析
  • 【大模型原理与技术-毛玉仁】第三章 Prompt工程
  • web-css
  • 20250528-C#知识:函数简介及函数重载
  • 外部访问可视化监控 Grafana (Windows版本)
  • 扇形 圆形 面积公式
  • 如何在WordPress中选择最佳Elementor主题:专家指南
  • 前端大文件上传-断点续传
  • 影刀RPA-17- 列表练习
  • 使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)
  • 如果是在服务器的tty2终端怎么查看登陆服务器的IP呢