在 Rust 中为 RISC-V OS 实现自旋锁
自旋锁是最基本的同步实现之一,也是实现操作系统时首先要考虑的组件之一。文章将简要回顾自旋锁的基础知识,如何在 Rust 中为自制操作系统实现它,以及它相对于 C 语言的优势。
- https://vmm.dev/en/rust/spinlock.md
SNAFU 0.7 发布
SNAFU 是一个库,可以在添加上下文的同时轻松地将底层错误分配到特定于域的错误中。可以类似这样处理错误:
// We support struct errors ...
#[derive(Debug, Snafu)]
#[snafu(display("An error occurred for {username}"))]
struct OneKindOfError { username: String }
// ... enum errors ...
#[derive(Debug, Snafu)]
enum AnotherKindOfError {
#[snafu(display("Unable to finish situation one"))]
SituationOne { source: OneKindOfError },
#[snafu(display("Unable to finish situation two for {user_id}"))]
SituationTwo { source: OneKindOfError, user_id: u32 },
}
// ... and opaque errors, great for exposing as part of a public API.
#[derive(Debug, Snafu)]
pub struct Error(AnotherKindOfError);
1 月 4 日 SNAFU 0.7 发布,更新了包括:使用结构和枚举的自定义错误类型,上下文选择器可以放在一个模块中等。
- https://users.rust-lang.org/t/snafu-0-7-released/69766
将 Rust 的 std 移植到 rustix
Rustix 是一个具有多个后端的系统调用包装库。它有一个原始的 Linux 系统调用后端,以及一个 libc 后端,其他后端正在开发中。Rustix 专为内存安全、I/O 安全和性能而设计。rustix 简化了与 C 整数类型大小相关的系统调用 API 中的一些小缺陷。举个例子:
let len = cmp::min(buf.len(), <wrlen_t>::MAX as usize) as wrlen_t;
let ret = cvt(unsafe {
c::send(self.inner.as_raw(), buf.as_ptr() as *const c_void, len, MSG_NOSIGNAL)
})?;
将会变成
let ret = rustix::net::send(&self.inner, buf, SendFlags::NOSIGNAL)?;
这将重点放在send操作上,而没有unsafe、原始指针、wrlen_t类型和cvt错误处理的干扰。Rustix 还能够从 Rust 代码直接进行 Linux 系统调用。比如 origin 是一个 Rust 库,它能够启动和关闭进程和线程(类似于 crt1.o 和 libpthread)。有了这些,我们就有了在 Linux 上运行 Rust 程序所需的所有东西。
- https://blog.sunfishcode.online/port-std-to-rustix/