内存保护_2:内存保护逻辑说明

上一篇 | 返回主目录 | 下一篇

3 OS配置说明

3.1 OS一些基本概念及相互关系

3.1.1 基本概念

  • SWC(软件组件:Software Compont):一个以功能或者功能集合为基础的概念,比如说开关采样、行车、泊车等,具体取决于软件上层功能划分
  • Runnable(执行实体):软件组件的重要组成,功能实现的载体,比如说一个功能需要三种周期的任务去完成不同的任务,则至少需要三个不同的Runnable
  • Task(任务):由OS直接管理调度的实体,也是软件功能组件Runnable的载体(简单来说,就是Runnbale在Task中被调用,在基础任务中,Runnable的周期取决于Task周期)
  • ISR(二类中断):与传统意义上的中断类似,不过它由OS进行管理,可调用OS的部分服务
  • Application(应用集):资源组成的功能单元,由中断、调度表、Alarm、任务等构成。这是一个资源集合的概念,在应用集之间访问存在较多限制(此处与内存保护、服务保护等概念紧密相关)

3.1.2 相互关系

3.2 内存保护基本逻辑

3.2.1 应用集的基本分类

  • 可信应用集(Trust OS-Application):无内存访问限制、操作系统API以及可不必进行时间保护,可以在特权模式运行,并且假定不会发生内存保护错误(若发生此类错误,系统将会关闭OS或者跑飞)
  • 不可信应用集(Non-Trust OS-Application):不允许在没有监控及保护的情况下运行,存在内存访问限制、OS相关API访问限制以及时间行为限制,并且不允许运行在特权模式下

3.2.2 内存保护与应用集的关系

如上一章所说,应用集为内存保护处理的分块单位(即在此应用集中的中断、任务等在没有特殊访问设置的情况下,访问权限会受到应用集类型的限制)。如下图所示,为非可信应用集的访问许可情况。
在这里插入图片描述

3.3 OS等级相关概念

SC1SC2SC3SC4
支持多核支持支持支持支持
内存保护支持支持
时间保护支持支持
调度表支持支持支持支持
OSEK OS支持支持支持支持

备注:根据表格可知需要设定为SC3才可使用内存保护功能

## 3.4 一种可用的RTA-OS配置
因以下内容与某公司软件使用方法相关,已因版权原因被下架,因此将其删除,见谅。

上一篇 | 返回主目录 | 下一篇

#实现代码涉及公司需求及设计,不方便展示

### 关于 `clmdep_asio::detail::call_stack` 报错的分析 #### 背景说明 `clmdep_asio::detail::call_stack` 是 Asio 库中的一个内部实现细节,用于跟踪当前线程上的调用栈状态。它通常被用来管理异步操作的状态以及确保某些操作的安全性。例如,在多线程环境中,Asio 的 `strand` 提供了一种机制来序列化访问共享资源的操作。 从提供的引用来看,问题可能涉及以下几个方面: 1. **`io_context_impl` 类型定义** 如果编译器选择了基于 IOCP(Windows I/O Completion Port)的实现,则会使用 `win_iocp_io_context` 作为底层实现[^1]。这表明程序运行在 Windows 平台上,并依赖于完成端口模型来进行高效的异步 I/O 处理。 2. **`strand::post()` 方法的行为** 当通过 `strand::post()` 发送任务时,实际的任务会被传递给服务对象并排队执行[^2]。需要注意的是,这里的分配器参数 `(void)a;` 表明其作用可能是为了兼容 STL 容器或其他内存管理工具,但实际上并未真正利用到该参数。 3. **模拟 I/O 事件与实际处理逻辑** 使用 `PostQueuedCompletionStatus` 函数可以手动触发完成端口的通知机制[^3]。这意味着即使没有真实的硬件中断发生,也可以人为制造出类似于设备完成工作的效果。这种技术常用于单元测试或者调试目的。 4. **Strand 的典型应用场景** Strands 可以帮助保护共享数据免受并发修改的影响。通过将多个异步操作绑定到同一个 strand 上,能够保证这些操作按照一定的顺序依次被执行而不是同时竞争锁资源[^4]。 5. **潜在错误来源——非法地址访问** 堆栈信息指出最终崩溃的原因是因为尝试访问了一个无效的内存位置[^5]。进一步推测可知,这种情况很可能发生在某个未初始化的对象身上或者是由于释放后的指针再次被引用所引起。 --- #### 解决方案建议 针对上述背景描述,以下是几种可能解决问题的方法及其原理解释: ##### 方法一:验证 Strand 配置是否正确 确认创建 `boost::asio::io_service::strand` 实例时传入的有效性。如果 io_service 对象本身已经销毁或处于不可用状态,则任何对其关联 strands 的操作都可能导致未定义行为。 ```cpp // 正确做法 boost::asio::io_service io; auto strand = boost::make_shared<boost::asio::io_service::strand>(&io); timer.async_wait([=](const boost::system::error_code& ec){ /*...*/ }); ``` ##### 方法二:检查回调函数上下文中是否存在越界风险 仔细审查所有涉及到动态数组、字符串或者其他容器类型的数据结构操作部分。特别留意那些可能会超出范围索引的情况。 ```cpp std::vector<int> vec{1, 2}; try { int value = vec.at(10); // 这里会产生 out_of_range exception } catch(const std::out_of_range& e){ std::cerr << "Error: " << e.what() << '\n'; } ``` ##### 方法三:排查是否有悬垂指针现象存在 一旦某块内存区域被删除之后再继续对其进行读写就会引发严重的后果。因此务必保持良好的生命周期管理习惯。 ```cpp class MyClass {}; MyClass* ptr = new MyClass(); delete ptr; // 下面这段代码会造成 undefined behavior (*ptr).someMethod(); ``` ##### 方法四:启用更严格的编译选项以便尽早发现问题 现代 C++ 编译器提供了丰富的诊断功能可以帮助开发者发现隐藏缺陷。比如 GCC/Clang 中可以通过 `-Wall -Wextra -pedantic-errors` 参数开启全面警告模式;而在 MSVC 则对应 `/W4 /WX` 开关组合形式。 --- ### 结论总结 综上所述,此次 clmdep_asio::detail::call_stack 报错的根本原因极有可能源于以下几点之一: - 错误配置了 strand 导致后续一系列连锁反应; - 存在于业务逻辑里的边界条件判断失误从而间接影响到底层框架表现; - 或者干脆就是简单的野指针滥用案例而已。 无论如何都需要逐一排除以上可能性直至找到确切答案为止!
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值