当前位置: 首页 > news >正文

rust_for_linux驱动完整版记录

文章目录

  • [清华开源操作系统训练营]《Rust fox Linux》课程的练习1-2完整版记录。
    • 1. 环境搭建
    • 2. 编译rust内核
      • 2.1 下载源代码
      • 2.2 安装rust支持
      • 2.3 检查linux内核是否支持rust
      • 2.4 编译linux内核
    • 3. aarch64的qemu环境
      • 3.1.下载源代码
      • 3.2. 解压编译安装
      • 3.3. 配置环境变量
      • 3.4.验证
    • 4. 准备debian文件系统
      • 4.1 下载文件系统
      • 4.2 解压缩
      • 4.3 测试下载的内核和文件系统
    • 5. 运行自己编译的内核
      • 5.1 拷贝自己编译的内核
      • 5.2 运行自己编译的内核
    • 6. rust模块
      • 6.1 编译linux中的rust用例
      • 6.2 自己编写一个rust的helloworld驱动

[清华开源操作系统训练营]《Rust fox Linux》课程的练习1-2完整版记录。

1. 环境搭建

我们基于Ubuntu22.04进行环境搭建,需要安装编译内核的包和LLVM等包:

sudo apt-get -y install binutils build-essential libtool texinfo gzip zip unzip patchutils curl git make cmake ninja-build automake bison flex gperf grep sed gawk bc zlib1g-dev libexpat1-dev libmpc-dev libglib2.0-dev libfdt-dev libpixman-1-dev libelf-dev libssl-dev clang-format clang-tidy clang-tools clang clangd libc++-dev libc++1 libc++abi-dev libc++abi1 libclang-dev libclang1 liblldb-dev libllvm-ocaml-dev libomp-dev libomp5 lld lldb llvm-dev llvm-runtime llvm python3-clang llvm

2. 编译rust内核

2.1 下载源代码

git clone https://github.com/Rust-for-Linux/linux -b rust-dev

我们使用Rust-for-Linux的rust-dev分支进行学习。

2.2 安装rust支持

cd linux-rust
rustup override set $(scripts/min-tool-version.sh rustc)
rustup component add rust-src
cargo install --locked --version $(scripts/min-tool-version.sh bindgen) bindgen-cli

2.3 检查linux内核是否支持rust

jian@jian:~/share/linux-rust$ make LLVM=1 rustavailable
Rust is available!

2.4 编译linux内核

首先生成配置文件.config

make ARCH=arm64 LLVM=1 O=build defconfig

然后修改配置文件,把CONFIG_RUST设置为y

make ARCH=arm64 LLVM=1 O=build menuconfig

最后编译内核

cd build && make ARCH=arm64 LLVM=1 -j8

3. aarch64的qemu环境

3.1.下载源代码

https://download.qemu.org/qemu-7.0.0.tar.xz

3.2. 解压编译安装

tar -xf qemu-7.0.0.tar.xz
cd qemu-7.0.0
mkdir build-aarch64 && cd build-aarch64
../configure --target-list=aarch64-softmmu,aarch64-linux-user
make -j $(nproc)

3.3. 配置环境变量

在~/.bashrc文件中添加下面语句:

export PATH=$PATH:/home/jian/share/qemu/qemu-7.0.0/build-aarch64
export PATH=$PATH:/home/jian/share/qemu/qemu-7.0.0/build-aarch64/aarch64-softmmu
export PATH=$PATH:/home/jian/share/qemu/qemu-7.0.0/build-aarch64/aarch64-linux-user

3.4.验证

新开一个控制台输入下面:

jian@jian:~/share/qemu/qemu-7.0.0$ qemu-system-aarch64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
jian@jian:~/share/qemu/qemu-7.0.0$ qemu-aarch64 --version
qemu-aarch64 version 7.0.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
jian@jian:~/share/qemu/qemu-7.0.0$ 

4. 准备debian文件系统

4.1 下载文件系统

去Debian官方网站上下载 Images for arm64-virt 版本的压缩包:
https://people.debian.org/~gio/dqib/

4.2 解压缩

unzip arm64-virt.zip

解压缩后可以看到下面的内容:

jian@jian:~/share/arm64-virt$ tree
.
├── arm64-virt.zip
└── dqib_arm64-virt├── Image├── image.qcow2├── initrd├── kernel├── mymake├── readme.txt├── ssh_user_ecdsa_key├── ssh_user_ed25519_key└── ssh_user_rsa_key1 directory, 10 files

4.3 测试下载的内核和文件系统

执行下面的命令可以尝试把整个的debian文件系统跑起来:

qemu-system-aarch64 -machine 'virt' -cpu 'cortex-a57' -m 1G -device virtio-blk-device,drive=hd -drive file=image.qcow2,if=none,id=hd -device virtio-net-device,netdev=net -netdev user,id=net,hostfwd=tcp::2222-:22 -kernel kernel -initrd initrd -nographic -append "root=LABEL=rootfs console=ttyAMA0"

