#mach #darwin #send-receive #reference-counting #api-bindings #message-sent #hold

nightly mach_ports

一个用于管理 Mach 端口引用和交换 Mach 消息的库

2 个不稳定版本

0.3.0-alpha2023年5月15日
0.2.0-alpha2022年11月15日
0.1.0-alpha2 2022年11月15日

macOS 和 iOS API 中排名 94

每月下载量 22

MIT/Apache

92KB
2K SLoC

mach_ports_rs

Crates.io

摘要

Mach 端口是 Darwin 中进程和内核之间大多数低级通信所使用的强大 IPC 机制。I/O Kit,与这些平台上的内核驱动程序通信的主要方式,以及 XPC,最广泛使用的用户空间 IPC 机制,都是使用 Mach 端口构建的。在这些系统上以安全的方式公开低级 API 需要 mach_ports_rs 库旨在提供的抽象。

Mach 端口名称包装器

Mach 端口在用户空间中由称为“名称”的句柄表示。与文件描述符不同,这些名称引用端口的一个或多个“权利”

  • MACH_PORT_RIGHT_SEND:允许向 Mach 端口发送 Mach 消息。可以同时持有多个发送权利引用,允许存在多个发送者。
  • MACH_PORT_RIGHT_RECEIVE:允许从端口接收 Mach 消息并创建发送和发送一次权利。只能持有一个接收权利引用,这限制了接收者的数量为一个。
  • MACH_PORT_RIGHT_SEND_ONCE:允许向端口发送单个 Mach 消息。发送消息后,权利被销毁。可以同时存在多个发送权利,但每个权利只能有一个引用。
  • MACH_PORT_RIGHT_PORT_SET:允许在一次调用中从多个端口接收消息。目前 mach_ports_rs 不支持端口集。
  • MACH_PORT_RIGHT_DEAD_NAME:在某些条件下(例如,当接收权利被销毁时,发送权利变为死名称权利),权利可以转换为死名称。这些也可以手动创建。

在发送和接收权限的情况下,例如,在相同进程中(IPC空间)使用相同的名称引用时,权限的引用计数是分别管理的。《code>mach_ports_rs通过提供针对Mach端口号的3个包装器来在类型级别上进行这种区分(不需要单独表示已死亡的名字)

  • SendRight包装了一个持有发送权限引用的名字。这些可以通过增加发送权限的引用计数来克隆,并在释放时减少。
  • RecvRight包装了一个持有接收权限引用的名字。这些不能被克隆,并且在释放时通过减少其唯一的引用来销毁接收权限。
  • SendOnceRight包装了一个持有发送一次权限引用的名字。这些不能被克隆,并且在释放时通过减少其唯一的引用来销毁发送一次权限。

发送/接收Mach消息

Mach消息的格式相当复杂。所有Mach消息都以固定大小的头部开始,后面跟着可选的描述符、内联数据和只在接收消息中存在的尾部。

Complex Mach message format diagram

mach_ports_rs提供了一些数据结构,可用于构建和解析此类消息。有关《code>msg模块的更多信息,请参阅文档。

许可证

根据您的要求,许可协议为

任选其一。

贡献

除非您明确声明,否则您有意提交的任何贡献,包括但不限于Apache-2.0许可证中定义的工作,应按照上述方式进行双重许可,不附加任何额外条款或条件。

依赖关系

约95-305KB