reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
# OSE / OSEck:信号模型 / hunt·attach / 池的所有权 / 异构边界
<CORE RULE>
三条件同时成立才能读对 OSE:
```
① 一切通信都是【信号】(消息),信号可以跨 core / CPU / DSP / 节点
② 【信号号不是资源的唯一标识】——必须配合次级 id 才能路由
③ 内存有【域/块/池】的所有权规则——谁能访问、谁能在哪里分配,是两件事
```
所以:
```
看到"signal" → 不要按 POSIX signal 理解
看到整数 handle/信号号 → 先问它在哪个域、配合哪个 id
```
</CORE RULE>
> 版本/代际提示:OSE 家族有多个产品线(含紧凑版与更小的内核变体),它们**基于同一套原则但内核规模与能力不同**;分析前先确认目标属于哪一支。
## 一、信号模型
- OSE 用**事件("信号")**做通信——命名来自电信背景;**消息存放在附属于每个进程的队列里**
- 信号 API 含 **hunt / attach / send / receive** 一类操作
- **link handler** 机制让信号在**不同机器上的进程之间**传递,支持多种传输介质;这套机制后来成为开源跨机通信项目 LINX 的基础
## 二、关键坑:信号号不是唯一标识
**多个 hunt 端口可以共享同一个 hunt 信号号**——此时**必须靠次级 id**(例如端口 id)把信号路由到正确的接收者。
实现形态:按"信号号 + id"注册,并提供一个**解析函数**从信号的元数据/载荷里把 id 提取出来。
**逆向含义**:拿到"信号号"就想定位唯一接收者会错;先看有没有配套的 id 与解析逻辑。
## 三、两条时序与数据可用性约束
- **必须先注册监听、再发信号**——顺序反了,信号很可能**丢失**
- **与 Unix 不同**:回调触发时,**信号载荷已经收到**了;要**反复取直到取空**(一次事件可能关联多个信号)
**所以**:"信号来了但取不到数据"在 Unix 直觉下像是丢事件,在这里通常是取法不对。
## 四、进程、块、段、池:内存所有权的硬核
- 执行单位是**进程**;进程可以组成**块(block)**,块可以有**自己的内存池**
- **内核地址空间属于一个段(segment),段可包含一个或多个块**;把**块映射到段**、**池映射到区域**,就实现了内存保护与程序隔离
- **进程类型**:中断进程、定时器进程、优先进程、后台进程;**类别**:静态(系统启动时创建)与动态
**信号缓冲区的所有权规则(高频踩点)**:
```
通信进程可以访问【其域内所有池】里的信号缓冲区
但只能【在自己的池里分配】
跨域发送时,缓冲区会被【拷贝到接收方的池】
```
**逆向含义**:缓冲区地址出现在哪个池,决定了它属于谁;"这个指针为什么在对方那里不可用"答案往往在这里。
## 五、监督与错误处理
- **链路级监督**由 LINX 提供;**平台级监督**用于检测**过载的 DSP** 与**失控的 DSP 崩溃**
- **DSP 应用可以订阅监督信号**;可选配 DSP 看门狗作为额外手段
- **运行时做大量检查**:参数、调用者、缓冲区与栈、初始化;检出错误时调用**错误处理器**——它定义了**错误恢复策略的骨架**
- **内核错误类别**:内核自身检出的错误、系统调用参数错误、**内存破坏**
- **能力边界要记清**(别把检不出当没问题):缓冲区与栈带**结尾标记**,因此部分系统调用能检出越界写;但**不能检出**"不改结尾标记的指针访问""内存泄漏""读未初始化值"——那类问题要靠外部工具
- 另有"用户态代码受控切到 supervisor 模式"的途径
## 六、系统信息接口
可取到**常规系统调用拿不到的信息**,用于运行期调试、剖析与调优;其中含**信号组**:信号空间使用情况、信号空间分析、列出系统中所有信号、**以及保存的寄存器与栈内容**。
**逆向含义**:这是定位"这个信号是谁发的、当时寄存器/栈什么样"的现成入口。
## 七、OSE 与 OSEck 的差异
| | **OSE** | **OSEck(紧凑版)** |
|---|---|---|
| 定位 | 高性能、POSIX 兼容的多核 RTOS | **DSP 优化**的紧凑内核 |
| 内存占用 | 常规 | **极小** |
| 典型目标 | ARM / Power 系应用处理器 | DSP 类处理器(多核 DSP、DSP 核) |
| 共同点 | 同一套信号/IPC/原则;**LINX 同时适用于 OSE、OSEck 与 Linux** | 同左 |
**含义**:跨 DSP 的系统里,**同一份信号语义在不同核上由不同精简程度的实例承载**;不要把某核上的能力假设到另一核。
## 八、异构边界
- 信号可跨 **core / CPU / DSP / 节点**传递;LINX 是**分布式透明传输层**,统一核内、处理器间、板间通信
- 支持的介质包括**共享内存、DMA、RapidIO/串行互连、以太网、PCI** 等
- 公开资料强调**零拷贝共享内存传输**;直接消息传递模型中**消息所有权不共享**,避免内存访问冲突
## 决策树
```
拿到 OSE / OSEck 目标
├─ 先判:OSE 还是 OSEck?目标核是什么?
├─ 看到"信号"
│ ├─ 按消息对象解释,不是 POSIX signal
│ ├─ 信号号不唯一 → 找次级 id 与解析函数
│ └─ 可能跨 core / CPU / DSP / 节点
├─ 通信对端找不到 / 数据取不到
│ ├─ 是否先注册后发送(顺序反了会丢)
│ └─ 是否把同一次事件关联的多个信号取空
├─ 缓冲区相关异常
│ ├─ 它属于哪个域/块/池?
│ ├─ 分配只能在自己的池;跨域发送会被拷贝
│ └─ 别把池的归属问题当内存损坏
├─ 想看内部状态
│ └─ 系统信息接口的信号组(信号空间、寄存器与栈内容)
├─ DSP 相关异常
│ ├─ 订阅监督信号;查是否过载/失控
│ └─ 注意结尾标记能检出什么、检不出什么
└─ 跨核行为不一致
└─ 各核承载的内核变体能力不同
```
## 工具与验证
- 通信:信号号 + 次级 id 的注册与解析、hunt/attach 的使用点、队列归属
- 内存:域/块/段/池的映射关系与缓冲区的池归属
- 监督:链路级与平台级监督的配置、DSP 监督信号订阅、错误处理器
- 运行期:系统信息接口(信号空间、寄存器与栈内容)
- 验证:能同时说清「这条信号经哪个传输层到哪个域 + 缓冲区属于哪个池 + 目标核跑的是哪一支内核」
## 该平台的坑(汇总)
- **把消息或 "signal" 当 POSIX 信号**
- **以为信号号可以唯一标识接收者**:多个端口可共享同一信号号,必须配合次级 id
- **先发送后注册监听**:信号会丢
- **只取一次载荷**:一次事件可能关联多个信号
- **以为缓冲区可以任意分配**:只能在**自己的池**里分配,跨域发送会被拷贝
- **把池/域的归属问题判成内存损坏**
- **以为通信对端一定在本地**:传输层是分布式透明的
- **在本地 syscall trace 里找跨节点通信**
- **把结尾标记检不出问题当"没有内存问题"**:不改标记的越界、泄漏、未初始化读取都检不出
- **把某一核的内核能力假设到另一核**:OSE 与 OSEck 能力不同
- **断言其支持 XIP**:本次核验未证实,不要照搬
- **忽略系统信息接口**:它是定位信号来源与现场的最快入口