Linux 内核的第六版补丁支持 Rust 语言

Rust-for-Linux 项目的作者 Miguel Ojeda 提议发布用于用 Rust 语言开发设备驱动程序的 v6 组件,供 Linux 内核开发人员考虑。 这是补丁的第七版,考虑到第一版,发布时没有版本号。 Rust 支持被认为是实验性的,但已经包含在 linux-next 分支中,并且已经充分开发,可以开始在内核子系统上创建抽象层以及编写驱动程序和模块。 该开发由 Google 和 ISRG(互联网安全研究小组)资助,ISRG 是 Let's Encrypt 项目的创始人,致力于推动 HTTPS 以及提高互联网安全性的技术开发。

在新版本中:

  • 该工具包和 alloc 库的变体已更新至 Rust 1.60 版本,避免了发生错误时可能生成的“恐慌”状态,稳定了对内核补丁中使用的“maybe_uninit_extra”模式的支持。
  • 通过将与内核 API 相关的测试编译时转换为在内核加载期间执行的 KUnit 测试,添加了从文档运行测试的功能(也用作文档中的示例的测试)。
  • 已采用的要求是测试不应导致 Clippy linter 警告,就像 Rust 内核代码一样。
  • 提出了具有网络功能的“net”模块的初步实现。 Rust代码可以访问内核网络结构,例如Namespace(基于struct net内核结构)、SkBuff(struct sk_buff)、TcpListener、TcpStream(struct socket)、Ipv4Addr(struct in_addr)、SocketAddrV4(struct sockaddr_in)及其IPv6等效项。
  • 初步支持异步编程技术(async),以 kasync 模块的形式实现。 例如,您可以编写异步代码来操作 TCP 套接字: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 第1024章循环 { 让 n = Stream.read(&mut buf).await?; 如果 n == 0 { 返回 Ok(()); }stream.write_all(&buf[..n]).await?; } }
  • 添加了 net::filter 模块来操作网络数据包过滤器。 添加了示例 rust_netfilter.rs,其中包含 Rust 语言中的过滤器实现。
  • 添加了简单互斥体 smutex::Mutex 的实现,它不需要固定。
  • 添加了NoWaitLock,它从不等待锁,如果被其他线程占用,则在尝试获取锁时会导致报错,而不是停止调用者。
  • 添加了RawSpinLock,由内核中的raw_spinlock_t标识,应用于不能空闲的部分。
  • 添加了 ARef 类型,用于引用应用了引用计数机制的对象(始终引用计数)。
  • rustc_codegen_gcc 后端允许您使用 GCC 项目中的 libgccjit 库作为 rustc 中的代码生成器,为 rustc 提供对 GCC 中可用架构和优化的支持,并实现了引导 rustc 编译器的功能。 编译器升级意味着能够在 rustc 中使用基于 GCC 的代码生成器来构建 rustc 编译器本身。 此外,最近发布的 GCC 12.1 还包括对 rustc_codegen_gcc 正常工作所需的 libgccjit 的修复。 目前正在准备提供使用 rustup 实用程序安装 rustc_codegen_gcc 的能力。
  • 值得注意的是 GCC 前端 gccrs 的开发进展以及基于 GCC 的 Rust 语言编译器的实现。 目前有两名全职开发人员从事 gccrs 工作。

回想一下,提议的更改使得可以使用 Rust 作为开发驱动程序和内核模块的第二语言。 Rust 支持作为一个选项提供,默认情况下不启用,并且不会导致 Rust 被包含为内核所需的构建依赖项。 使用 Rust 进行驱动程序开发将允许您以最小的努力创建更安全、更好的驱动程序,并且不会出现释放后内存访问、空指针取消引用和缓冲区溢出等问题。

Rust 在编译时通过引用检查、跟踪对象所有权和对象生命周期(作用域)以及在代码执行期间评估内存访问的正确性来提供内存安全处理。 Rust 还提供防止整数溢出的保护,要求在使用前强制初始化变量值,更好地处理标准库中的错误,默认应用不可变引用和变量的概念,提供强静态类型以最小化逻辑错误。

来源: opennet.ru

添加评论