自Linux 6.1起,初始的Rust基础设施被添加到Linux内核中。此后为了使内核驱动程序能够用Rust编程语言编写,Linux内核已经合并了许多其他管道和内务管理工作。随着即将到来的Linux 6.8内核周期,第一个Rust网络驱动程序将被引入。最近一个“net-phy-rust”驱动程序被合并到了net-next.git分支。该驱动为phylib Rust绑定...
去年有人提交过一份 C vs Rust 驱动代码示例:A GPIO driver in Rust。可以看得出来,Rust 对硬件抽...
net:phy:add Rust AsixPHYdriver This is the Rust implementationofdrivers/net/phy/ax88796b.c.The features are equivalent.You can chooseCor Rust version kernel configuration. 链接: https://fosstodon.org/@kernellogger/111741507899977461 GitHub: https://github.com/torvalds/linux/blob/master/drivers/ne...
kernel developer应该编写rust的idiom code还是写“C in Rust”?Ojeda回答一开始可以先用C风格写,慢慢...
(ARCH)-linux-kernelobj-m:=$(MODNAME).o$(MODNAME)-objs:=mydriver.o mydriver.rust.o.PHONY:$(src)/lib$(MODNAME).a$(src)/lib$(MODNAME).a:cd$(src);make rlibcd$(src);cp$(LIB_DIR)/lib$(MODNAME).a .%.rust.o:lib%.a$(LD)-r -o$@.tmp --whole-archive $<$(src)/plt2pc.py...
struct RustMinimal {numbers: Vec, 它是一个包含 32 位整数值的 Vec。本身 Rust 允许为结构类型添加接口("trait")实现。因此,这个示例模块为 RustMinimal 类型实现了 kernel::Module trait。 impl kernel::Module for RustMinimal {fn init(_module: &'static ThisModule) -> Result {pr_info!("Rust minima...
Rust driver实现时的锁粒度比较粗,需要开发者进一步优化 Rust访问数组会有运行时检查(boundary check) Rust通过byte数组模拟了bit fields,又会引入更多的boundary check Rust倾向于使用智能指针来处理object的ownership(在kernel C代码中是直接在结构体里嵌入object),这会带来额外的icache/tlb miss 相比于C的性能提升主要...
rustup是 rust 官方推出的基于 终端/控制台/shell 的工具链管理工具,可用于管理 rust 版本和相关工具,如安装哪个版本的rust和常用组件等。 cargo是用 rust 写的一个包管理工具(可以直接在http://crates.io上搜到并当作依赖来用) + 工程管理工具,类似c++ 等同于conan+cmake+make;可以用来构建工程,最后编译还是...
[lib]name = "mydriver"crate-type = ["staticlib", "rlib"] 1. 模块的Makefile调用cargo编译rust库,然后将其和c一块儿链接成ko,大概这个样子: MODNAME = mydriverKDIR ?= /lib/modules/$(shell uname -r)/buildBUILD_TYPE = releaseLIB_DIR = target/$(ARCH)-linux-kernel/$(BUILD_TYPE)all: $(...
在linux-kernel-module-rust 项目中,进入用户空间的指针被 wrap 成 UserSlicePtr 类型,这确保了 copy_to_user或 copy_from_user的可以正确使用。这个 wrapper 在 Rust 代码中提供了一定程度的安全性功能(因为这类指针不能直接 dereference),同时也使 Rust 代码更加地道。要想写入用户空间指针的话,代码看起来就像是...