如何使用rust写内核模块

近年来,Rust语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们来尝试下如何用rust来写Linux内核模块。

Rust与内核模块

虽然Rust支持已经在Linux Kernel 6.1版本合并到主线了,所以理论上来说,开发者可以使用Rust来为Linux 6.1写内核模块。
但实际开发工作中,内核版本不是最新的,比如Debian 11的内核就是5.10版本的,那么在这种情况下,该如何用Rust写内核模块呢?

原理

  1. Rust如何向内核注册回调、如何调用内核代码。Rust和C的互操作性
  2. Rust如何编译到目标平台上。Rust的target配置
  3. Rust如何申明内核模块入口、并添加特殊section。Rust内核模块的二进制约定

Rust和C的互操作性

第一个问题基本上就是C和Rust的互操作性了。
得益于Rust的抽象层次,C语言和Rust的互相调用都是比较容易的。rust官方也提供了bindgen这样,根据.h文件生成.rs文件的库。
这样一来,貌似直接使用bindgen将内核头文件翻译成.rs就可以了?
但还有一个问题,如何获取内核头文件路径呢?
可以使用一个dummy内核模块,在编译过程中把编译参数导出来,其中包含了头文件路径,编译参数等,用于bindgen生成代码。

Rust的target配置

内核模块和普通的程序相比,主要的不同在于:

  1. 内核模块是freestanding的,没有libc、内存分配也比较原始
  2. 内核模块对于异常处理等有特殊约定
阅读更多

kill-port 清理占用端口的进程

背景

在日常开发中,经常出现端口莫名被占用的情况。比如要启动一个java服务,报错8080端口被占用,这时候就想着快速清理掉占用该端口的进程。

在Linux下,我们可以用熟悉的ss命令来找出进程并删除,但是macOS下,netstat我用的比较少,而且速度也很慢。

最近正好在学习Rust,所以就用Rust来写一个kill-port小工具,也算是入门系统编程了吧。

安装

1
2
3
$ git clone https://github.com/robberphex/kill-port.git
$ cargo build --release
# 将 ./target/release/kill-port 添加到PATH路径中。

使用方法

1
2
3
4
5
6
7
kill-port 0.1.0

USAGE:
kill-port [PORT]...

ARGS:
<PORT>... ports to find

例子:

1
2
# kill掉占用8080端口的进程
$ kill-port 8080
阅读更多