LWN:如何在 kernel 里写 Rust 代码:第一部分!

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

关注了就能看到更多这么棒的文章哦~

How to write Rust in the kernel: part 1

By Daroc Alden
June 20, 2025
Rust in the kernel
Gemini flash translation
https://lwn.net/Articles/1024202/

Linux 内核中 Rust 代码的数量正在稳步增长。随着 Rust 代码变得越来越普遍,维护者们可能希望了解如何阅读、审查和测试与其专业领域相关的 Rust 代码。正如内核 C 代码与用户空间 C 代码有所不同一样,内核 Rust 代码也与用户空间 Rust 代码有些许不同。这一事实使得 Rust 详尽的文档的作用不如预期,并意味着具有用户空间经验的潜在贡献者将需要一些额外的指导。本文是系列文章的第一部分,旨在帮助现有内核贡献者熟悉 Rust,并帮助现有 Rust 程序员了解内核与典型 Rust 项目的不同之处。

为了为本系列其余文章奠定基础,本文将对 Rust 工具的安装和配置进行高层次概述,并解释 Rust 如何融入内核现有的构建系统。未来的文章将涵盖 Rust 如何融入内核的维护模式,用 Rust 编写驱动程序需要考虑什么,Rust 接口与内核其余部分的设计,以及审查 Rust 代码时需要注意的具体事项。

前提准备

尽管 GCC 上对 Rust 的支持正在迎头赶上,并且 `rustc_codegen_gcc` 代码生成后端现在能够编译内核的 Rust 组件,但 Rust for Linux 项目目前仅支持使用纯粹的 `rustc` 进行构建。由于 `rustc` 使用 LLVM,该项目还建议在处理 Rust 代码时,整个内核都使用 Clang 进行构建(尽管在 C 侧使用 GCC 而在 Rust 侧使用 LLVM 也是可行的)。构建过程还需要 bindgen 来生成 C/Rust API 绑定,以及一份 Rust 标准库的副本,以便能够使用内核所需的标志进行构建。因此,以推荐方式构建内核至少需要 Clang、lld、LLVM、Rust 编译器、Rust 标准库的源代码形式以及 bindgen。

许多 Linux 发行版都提供了这些工具足够新的版本;Rust 快速启动文档提供了针对不同发行版的安装说明。所需的 `rustc` 最低版本是 2024 年 5 月发布的 1.78.0。Rust for Linux 项目已承诺不会不必要地提高最低要求版本。根据 Miguel Ojeda 的说法,目前的非正式计划是,一旦 Debian stable 中的版本赶上目前的最低要求(很可能在今年晚些时候),就将沿用该版本。

Rust 开发者可能还应该安装 Clippy(Rust 的代码 Lint 工具),rustdoc(Rust 的文档构建工具)和 rust-analyzer(Rust 的 语言服务器),但这些并非严格必需。Rust for Linux 项目力求代码没有 Lint 警告,因此引入新警告的补丁可能会被维护者不看好。在内核源码根目录运行 `make rustavailable` 命令会检查所需的工具是否安装了兼容的版本。实际上,这里讨论的所有命令都应该在仓库的根目录运行。`make rust-analyzer` 命令将为 rust-analyzer 设置配置文件,使其能够与支持语言服务器的编辑器(如 Emacs 或 Vim)无缝协作。

Rust 代码由两个独立的内核配置值控制。当兼容的工具可用时,`CONFIG_RUST_IS_AVAILABLE` 会自动设置;而 `CONFIG_RUST`(可在“General Setup → Rust support”下找到)则控制是否实际构建任何 Rust 代码,并依赖于第一个选项。与绝大多数用户空间 Rust 项目不同,内核不使用 Cargo(Rust 的包管理器和构建工具)。相反,内核的 makefile 会直接调用 Rust 编译器,其方式与调用 C 编译器相同。因此,只需将对象添加到正确的 make 目标即可构建 Rust 模块:

obj-$(CONFIG_RUST) += object_name.o

