#acpi #osdev #api-bindings

nightly no-std acpica-bindings

Intel ACPICA内核子系统的Rust绑定(不完全)

3个版本

0.1.2 2023年12月24日
0.1.1 2023年12月17日
0.1.0 2023年12月17日

#1663硬件支持

MIT 许可证

1.5MB
10K SLoC

ACPICA Rust 绑定

与ACPI表和AML代码交互的ACPI内核子系统的Rust绑定。有关使用库的信息,请参阅crate级别的文档

更改ACPICA版本

ACPICA的源代码作为tarball包含在crate根目录中。要更新版本,从下载页面下载新代码,并用此文件替换tarball。然后运行cargo clean以删除旧版本的对象文件。

此库的构建脚本会自动对源代码进行一些更改,以配置其在内核中使用。如果没有更新Rust代码就更新了ACPICA代码,可能会导致库无法编译,或者即使编译成功也可能无法正常工作。


lib.rs:

ACPICA绑定

Intel ACPICA内核子系统的Rust绑定(不完全)。此crate仍在积极开发中 - 我正在添加所需的特性到我的OS项目。如果您正在使用此crate,请预计会有很多编译器警告和todo!

构建依赖

此crate使用cc crate从源代码构建ACPICA。此crate需要在系统上存在C编译器 - 有关更多信息,请参阅该crate的文档。

此crate还使用不稳定的Rust特性,因此需要nightly或beta编译器。

运行时依赖

由于此crate设计为在OS内核中使用,因此它的依赖性最小。然而,crate确实需要动态内存分配。

此crate还使用[log] crate进行日志记录。

用法

ACPICA内核子系统使用以AcpiOs为前缀的各种函数调用OS代码。这些函数通过此库转换为对AcpiHandler trait上的方法的调用。实现此trait的对象必须在任何ACPI功能可以使用之前传递给register_handler。初始化库可能如下所示

struct HandlerStruct {}

impl AcpiHandler for HandlerStruct {
    // ...
}

let handler = HandlerStruct {};

let initialization = register_interface(handler)?;
let initialization = initialization.load_tables()?;
let initialization = initialization.enable_subsystem()?;
let initialization = initialization.initialize_objects()?;

依赖关系