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
相关文章:
rust_for_linux驱动完整版记录
文章目录 [清华开源操作系统训练营]《Rust fox Linux》课程的练习1-2完整版记录。1. 环境搭建2. 编译rust内核2.1 下载源代码2.2 安装rust支持2.3 检查linux内核是否支持rust2.4 编译linux内核 3. aarch64的qemu环境3.1.下载源代码3.2. 解压编译安装3.3. 配置环境变量3.4.验证 …...
Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)
Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6) Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图,Kotlin(5)-CSDN博客文章浏览阅读1.3k次。Android Dyna…...
计算机网络课后作业2023秋
计算机网络第三版吴功宜版 课后作业 第一章作业三、计算与问答3.73.8 第二章作业三、计算与问答3.23.53.6 第三章作业三、计算与问答3.13.53.73.8 第四章作业三、计算与问答3.13.2 第五章作业三、计算与问答3.13.33.4VLAN交换机模式模式切换重置交换机VLAN配置命令其…...
阿里云国际站:全球加速GA
文章目录 一、前言 二、阿里云全球加速的概念 三、阿里云全球加速的功能优势 四、阿里云全球加速的原理 五、阿里云全球加速的应用场景 六、写在最后 一、前言 随着互联网的快速发展,网站速度已经成为了用户访问体验的一个重要指标。阿里云加速作为一种新的技…...
M2LC-Net
模型结构 作者未提供代码...
Jenkins 质量扫描
代码质量扫描工具(SonarQube) 质量评审 SonarQube有四个关键组件 ◼ SonarQube Server运行有三个组件 ◆ Web Server:UI ◆ Search Server:为UI提供搜索功能,基于ElasticSearch ◆ Compute Engine Server:…...
【LeetCode刷题笔记】滑动窗口
992. K 个不同整数的子数组 解题思路: 滑动窗口 , 题目问题转化为: 求 「最多存在 K 个不同整数的子数组的个数」 与 「最多存在 K - 1 个不同整数的子数组的个数」 之差, 就是题目所求的 「恰好存在 K 个不同整数的子数组的个数」 , 最终问题就变成求解滑动窗口内,以 R …...
笔试题之指针和数组的精讲
𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...
.secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
导言: 勒索病毒成为了网络安全的一项严峻挑战,其中.secret勒索病毒尤为引人注目。这种恶意软件通过加密用户的数据文件,使其无法访问,并勒索受害者支付赎金以获取解密密钥。本文将介绍.secret勒索病毒的基本信息,以及…...
junit写搜索树测试
用法 assertTrue(range.contains("Two")); 2个参数,右边错就打印左边. AbstractSelfBalancingBinarySearchTree abt; AbstractBinarySearchTree.Node node; Before public void setUp() { abt new AbstractSelfBalancingBinarySearchTree() { Override protecte…...
顺丰接口对接-订单创建与取消(java单元测试)
api文档 下单接口 :https://qiao.sf-express.com/Api/ApiDetails?level3393&interName%E4%B8%8B%E8%AE%A2%E5%8D%95%E6%8E%A5%E5%8F%A3-EXP_RECE_CREATE_ORDER 取消订单接口: https://qiao.sf-express.com/Api/ApiDetails?level3339&interNa…...
C++:OJ练习(每日练习!)
编程题: 题一:计算日期到天数的转换 计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 示例1 输入: 2012 12 31 输出: 366 思路一: 第一步:创建年,月,日的变量,并按…...
GPTs Hunter 是什么?
原文: https://openaigptguide.com/openai-gpts-hunter/ GPTs Hunter 是一个功能强大的免费导航网站,支持多语言,提供用户友好的界面。 GPTs Hunter:功能强大的免费导航网站 GPTs Hunter是一个功能强大的免费导航网站ÿ…...
【移远QuecPython】EC800M物联网开发板的硬件TIM定时器精准延时
【移远QuecPython】EC800M物联网开发板的硬件TIM定时器精准延时 文章目录 导入库定时器初始化延时函数定时中断回调调用函数打包附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 首先 这个定时器是硬件底层级别的 优先级最高 如果调用 会导致GN…...
HDU 1027:Ignatius and the Princess II ← next_permutation()
【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid1027【题目描述】 Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5…...
主题讲座:全球增材制造现状与未来(暨香港科技大学广州|智能制造学域2024博士学位全额奖学金项目)
时间:2023 年11月16日(星期四)14:30 地点:合肥工业大学 学术会议中心三楼报告厅 主讲嘉宾:陈模军 助理教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/CHEN-Mojun/mjchen 报名表直达࿱…...
hugeGraph修改PropertyKey属性类型
修改PropertyKey字段属性的类型,发现没办法保留数据的前提下修改,智能是先删除数据,然后再修改,或者备份后修改再恢复。 方法一、 修改groovy脚本中的Text为Int后重新建元数据 schema.propertyKey(“youkey”).asText().valueSing…...
vscode 访问本地或者远程docker环境
1、vscode 访问docker本地环境 直接点击左下角连接图标,弹出选项可以选择容器,只要容器在本地运行者,选择attach可以看到运行中的容器可以选择,选择其中需要选择的就行 ## 运行容器,可以-d后台运行都可以 docker run…...
人工智能与充电技术:携手共创智能充电新时代
人工智能与充电技术:携手共创智能充电新时代 摘要:本文探讨了人工智能与充电技术的结合及其在未来充电设施领域的应用。通过分析智能充电系统的技术原理、优势以及挑战,本文展望了由人工智能驱动的充电技术为未来电动交通带来的巨大变革与机…...
『自定义B站视频播放速度』
哔哩哔哩 的最高播放速度是 2.0, 但对于我们这种程序员来说,2.0 速度观看学习视频还是稍微慢了点, 🫵🏻3.0 以上才是王道🫵🏻, 下面就是具体的操作方法: ① 在浏览器…...
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser 在处理第三方AP…...
2026年Win11强力清理工具推荐:安全无广告的C盘瘦身软件怎么选?
我是个学生党,笔记本电脑的C盘从买回来就没清理过,最近装新游戏时直接提示空间不足。网上搜“Win11强力清理工具推荐”,跳出来一堆软件,看着都挺好,但又怕下载到带捆绑、弹广告的流氓软件。我只是想要一个能真正把C盘腾…...
整理 主流国产AI龙虾的核心能力对比表(支持平台/部署方式/适用场景)腾讯WorkBuddy 阿里JVS Claw 百度DuMate
根据当前的资料,腾讯WorkBuddy和百度的DuMate当前有一定一定量的免费额度,大家可以用起来! 主流国产AI龙虾的核心能力对比表 五款主流国产AI龙虾的核心能力对比表已整理完成,涵盖支持平台、部署方式与适用场景三大维度ÿ…...
终极Win11Debloat优化指南:简单4步让你的Windows 11飞起来
终极Win11Debloat优化指南:简单4步让你的Windows 11飞起来 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
QT6.5串口编程第一步:用CMakeLists.txt引入SerialPort模块的避坑指南
QT6.5串口编程避坑指南:CMakeLists.txt配置全解析 当你满怀期待地在QT6.5项目中引入串口通信功能,却在编译时遭遇"找不到QtSerialPort"的红色错误提示,这种挫败感我深有体会。作为一位经历过无数次类似"战斗"的开发者&am…...
云原生图书馆管理系统架构设计:基于SaaS的一站式解决方案与实战案例分析
某中学图书馆数字化改造实战:传统Excel管理迁移至云端系统,借还效率提升300%,系统响应时间降低至200ms以内一、背景:传统图书馆管理的痛点分析1.1 技术债务积累在数字化转型的过程中,许多中小型学校图书馆依然停留在传…...
告别卡顿!用MobileNetv2+MPPTSNet-EC在树莓派上跑实时语义分割(附完整配置与性能测试)
树莓派实战:MobileNetv2MPPTSNet-EC实时语义分割全流程解析 当你在树莓派上第一次看到摄像头画面被实时分割成不同语义区域时,那种成就感绝对值得记录。本文将带你完整实现从模型选择到部署优化的全流程,用MobileNetv2MPPTSNet-EC这套组合拳&…...
别再纠结选哪个了!实测对比PP-OCRv4、v3、读光等主流开源OCR模型(附完整代码与数据集)
主流开源OCR模型实战评测:从技术指标到业务落地的全维度解析 每次打开GitHub搜索OCR项目时,总会被琳琅满目的模型搞得眼花缭乱——PP-OCR系列、读光、DBNet...每个项目主页都宣称自己"精度最高"、"速度最快"。但当你真正把这些模型部…...
从HTTP到字节流:ESP32与App Inventor通信协议的效率优化实践
1. 为什么需要优化ESP32与App Inventor的通信协议? 当你用ESP32和App Inventor做一个遥控小车时,最让人抓狂的就是按下按钮后小车要等半秒才有反应。这种延迟问题在HTTPJSON通信方案中非常典型。我去年做过一个智能家居控制系统,最初用的就是…...
AI赋能情感短视频:5分钟打造电影级氛围感剪辑全攻略
深夜收到粉丝私信:“同样的素材,为什么专业博主的视频能让人眼眶湿润,我的却像流水账?”这个问题击中了短视频创作的核心痛点——氛围感缺失。传统剪辑需要导演思维专业技巧数小时打磨,而如今,借助AI工具&a…...