由 `CONFIG_RUST` 直接启用的代码主要是 C 和 Rust 之间的支持代码和绑定,因此它并不能代表大多数 Rust 驱动代码的实际样子。启用 Rust 示例代码(在“Kernel hacking → Sample kernel code → Rust samples”下)可能会提供更具代表性的示例。

Testing

Rust 的测试和 Lint 工具也已集成到内核现有的构建系统中。要运行 Clippy,请在 `make` 调用中添加 `CLIPPY=1`;这将执行一次特殊的内核构建,启用调试选项,使其不适合生产使用,因此应谨慎操作。`make rustdoc` 将构建一份 Rust 文档的本地副本,同时也会检查一些文档警告,例如缺少文档注释或格式错误的文档内部链接。测试可以使用 kunit.py 运行,它是内核的白盒单元测试工具。该工具确实需要额外的参数来设置 Rust 构建所需的配置变量:

./tools/testing/kunit/kunit.py run --make_options LLVM=1 \    --kconfig_add CONFIG_RUST=y --arch=<host architecture>

实际定位失败的测试用例可能会让熟悉 KUnit 测试的人感到困惑。与内核的 C 代码通常将 KUnit 测试写在单独文件中不同,Rust 代码的测试往往与其测试的代码位于同一文件中。惯例是使用独立的 Rust 模块 来将测试代码与主命名空间隔离(并启用条件编译,这样它就不会包含在发布内核中)。这个模块通常(富有想象力地)被称为“test”,并且必须使用 `#[kunit_tests(test_name)]` 宏进行注解。该宏实现在 rust/macros/kunit.rs 中;它会遍历被注解的模块,查找用 `#[test]` 标记的函数,并设置 KUnit 自动识别测试用例所需的 C 声明。

然而,Rust 还有另一种测试,它不直接对应于 C 单元测试。“Doctest”(文档测试)是嵌入在函数文档中的测试,通常展示了如何使用该函数。因为它是一个真实的测试,所以 Doctest 可以被信赖地保持最新,而仅仅是示例则可能无法做到。此外,Doctest 会作为自动生成的 Rust API 文档的一部分进行渲染。Doctest 也会作为 KUnit 测试套件的一部分运行,但必须明确启用(在“Kernel hacking → Rust hacking → Doctests for the `kernel` crate”下)。

一个包含 Doctest 的函数示例(从 Rust 字符串辅助函数中稍作修改)如下所示:

/// Strip a prefix from `self`. Delegates to [`slice::strip_prefix`].////// # Examples////// ```/// # use kernel::b_str;/// assert_eq!(///     Some(b_str!("bar")),///     b_str!("foobar").strip_prefix(b_str!("foo"))/// );/// assert_eq!(///     None,///     b_str!("foobar").strip_prefix(b_str!("bar"))/// );/// assert_eq!(///     Some(b_str!("foobar")),///     b_str!("foobar").strip_prefix(b_str!("")));/// assert_eq!(///     Some(b_str!("")),///     b_str!("foobar").strip_prefix(b_str!("foobar"))/// );/// ```pubfnstrip_prefix(&self, pattern: implAsRef<Self>) -> Option<&BStr>{self.deref().strip_prefix(pattern.as_ref().deref()).map(Self::from_bytes)}

Rust 代码中正常的注释以 `//` 开头。文档注释则由各种工具处理,以 `///`(用于注释后续项)或 `//!`(用于注释包含项)开头。它们是等效的:

/// DocumentationstructName{     ...}structName{//! Documentation     ...}

文档注释类似于内核 C 代码中使用的特殊格式 `/**` 注释。在这个 Doctest 中,`assert_eq!()` 宏(这是 Rust 中另一种宏调用的示例)用于比较 `.strip_prefix()` 方法的返回值与其预期值。

Quick reference

# Check Rust tools are installedmake rustavailable# Build kernel with Rust enabled# (After customizing .config)make LLVM=1# Run tests./tools/testing/kunit/kunit.py \   run \  --make_options LLVM=1 \  --kconfig_add CONFIG_RUST=y \  --arch=<host architecture># Run lintermake LLVM=1 CLIPPY=1# Check documentationmake rustdoc# Format codemake rustfmt

