#mach #macos #kernel #bindings #darwin #api-bindings #extension

sys no-std mach-sys

从原始的 mach 分支,并合并自 mach2/machx。是 Mach 3.0 内核用户空间 API 的 Rust 接口,该内核是 macOS 的基础。

7个版本

0.5.4 2024年3月1日
0.5.3 2024年3月1日
0.5.1 2024年2月29日
0.4.4 2024年2月26日

操作系统 中排名 207

Download history 273/week @ 2024-03-11 56/week @ 2024-04-01 1/week @ 2024-04-08 13/week @ 2024-05-20 19/week @ 2024-05-27 12/week @ 2024-06-03 9/week @ 2024-06-10 41/week @ 2024-06-17 23/week @ 2024-06-24

每月下载 86
4 个crate中使用(通过 perfmon

GPL-3.0 OR Apache-2.0

190KB
4K SLoC

mach-sys: 从原始的 "mach" 分支,并合并自 "mach2" & "machx"。

github docs.rs crates.io

是暴露在 /usr/include/mach 的 Mach 3.0 内核 用户空间 API 的 Rust 接口,该内核是 macOS 的基础,并通过 libSystem(以及 libsystem_kernel)链接。

该库不暴露在 SDK/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach 中暴露的 Mach 3.0 内核的 内核空间 API。

也就是说,如果您正在编写内核驻留的设备驱动程序或其他内核扩展,您必须使用其他方法。用户空间内核 API 通常与内核空间 API 不兼容,即使在它们匹配的情况下,有时也可能会出现 ABI 不兼容的情况,使用此库会导致 未定义行为

(notes from machx developers:)
1. due to the lack of maintenance of `mach2` and `mach`, a lot of APIs are missing, so I maintain this version for my own use.
2. via bindgen as well as manual fixes.

使用方法

将以下内容添加到您的 Cargo.toml 中,以有条件地包括支持的平台上的 mach。

[target.'cfg(target_vendor="apple")'.dependencies]

# use alias for migration from exists project:
mach = { package = "mach-sys", version = "0.5" }

# or without alias:
mach-sys = "0.5"

可用的crate功能

  • unstable(默认禁用):暴露新更改的API。启用此功能可能会带来破坏性更改(请参阅破坏性更改策略)。

破坏性更改策略

当最新的工具链中的一项更改或删除时,我们采取以下步骤

  1. 将现有的标记为 已弃用

  2. 声明一个新的(默认)。

  3. 永久保留较旧的版本。

  4. 如果有两个项目具有等效的值,则将类型别名指向新的一个,或内部函数调用新的一个。

  5. 否则,如果两个项目具有不同的值或行为,则两者将同时存在。

  6. 或者,在某些情况下,如果较旧的版本确实很糟糕,那么自发布包含该版本的新的版本以来一个月或更长时间后,移除较旧的版本

例如(等效),如果函数 FUNC 将它的 返回类型u32 更改为 u64,则将创建一个新的函数,然后旧的函数只需调用它并将它的返回类型转换为 u64 as u32)。在大多数情况下,不会进行更多更改,两者都将永远保留。

例如(非等效),如果 const FOO 的值从 3 更改为 4,我们将公开新的一个,即 4。因此,用户应该注意在首次发布后的第一次更改。或者,一个月或更长时间后,可能或可能不,所有用户都应该迁移/遵循这个更改。

示例

示例可以在本存储库的 示例 目录中找到。

由于 examples/dump_process_registers.rs 使用了需要提升权限的 task_for_pid() 函数,因此必须禁用系统完整性保护(SIP)并且必须是 admin_developer 组的成员才能运行该示例。然而,请注意,禁用 SIP 并不鼓励,并且仅应出于开发/调试目的进行。

  1. 以恢复模式重新启动 macOS。
  2. 点击 选项
  3. 登录到您的用户。
  4. 在菜单中点击 实用工具 然后点击 终端
  5. 在终端中输入以下命令以禁用 SIP: csrutil disable (使用 csrutil enable 重新启用 SIP)。
  6. 重新启动您的计算机。

要运行示例,请按照以下方式构建

cargo b --example dump_process_registers

然后使用 sudo 运行它

sudo ./target/debug/examples/dump_process_registers

平台支持

以下表格描述了当前的 CI 设置

目标 最小 Rust XCode 构建 ctest 运行
x86_64-apple-darwin 1.33.0 10.3.0 - 13.1.0
aarch64-apple-darwin nightly 13.1.0 - -
aarch64-apple-ios nightly 13.1.0 - -
aarch64-apple-ios-sim nightly 13.1.0 - -
x86_64-apple-ios nightly 13.1.0 - -

许可协议

本项目的许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则您根据 GPL-3.0Apache-2.0 的双重许可协议有意提交给 mach-sys 的任何贡献,都将按照上述条款进行许可,不得附加任何其他条款或条件。

要本地测试库,请运行

$ ./tomake.sh nostd --target=x86_64-apple-darwin --any-args-accept-by-rustc
$ ./tomake.sh test --target=<your_platform> --any-args-accept-by-cargo
$ echo "for other args please see the bash script named tomake.sh"

您可以将 --target 替换为您想要测试的目标(例如 aarch64-apple-darwin),如果您需要使用不同的 Rust 版本(例如 stable1.33.0 等),请使用 Rustup

依赖关系

~0–6MB
~20K SLoC