#linux #safe #abi #read #call #file #duplicates

nightly lx

一个用于使用 Linux 系统调用的 no_std 库

8 个不稳定版本 (3 个破坏性更新)

0.4.0 2023年11月9日
0.3.4 2023年7月30日
0.2.1 2023年11月6日
0.2.0 2023年5月31日
0.1.0 2023年3月21日

#570 in Unix APIs


用于 azur

GPL-3.0-only

120KB
3.5K SLoC

一个 Rust no_std 库,用于使用用户空间 Linux ABI,旨在没有开销,但尽可能利用 Rust 的类型系统保证安全性。

代码必须精心组织,以便尚未阅读的人可以快速猜测文件对应的内容,或实现的位置以及其工作原理:它必须在不需要大量上下文的情况下可修改。

这意味着代码风格必须在代码库中保持一致,以使组织可预测。

必须避免代码重复,但只有当重复的代码作为一个整体有意义,并且有一个合适的描述性名称时。


lib.rs:

一个 no_std 接口,用于用户空间 Linux ABI,旨在没有开销,但尽可能利用 Rust 的类型系统保证安全性。

结果开销

虽然类型如 Result<i32>> 有时被用来代替较小的 i32,它可以表示错误和成功,但函数内联可以减少内存开销或寄存器压力,因为在实践中函数是内联的。

为了验证这一点,当启用优化时,尝试查看由代码生成的汇编代码。

extern "C" {
    fn fallible() -> i32;

    fn test_succeeded();
    fn test_failed(err: i32);
}

fn fallible_safe() -> Result<(), i32> {
    let ret = unsafe { fallible() };
    if ret < 0 {
        return Err(ret);
    }
    Ok(())
}

pub fn test() {
    if let Err(e) = fallible_safe() {
        unsafe { test_failed(e) };
        return;
    }
    unsafe { test_succeeded() };
}

没有运行时依赖