Oni 框架是一个用于嵌入式设备软件开发的平台。它用于远程调试/为嵌入式设备添加功能。目前,其核心概念是一个完全模块化的插件系统,支持本地和远程 RPC。该框架设计为在 ring-0 特权级别运行,但经过一些调整也可以在 ring-3 级别使用。请注意,这不适合生产环境使用,仅供希望获得简便研究构建平台的开发人员使用。
计划中的功能:
Oni-Framework 仅需你检出此目录,并在 oni/utils/kdlsym/default.h 文件中补全所有必需的实现。之后,使用 gcc 或 clang 即可正常编译并生成可执行文件。你需要自带(BYO)执行方式,但对于大多数嵌入式设备,可以通过 ssh shell、telnet shell 或任何其他 shell 来完成。其他设备可能需要先加载到运行中的内存上下文,然后跳转到 main,由它负责处理所有初始化问题。
git clone https://github.com/kiwidoggie/oni-framework.git
a. 可选:设置 FreeBSD 头文件位置 export BSD_INC="/path/to/freebsd/headers/include"make create,它将创建文件夹结构make 构建
a. 如果尚未设置环境变量,可以使用 make BSD_INC=/path/to/freebsd/headers/include 进行构建Oni-Framework 不依赖功能完整的 libc,其设计目标是在满足所有前置条件的情况下完全独立地构建和运行。相反,所需功能是通过运行中进程上下文或内核上下文(后者是唯一经过测试的)中最基本的现有函数拼接而成的。
include/oni/utils/kdlsym/my_platform.h 中创建新的头文件,来创建新的 kdlsym(内核动态符号解析)目标include/oni/utils/kdlsym/default.h 的内容复制并粘贴到你新建的头文件中include/oni/utils/kdlsym.h 中#if ONI_PLATFORM==ONI_UNKNOWN_PLATFORM
#include "kdlsym/default.h"
#elif ...
#elif ONI_PLATFORM==ONI_MY_PLATFORM
#include "kdlsym/my_platform.h"
#endif
include/oni/config.h 的配置文件中// Unknown device
#define ONI_UNKNOWN_PLATFORM -1
#define ONI_MY_PLATFORM 5
#define ONI_PLATFORM ONI_UNKNOWN_PLATFORM 改为 #define ONI_PLATFORM ONI_MY_PLATFORM 来更改当前构建目标如果你想贡献代码,只需提交 pull request。否则,目前该项目没有任何真正的支持。这一点将来可能会改变。
| 位偏移 | 位长度 | 名称 | 描述 | 用途 |
|---|
| 0 | 3 | 魔数 | 这是一个简单的数据包头魔数,用于确保消息被正确处理 | 必需:必须设置为 0101b 或 5(十进制) |
| 3 | 4 | 消息类别 | 这描述了消息在 oni-framework 端应路由到的类别 | 必需:最多 14 个类别(目前有 5 个在使用) |
| 7 | 32 | 错误/消息类型 | 此字段包含错误代码或消息类型 | 请求:必须设置为消息类型,目前通过 CRC32(MessageName) 计算;响应:设置为错误代码/返回值 |
| 39 | 16 | 有效载荷大小 | 这是消息头之后的数据长度 | 可选:如果没有有效载荷则设置为 0,否则将期望有数据 |
| 55 | 1 | 请求 | 如果消息是请求,此标志将设置为 1;如果是响应,则设置为 0 | 必需 |
| 56 | 7 | 保留 | 保留 | 忽略:设置为 0 |