最后,Rust 代码还可以包含 内核自测试(kernel selftests),这是内核编写测试的第三种方式。这些测试需要单独配置,使用 `tools/testing/selftests/rust` 目录中的内核配置片段。Kselftests 旨在在已启动相应内核的机器上运行,并可通过 `make TARGETS="rust" kselftest` 命令运行。

Formatting

Rust 的语法很复杂。这是该语言推广过程中的几个症结之一,因为人们常常觉得它让语言难以阅读。这个问题不能完全通过格式化工具解决,但它们确实有帮助。Rust 的标准格式化工具名为 `rustfmt`,如果安装了该工具,则可以使用 `make rustfmt` 命令来重新格式化内核中的所有 Rust 代码。

Next

构建和测试 Rust 代码是审查 Rust 代码的必要条件,但并非充分条件。然而,这可能足以让人们开始尝试内核中现有的 Rust 代码。接下来,我们将深入比较一个简单的驱动模块及其 Rust 等效实现,以此作为内核 Rust 驱动抽象的介绍。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

rust-kernel:一个小的多任务卵石启发了用Rust编写的内核 x86 Rust内核 这是用Rust编写的x86多线程内核的实现。 内核当前支持内核级线程,虚拟文件​​系统(受Linux启发)和原始驱动程序框架(受Windows启发)。 去做: IDE驱动程序。 ELF解析器。 用户空间加载器。 系统调用。 进程生命周期(fork / exec / wait /消失)。 调度(收益/调度/ make_runnable /睡眠)。 内存管理(mmap / munmap)。 IPC(???)。 安全性得到改善(去除包装纸等)。 动态加载,内核模块。 建造 内核必须由使用夜间配置构建的1.1.0之后的Rust编译器构建,以支持不稳定的功能和drop_in_place函数。 该构建链接到lib目录中预编译的libcore版本。 如果编译器的版本与用于编译libcore的版本不同,则可能会出现恐慌。 如果发生这种情况,请重新编译libc 立即下载

相关推荐

【UE5】【蓝图】 LevelSequence 动画播放与暂停

最近有些工作,在研究UE5 蓝图的LevelSequence,来制作一些简单动画。做个笔记,记录一下动画更换绑定actor的操作,以及动画播放后如何暂停和继续。

UE5开发备忘录 1万+

LWN:使用Rust进行Linux kernel开发!

Supporting Linux kernel development in RustAugust 31, 2020This article was contributed by Nel...

Linux News搬运工 1085

CAPL自动化测试

通过本文的学习,读者应该对CAPL自动化测试有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1526

LWN: Linux kernel 中的Rust!

关注了就能看到更多这么棒的文章哦~The Rust for Linux projectBy Jonathan CorbetSeptember 16, 2021KangrejosDeepL ...

Linux News搬运工 838

支付域——账户系统设计

本文详细介绍了支付域中的账户系统设计,包括账户的定义、核心特征、常见类型以及在支付系统中的作用。账户是支付平台为用户、商户等主体建立的资金记录单元,具有资金归属、余额管理、交易流水、资金安全等核心特征。常见账户类型包括用户账户、商户账户、平台账户、保证金账户等。此外,还探讨了账户与银行账户的区别、账户的结构设计、如何设计账户类型以及账户系统设计等内容。

庄小焱 1189

搞定ESD(七):静电放电问题典型案例分析(二)

静电放电噪声耦合的方式主要是:传导耦合与辐射耦合,辐射耦合主要以磁场耦合、 电场耦合为主要形式。电场耦合发生的主要条件是:静电放电高频在参考地平面寄生电感中产生电平波动,平行于参考地平面上的较长信号布线就很容易通过分布电容发生电场耦合。根据高速信号回流路径的特性可知,其回流路径是贴近信号布线下方,或者信号两侧,若信号回流路径跨分割后,环路面积会随之增大;信号环路面积大从EMI角度看其空间辐射更强,从EMS角度看则更容易耦合外部噪声干扰(雷击浪涌、EFT、ESD、RS)。

