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 以上才是王道🫵🏻, 下面就是具体的操作方法: ① 在浏览器…...
intv_ai_mk11行业落地:教育机构课件辅助生成、HR招聘文案批量产出案例
intv_ai_mk11行业落地:教育机构课件辅助生成、HR招聘文案批量产出案例 1. 模型能力与行业价值 intv_ai_mk11作为一款基于Llama架构的文本生成模型,在教育培训和人力资源领域展现出独特的实用价值。这个开箱即用的解决方案特别适合需要快速处理大量文本…...
Easypoi导出Excel时,如何优雅地处理‘未知’或‘空值’?一个replace动态替换的实战技巧
Easypoi动态替换Excel导出中的未知值与空值:实战技巧与最佳实践 在数据导出场景中,我们经常遇到数据库枚举值与Excel展示不匹配的问题。比如性别字段,除了标准的"男"、"女"外,还可能存在空值或超出预设范围的…...
Java泛型中的List
本文将详细回答java泛型中的listt extends base>使用问题。 在java中,泛型提供了强大的类型安全机制,但其一些特点也容易引起混淆,如listt extends base>开发者经常感到困难。假设sub是base的子类:public class base { }pub…...
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 问题诊断:你的右键菜单是…...
软文SEO的常见指标有哪些_如何撰写有吸引力的软文标题
<h2>软文SEO的常见指标有哪些</h2> <p>在当今的数字营销领域,软文(Soft Article)已经成为推动网站流量和品牌知名度的重要工具。要让软文真正发挥作用,我们必须了解软文SEO的常见指标,这些指标可以帮…...
ncmdumpGUI:网易云音乐加密文件转换的完整解决方案
ncmdumpGUI:网易云音乐加密文件转换的完整解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 一、初识ncmdumpGUI:解密音乐文件的…...
InternLM2-Chat-1.8B助力在线教育:个性化作业批改与学习反馈生成
InternLM2-Chat-1.8B助力在线教育:个性化作业批改与学习反馈生成 1. 引言:当作业批改遇上AI 想象一下,一位老师深夜还在批改几十份、甚至上百份学生作业。面对相似的错误,需要一遍遍写下相同的评语;面对有潜力的答案…...
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础 1. 引言:语音合成的零门槛体验 你是否曾经想过为自己的项目添加语音功能,却被复杂的代码和配置吓退?现在,借助Qwen3-TTS-12Hz-1.7B-Base镜像,…...
知识科普短片,AI如何“看懂”并剪出逻辑?揭秘分段剪辑的内在逻辑链
傍晚,你面对电脑屏幕,刚刚录完一段长达2小时的行业知识分享。你的目标是将其剪成一部15分钟、节奏明快的知识科普短片。手动操作意味着你要反复聆听,识别核心论点,标记关键转折,再小心翼翼地将碎片串联——这个过程动辄…...
5分钟搞定!Clipy剪贴板管理神器让Mac效率翻倍
5分钟搞定!Clipy剪贴板管理神器让Mac效率翻倍 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 还在为macOS只能记住最后一次复制内容而烦恼吗?Clipy是一款专为Mac用户设计的剪贴板…...
