rust做嵌入式开发_用Rust重写Linux内核模块体验

本文介绍了作者使用Rust重写2W+行C代码的Linux内核模块的经验。文章讨论了重写的原因,如解决内存安全问题,以及Rust的优势。详细阐述了Rust内核模块的基本构建过程,并分享了从C到Rust的转换过程中遇到的挑战,包括编译问题、依赖和加载错误,以及解决方案。
摘要由CSDN通过智能技术生成

最近,我用Rust重写了一个2W+行C代码的linux内核模块。在此记录一点经验。我此前没写过内核模块,认识比较疏浅,有错误欢迎指正。

为什么要重写?

这个模块2W+行代码量看起来不多,却在线上时常故障,永远改不完。十多年的老代码,经手了无数程序员,没人能解决其中的内存安全问题。拿过来一看,代码中的确有不少会产生UB的写法,线上的故障从core来看都飘得太远,难以定位根本原因在哪里。所以我没有把握(没有能力)在原代码基础上能将所有线上故障修复。 而Rust是一个现代的、高性能、无GC、内存安全的编程语言,我想它非常适合用来重写这个内核模块。

Hello World

首先来介绍下如何用Rust写linux内核模块吧。也可以参考这里, 该项目正在尝试写一个safe的rust内核框架,目前的状态还不实用,我没使用该框架,仅参考了其基本编译配置。

基本思路就是分别建立一个linux内核c工程和rust的hello world工程,把它们放到一块儿(不放到一块儿也行),文件分布如下:

├── Cargo.toml

├── Makefile

├── mydriver.c

└── src

└── lib.rs

然后在linux内核模块的入口和出口函数分别调用rust中实现的入口和出口函数,rust中将入口、出口函数标记为extern "C",所有业务逻辑在Rust中完成。

// mydriver.c

// ... include headers

extern int my_drv_init(void); // defined in rust

extern void my_drv_exit(void); // defined in rust

static int _my_drv_init(void)

{

printk("loading my driver\n");

return my_drv_init();

}

static void _my_drv_exit(void)

{

printk("exiting my driver\n");

my_drv_exit();

}

module_init(_my_drv_init);

module_exit(_my_drv_exit);

// lib.rs

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值