记得诚 2800

使用Rust编写Linux内核模块:一个创新的实践

使用Rust编写Linux内核模块:一个创新的实践 项目地址:https://gitcode.com/gh_mirrors/lin/linux-kernel-module-rust 在软件开发领域,Rust语言以其强大的安全性和高性能赢得了开发者们的喜爱。然而,传统的Linux内核模块多数是用C或C++编写的,这通常涉及到内存管理和并发问题,可能会引入安全隐患。现在, 开发的一个项目,将Rust带...

gitblog_00006的博客 982

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1342

LWN:如何在kernel里写Rust代码——第二部分!

在用户空间的 Rust 项目中,程序通常也会从 std(Rust 的标准库)中导入一些内容,但在内核中这不可行,因为内核需要对内存分配和其他标准库抽象掉的细节有更精确的控制。的形式书写,它适用于其所出现的定义内部。约定俗成是,对于返回值的宏使用圆括号,而对于调用以定义结构体的宏使用花括号(此处即是这种情况),但这并非强制要求。在驱动程序的 C 版本中,下一步是定义一些常量,它们代表了该驱动程序支持的三种不同但相关的设备:AX88772A、AX88772C 和 AX88796B。每个板卡对应的类型(例如。

Linux News搬运工 1725

YOLO11改进-注意力-引入Deformable Large Kernel Attention (DLKA) 解决多尺度、小目标、遮挡等问题

Deformable Large Kernel Attention (DLKA) 是一种用于视觉任务的注意力机制,旨在提升模型在处理不同尺寸和形状对象时的灵活性和性能。DLKA 的设计灵感源自传统的注意力机制,但通过引入可变形核(deformable kernel)来增强对局部特征的适应能力。

qq_64693987的博客 4041

TC3XX - MCAL知识点(二十九):FLS MCAL配置及代码实战(英飞凌DFLASH)

FLS驱动程序为DFlash 0的初始化、读取、写入和擦除提供了定义良好的配置和标准服务。除此之外,我们还提供一些非autosar服务示例 Fls_17_Dmu_CompareWordsSync、Fls_17_Dmu_CancelNonEraseJobs、Fls_17_Dmu_VerifyErase,LFls_17_Dmu_VerifySectorErase、Fls_17_Dmu_GetNotifCaller等。用户通过FLS驱动程序获得对底层DFlash0的封装访问。

梦想技术家 2363

LWN: kernel 快要有 Rust 了?

关注了就能看到更多这么棒的文章哦~Rust heads into the kernel?By Jake EdgeApril 21, 2021DeepL assisted translati...

Linux News搬运工 411

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 87

LWN:Rust 另一些对 kernel 有用的特性!

关注了就能看到更多这么棒的文章哦~More Rust concepts for the kernelBy Jonathan CorbetSeptember 20, 2021Kangrejo...

Linux News搬运工 476

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LWN:内核处理Rust代码的流程!

Hindborg 同意,但他也指出,在块(block)子系统中,开发者进行更改时并不担心 Rust 方面的问题。当他收到问题报告时,他会在一天内修复它,一切都会很好。如果 Rust 代码要通过常规的子系统树(subsystem trees),那么维护者至少应该对这些代码进行构建测试(build tests),并且应该有一个明确的方案来应对构建出错(build break)的情况。在他的结论中,他重申,自 6.10 版本以来,Rust 编译器的最低版本一直保持在 1.78.0,即使较新的版本已经获得了支持。

Linux News搬运工 1659

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LWN: Rust 中对于Linux kernel有用的关键特性!

关注了就能看到更多这么棒的文章哦~Key Rust concepts for the kernelBy Jonathan CorbetSeptember 17, 2021Kangrejos...

Linux News搬运工 518

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LWN:维护者峰会上讨论Rust in kernel!

关注了就能看到更多这么棒的文章哦~Using Rust for kernel developmentBy Jonathan CorbetSeptember 27, 2021Maintain...

Linux News搬运工 225

LWN:学习Rust内核开发的可用资源!

关注了就能看到更多这么棒的文章哦~Resources for learning Rust for kernel developmentBy Daroc AldenSeptember 23, 2024Kangrejos 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/990619/Dirk Behme 在 Kangrejos 2024...

Linux News搬运工 1456

LWN:内核热点: folio,多代LRU,以及Rust!

关注了就能看到更多这么棒的文章哦~The kernel radar: folios, multi-generational LRU, and RustBy Jonathan CorbetJ...

Linux News搬运工 1822

LWN: 内核 Rust 实验的现状

关于将核心内核(core-kernel)对 Rust 代码的依赖性,Airlie 表示,这在未来一两年内不应该发生。Kroah-Hartman 说,他曾担心核心内核和 Rust 驱动程序之间的交互,但发现交互比他预期的少得多。Ojeda 说他已经调查过,认为它应该可以工作,但他不知道目前的状况。Ojeda 总结说,用 Rust 工作的能力成功地吸引了新的开发者和新的维护者,这是该项目最初的目标之一。他说,更重要的消息是,运行 6.12 内核的 Android 16 系统正在搭载 Rust 编写的。

Linux News搬运工 200

LWN:内核中Rust支持的下一步动作!

关注了就能看到更多这么棒的文章哦~Next steps for Rust in the kernelBy Jonathan CorbetSeptember 19, 2022Maintainers SummitDeepL assisted translationhttps://lwn.net/Articles/908347/Rust for Linux 这个项目是希望今后可以使用 Rust 编程语言...

Linux News搬运工 352

LWN:6.2内核中的Rust!

关注了就能看到更多这么棒的文章哦~Rust in the 6.2 kernelBy Jonathan CorbetNovember 17, 2022DeepL assisted translationhttps://lwn.net/Articles/914458/6.1 版本的合并窗口带来了对用 Rust 编写内核代码的基本支持,这里的关键词是 "基本"。在 6.1 版本中可以创建一个 "hell...

Linux News搬运工 734

LWN:6.3合并窗口的第二部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.3 merge windowBy Jonathan CorbetMarch 6, 2023DeepL assisted translationhttps://lwn.net/Articles/924384/Linus Torvalds 于 3 月 5 日发布了 6.3-rc1,按时关闭了 6.3 合并窗口。那时已经有 12717...

Linux News搬运工 897

LWN:6.2合并窗口的第二部分!

关注了就能看到更多这么棒的文章哦~The rest of the 6.2 merge windowBy Jonathan CorbetDecember 27, 2022DeepL assisted translationhttps://lwn.net/Articles/918146/今年,世界收到了从 Linus Torvalds 来的一份特殊的圣诞礼物:6.2-rc1 kernel prepat...

Linux News搬运工 569

LWN:6.10 合并窗口前半部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.10 merge windowBy Jonathan CorbetMay 16, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/973687/6.10 内核版本的合并窗口于 5 月 12 日开启;截至本文撰写之时,已有 6819 个非合并提交被拉入该...

Linux News搬运工 556

Linux 6.18发布:年度最后版本或成新长期支持版本

新的内核版本意味着对一些新硬件的内置支持。A:Linux 6.18的主要改进包括:XFS卷可以在使用中检查和修复,exFAT驱动程序速度提升16倍,新增对华硕、联想等厂商手持设备的支持,Nouveau驱动支持图灵和安培系列GPU的GSP固件,以及新的Rust版本Binder用于Android进程间通信。经过两年的工作,6.18包含了新的Rust版本Binder,Android的进程间通信管理器。A:Linux 6.18是2025年的最后一个内核版本,按照惯例,年度最后的内核版本通常会被选为长期支持版本。

std86021的博客 634
上一篇: LWN:推动 Lustre 文件系统进入上游!
下一篇: LWN:kernel defconfig是为谁准备的?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值