5. 运行自己编译的内核

5.1 拷贝自己编译的内核

cp ~/share/linux-rust/build/arch/arm64/boot/Image /home/jian/share/arm64-virt/dqib_arm64-virt

5.2 运行自己编译的内核

qemu-system-aarch64 -machine 'virt' -cpu 'cortex-a57' -m 1G -device virtio-blk-device,drive=hd -drive file=image.qcow2,if=none,id=hd -device virtio-net-device,netdev=net -netdev user,id=net,hostfwd=tcp::2222-:22 -kernel Image -initrd initrd -nographic -append "root=LABEL=rootfs console=ttyAMA0"

6. rust模块

6.1 编译linux中的rust用例

make ARCH=arm64 LLVM=1 O=build menuconfig
cd build && make ARCH=arm64 LLVM=1 -j8

把CONFIG_SAMPLE_RUST_PRINT和CONFIG_SAMPLE_RUST_MINIMAL选上。然后在编译。
可以看到下面的输出:

[    2.836088] rust_minimal: Rust minimal sample (init)
[    2.836386] rust_minimal: Am I built-in? true
[    2.837094] rust_print: Rust printing macros sample (init)
[    2.837225] rust_print: Emergency message (level 0) without args
[    2.837379] rust_print: Alert message (level 1) without args
[    2.837610] rust_print: Critical message (level 2) without args
[    2.837805] rust_print: Error message (level 3) without args
[    2.838325] rust_print: Warning message (level 4) without args
[    2.838456] rust_print: Notice message (level 5) without args
[    2.838579] rust_print: Info message (level 6) without args
[    2.838712] rust_print: A line that is continued without args
[    2.839166] rust_print: Emergency message (level 0) with args
[    2.839481] rust_print: Alert message (level 1) with args
[    2.839803] rust_print: Critical message (level 2) with args
[    2.840127] rust_print: Error message (level 3) with args
[    2.840456] rust_print: Warning message (level 4) with args
[    2.840587] rust_print: Notice message (level 5) with args
[    2.841027] rust_print: Info message (level 6) with args
[    2.841338] rust_print: A line that is continued with args
[    2.841794] rust_print: 1
[    2.842115] rust_print: "hello, world"
[    2.842667] rust_print: [../samples/rust/rust_print.rs:34] c = "hello, world"

6.2 自己编写一个rust的helloworld驱动

线进入samples/rust目录,编写一个rust的驱动rust_hello.rs:

// SPDX-License-Identifier: GPL-2.0
//! Rust minimal sample.use kernel::prelude::*;module! {type: RustHelloWorld,name: "rust_helloworld",author: "whocare",description: "hello world module in rust",license: "GPL",
}struct RustHelloWorld {}impl kernel::Module for RustHelloWorld {//fn init(_name: &'static CStr, _module: &'static ThisModule) -> Result<Self> {fn init(_module: &'static ThisModule) -> Result<Self> {pr_info!("Hello World from Rust module");Ok(RustHelloWorld {})}
}

然后在Makefile文件中添加:

obj-y        += rust_hello.o

最后再次编译和运行,可以看到下面的输出:

[    2.843635] rust_helloworld: Hello World from Rust module

相关文章:

  • 2311rust模式匹配
  • node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)
  • 头歌答案HTML——基础
  • 国际阿里云:Linux实例负载高问题排查和异常处理!!!
  • 【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)
  • 未来的拥塞控制与 Linux EEVDF 调度器
  • 在AutoDL云环境上训练Stable Diffusion Lora模型
  • 美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23
  • 免费博客搭建笔记
  • 基于springboot实现驾校管理系统项目【项目源码】计算机毕业设计
  • vuex中的 actions 中,是不能使用 this.$message.error() 的
  • Java学习_对象
  • 关于安卓刷机,小米手机,各种安卓手机,理念+实践,如:小米8
  • Netty底层原理
  • acwing算法基础之搜索与图论--BFS
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • ECMAScript入门(七)--Module语法
  • emacs初体验
  • Github访问慢解决办法
  • java多线程
  • LeetCode算法系列_0891_子序列宽度之和
  • mockjs让前端开发独立于后端
  • React Transition Group -- Transition 组件
  • Redis学习笔记 - pipline(流水线、管道)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 前言-如何学习区块链
  • 实习面试笔记
  • 阿里云API、SDK和CLI应用实践方案
  • ​你们这样子,耽误我的工作进度怎么办?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #NOIP 2014# day.1 T2 联合权值
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (13)Hive调优——动态分区导致的小文件问题
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Core 版本不支持的问题
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 中插件式开发实现
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net wcf memory gates checking failed
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 无限分类
  • .NET框架
  • @PreAuthorize注解
  • @vue/cli脚手架
  • [ C++ ] STL---string类的使用指南
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BZOJ 1040] 骑士
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [DevOps云实践] 彻底删除AWS云资源
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日
  • [Gamma]阶段测试报告