# rust-libtipc **Repository Path**: openkylin/rust-libtipc ## Basic Information - **Project Name**: rust-libtipc - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-06-16 - **Last Updated**: 2026-07-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # libtipc — 纯 Rust 实现的 TIPC 库 ## 简介 libtipc 是纯 Rust 实现的 TIPC(Trusty IPC)通信库,支持 x-kernel 和 Trusty LK 双平台,对标 Google Trusty 官方的 `tipc` crate。 本库同时提供三层 API: - **Rust `service` API**:`Handle`、`Manager`、`Service`、`UnbufferedService` 等,用法与官方 `tipc` crate 一致。 - **Rust `raw` API**(线程安全):`EventLoop`、`HandleSetWrapper`、`ServiceHandle` 等,基于 `Arc>`,适合 RPC binder 等线程安全场景。 - **C FFI 接口**(`extern "C"`):导出为 `cdylib`,供 C/C++ TA 代码调用,兼容 `libtrusty.so` 接口。 ## 分层架构 ```text Rust TA C TA │ │ ▼ ▼ handle / raw c_api (extern "C") │ │ ▼ ▼ api (mod.rs, 安全包装函数) │ ▼ ffi.rs (内部 syscall 实现,唯一直接调用 syscall 的模块) │ ▼ syscall.rs (内联汇编) → x-kernel / Trusty LK 内核 ``` 所有 syscall 统一经过 `ffi.rs` 模块,不依赖任何外部 C 库。 ### Crate 依赖关系 ```text TA(最终二进制) ├── tipc (rust-libtipc) — 纯 IPC 库,不定义 allocator/panic_handler └── tipc_std (tipc-std) — 运行时提供者:类型 re-export + #[global_allocator] + #[panic_handler] ``` ## 模块说明 | 模块 | 文件 | 职责 | |------|------|------| | `handle` | `src/handle.rs` | Rust 句柄操作(connect/recv/send/mmap),对标 `tipc::Handle` | | `service` | `src/service.rs` | 服务框架(PortCfg/Manager/Service/Dispatcher) | | `raw` | `src/raw/` | 线程安全原始 API(EventLoop/HandleSetWrapper),基于 `Arc>` | | `serialization` | `src/serialization.rs` | IPC 消息序列化/反序列化 trait | | `types` | `src/types.rs` | TIPC 类型定义(TipcHandle/TipcUuid/事件常量) | | `api` | `src/api/` | C FFI 函数 + 安全 Rust 包装函数 | | `ffi` | `src/ffi.rs` | 内部 syscall 实现层 | | `err` | `src/err.rs` | 错误类型(TipcError/ConnectResult/MessageResult) | | `syscall` | `src/syscall/` | 底层内联汇编 syscall 封装(syscall0-6) | ## 快速上手 ### 作为 Rust 客户端使用 ```rust use libtipc::{Handle, MMapFlags, Serialize, Deserialize}; // 定义消息类型(需同时实现 Serialize 和 Deserialize) #[derive(Serialize, Deserialize)] struct PingRequest { seq: u32, payload: [u8; 32], } // 连接到服务端 let handle = Handle::connect(c"com.example.ping")?; // 发送请求 handle.send(&PingRequest { seq: 1, payload: [0; 32] })?; // 接收响应(需提供缓冲区) let mut buf = [0u8; 64]; let resp: MyResponse = handle.recv(&mut buf)?; ``` ### 实现服务端(Service trait,传统 Manager 模式) ```rust use libtipc::{Service, PortCfg, Manager, ConnectResult, MessageResult, Handle, Uuid, Result, Serialize, Deserialize}; // 定义自定义消息类型(必须实现 Deserialize) #[derive(Serialize, Deserialize)] struct EchoMessage { seq: u32, data: [u8; 32], } struct EchoService; impl Service for EchoService { type Connection = (); type Message = EchoMessage; fn on_connect( &self, _port: &PortCfg, _handle: &Handle, _peer: &Uuid, ) -> Result> { Ok(ConnectResult::Accept(())) } fn on_message( &self, _conn: &Self::Connection, _handle: &Handle, msg: Self::Message, ) -> Result { // 处理消息... Ok(MessageResult::MaintainConnection) } } // 启动事件循环 let port = PortCfg::new("com.example.echo")? .msg_max_size(4096) .msg_queue_len(8); let buffer = vec![0u8; 4096]; let manager = Manager::new(EchoService, port, buffer)?; manager.run_event_loop()?; // 阻塞运行,仅在不可恢复错误时返回 ``` ### 实现服务端(UnbufferedService + raw API,线程安全模式) ```rust use alloc::sync::Arc; use libtipc::{HandleSetWrapper, EventLoop, PortCfg, UnbufferedService, ConnectResult, MessageResult, Handle, Uuid, Result, ServiceHandle}; struct EchoRawService; impl UnbufferedService for EchoRawService { type Connection = (); fn on_connect( &self, _port: &PortCfg, _handle: &Handle, _peer: &Uuid, ) -> Result> { Ok(ConnectResult::Accept(())) } fn on_message( &self, _connection: &Self::Connection, _handle: &Handle, buffer: &mut [u8], ) -> Result { // 在 buffer 中直接处理原始字节 Ok(MessageResult::MaintainConnection) } } // 创建线程安全的 handle set 和事件循环 let wrapper = Arc::new(HandleSetWrapper::::new()?); let port = PortCfg::new("com.example.raw")?; let service = Arc::new(EchoRawService); wrapper.add_port(&port, Arc::clone(&service))?; let event_loop = EventLoop::new(Arc::clone(&wrapper)); event_loop.run()?; ``` ### 多服务分发(传统 Manager 模式) 使用 `service_dispatcher!` 宏实现多服务端口分发: ```rust use libtipc::{service_dispatcher, Dispatcher}; service_dispatcher! { pub enum MultiDispatcher { EchoService, AuthNService, StorageService, } } ``` ## 构建与测试 ### 前置条件 - Rust nightly 工具链(项目使用了 `allocator_api`、`core_intrinsics` 等 unstable feature) - 目标平台:x86_64 或 aarch64 安装 nightly 工具链: ```bash rustup toolchain install nightly ``` 项目根目录已配置 `rust-toolchain.toml`,`cargo build` 会自动选择 nightly 通道,无需每次手动指定 `+nightly`。 ### 构建 ```bash # x-kernel 平台(默认),使用 musl target(Rust tier 2,有预编译 sysroot) cargo build --target aarch64-unknown-linux-musl # x-kernel release 模式 cargo build --release --target aarch64-unknown-linux-musl # Trusty LK 平台(features lk),使用自定义 trusty target(Rust tier 3,需 -Zbuild-std) cargo build --target aarch64-unknown-trusty -Zbuild-std=core,alloc --features lk # Trusty LK release 模式 cargo build --release --target aarch64-unknown-trusty -Zbuild-std=core,alloc --features lk # 本地开发构建(宿主机测试,不指定 target 时使用本机 sysroot) cargo build ``` Rust 官方对 target 平台的支持分三个等级: - **tier 1**:自动构建 + 自动测试,完全保证可用(如 `x86_64-unknown-linux-gnu`) - **tier 2**:自动构建,但不自动测试,有预编译的 sysroot(`core`/`alloc`/`std`), 直接 `rustup target add` 安装(如 `aarch64-unknown-linux-musl`) - **tier 3**:仅社区维护,无预编译 sysroot,需通过 `-Zbuild-std` 从源码构建标准库 (如 `aarch64-unknown-trusty`) > **注意**:`Cargo.toml` 已配置 `crate-type = ["rlib", "cdylib"]` 和 `panic = "abort"`, > 因此任何构建模式都会同时产出静态库和动态库。 ### 测试 ```bash # 运行所有单元测试 cargo test --features std # Clippy 静态检查(所有 target) cargo clippy --all-targets ``` > **注意**:`std` feature 仅用于本地测试。生产构建(no_std)中,`#[global_allocator]` > 和 `#[panic_handler]` 由 tipc-std 提供。启用 `std` feature 后主机 std 接管两者。 ## 许可证 Apache-2.0 Copyright 2026 KylinSoft Co., Ltd.