LWN: kernel中GCC plugin的未来命运!

基于gcc plugin机制,编译源码时在每个函数前插入一条指令,打印当前的调用栈,省去了修改源码的时间 在学习开源库时,想了解它的调用流程,可以使用valgrind的callgrind功能。这里介绍另一种方法,gcc有一种plugin机制,可以利用这种机制在编译源码时,在函数中插入call指令,调用自己的api调用,咱们在这个函数中调用libunwind获取调用栈信息 阅读详情

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

The future of GCC plugins in the kernel

April 1, 2021
This article was contributed by Marta Rybczyńska
DeepL assisted translation
https://lwn.net/Articles/851090/

内核加固(kernel hardening)的流程可以在多方面受益于编译器支持。近年来,内核自我保护项目(Kernel Self Protection Project)将 grsecurity/PaX 中的一些 patch set 以 GCC plugin 的形式来给 kernel 提供了更多支持。LWN 早在 2017 年就报道过这个流程。最近的一次讨论中重点讲述了这样一个事实:使用 GCC plugin 方式也带来了一些缺点,一些开发者希望能看到后续用其他方式取代这些插件。

讨论来源于 Josh Poimboeuf 的报告,他在启用 GCC 插件编译 kernel tree 之外的 module 时遇到一个问题。在他的场景中,只要用来编译 module 的 GCC 版本与用来构建 kernel 的版本稍有不同时,编译就会失败。他附上了一个 patch,用来将 error 改为 warning,并禁用了受影响的 GCC 插件。稍后,Justin Forbes 解释了一下这个导致问题的环境是如何产生的:这发生于 Fedora 的持续集成系统中,该系统会先从建立一个当前的 toolchain snapshot 来开始。然后用新的 toolchain 来编译 kernel tree 之外的 module,而不会重新编译 kernel 本身。自从 GCC plugin 被启用后,所有带有 kernel tre 之外 module 的编译 job 都会失败。

将 error 改为 warning 的想法,在内核构建系统维护者 Masahiro Yamada 看来不是很赞同,他说:"我们有一个假设,就是 kernel tree 之内和之外的代码都应该是用同一个编译器编译的"。Poimboeuf 回应说,现实世界中的的情况并不是这样的。不过,其他内核开发者也同意 Yamada 的观点。Greg Kroah-Hartman 写道:

你难道没有注意到 include/linux/compiler.h 以及我们为各种不同版本的 gcc/clang/intel 等编译器所做的那些各不相同改动以及 workaround 吗?我们从来没有保证过用不同的编译器所编译出来的 kernel module 能够工作,我认为我们现在也不应该开始改变这个观点。

此外,Yamada 指出,在以前的讨论中,对内核及其 module 的编译会使用相同的编译器版本,这已被接受为一种潜在规定。由于内核开发者明确表示了不同意,所以讨论似乎已经结束。

The dislike for GCC plugins

然而,Poimboeuf 几天后带着另一个可以解决他的问题的方案回来时,讨论又重新开始了,这个方案是:每当 GCC 版本改变时,就重新编译所有的 plugin。这被 Yamada 拒绝了,他指出 Ubuntu 并没有 GCC 版本不匹配的问题,所以这个问题似乎是 Fedora 特有的。Linus Torvalds 也不同意这个提议,但是因为另一个原因。对他来说,当 GCC 版本改变时,并没有什么出于技术上的限制会需要人们必须重新编译更多的东西,但他对 GCC 插件的一些通用使用和设计方面表示了关注。在后续的邮件中,他用了比较强烈的语言解释了他的理由:

内核的 GCC 插件最终 会 消失。它们是一场无妄之灾。一直都是这样。我很抱歉我曾经合并了这些功能进 kernel。它不仅对于维护工作是个噩梦,而且它首先本身就是一个可怕的东西,带着很不好用的 interface。这个技术简直太糟糕了。

对于 Torvalds 来说,如果要正确实现这种插件,就应该是在中间表示法(IR,intermediate representation)这一层来进行修改,但是 GCC 的插件由于一些非技术性的原因而被设计成用其他方式实现了(主要是担心 non-free 插件,也就是非自由软件的插件,LWN 在 2008 年就报道过这一点)。他说,对插件感兴趣的人应该使用 Clang,因为它有一个干净的 IR,并且很容易允许在 IR 级别添加类似的检查。

GCC plugins and their Clang equivalents

然而,删除内核里 GCC 插件这件事,似乎在近期并不可能实现。Kees Cook 介绍了 GCC 插件的现状、它们在 Clang 中的等价功能、以及为什么其中一些插件会有个用户社区。GCC 插件提供的一些功能还不能用 Clang 来实现,其实无论如何,很多发行版提供商都没有使用 Clang 来构建内核。

目前内核支持以下插件(位于 scripts/gcc-plugins/):

  • cyc_complexity,计算函数的循环复杂性。它是两个最初的示例插件之一,可能并没有用户。

  • latent_entropy 增加了 CPU 执行时的熵。Cook 认为没有什么地方用到它,特别是在增加了抖动熵机制之后。后续没有计划在 Clang 中支持这个。

  • arm32 的各个任务堆栈保护器(per-task stack protector for arm32)为 32 位 ARM 平台提供了堆栈保护。Cook 说,目前 Clang 连 64 位系统都还没有对应的功能。

  • randstruct 随机地改变内核数据结构中各个字段的顺序,这只对那些只包含函数指针的结构生效,或者那些明确用__randomize_layout 标记过的结构生效。这个插件有两个版本:一个是完整版,一个是限制版。限制版只会改变同一 cacheline 中的多个成员之间的顺序,这降低了性能开销,但也降低了保护水平。Clang 中有一个版本已经被提出来了,但目前被搁置。Cook 指出,有安全意识的那些最终用户都倾向于启用这个插件,但发行版提供商通常不启用。

  • sancov(Cook 没有提到)会通过在每个 basic block 的开始插入一个对__sanitizer_cov_trace_pc()的调用,来帮助那些 fuzzing coverage 测试,也就是用来确定哪些代码块真正得到了利用。

  • stackleak 会追踪内核里的堆栈深度,以便在返回用户空间时可以用特定模式的内容来覆盖掉已使用过的堆栈。目前还没有计划支持 Clang。

  • structleak 初始化了那些可能会被传递给用户空间的结构。Clang 的 -ftrivial-auto-var-init=zero 选项就是类似实现。GCC 后续可能也会支持该选项。

最终的结果看来,这些插件还是继续存在一段时间的。

同时,讨论中也有一些积极的成果。在这个过程中我们意识到,这些插件对它们所对应的 GCC 版本非常敏感,每当 GCC 版本发生变化时,它们并没有被重新编译过。显然,自从插件第一次被添加以来就是这个情况了;尽管 Yamada 在讨论中拒绝了这个想法,但他还是解决了这个问题。作为 Poimboeuf 最初问题的解决方案,开发者们最终同意在内核和模块之间出现 GCC 版本不匹配时显示一个警告。这将由用户来决定这个差异可可以忽略的,还是需要重新编译内核。

GCC 版本不匹配的问题并不是 Poimboeuf 注意到的唯一一个问题;他还指出了插件构建系统对一个 gcc-plugin-devel 包(可选的)的依赖关系。即使用户的 GCC 版本与编译内核时使用的版本相同,但如果他们没有这个包,插件也会被悄悄地禁用,而内核编译会成功完成且没有任何警告。这个问题还没有得到进一步解决。

Conclusions

这次讨论涵盖了 GCC 插件的一些问题。这很可能意味着开发者在启用它们时应该小心谨慎。Poimboeuf 最初的问题利用这个 warning 就得到了某种程度的解决,这个 warning 可能开始在一些系统中报告出来。如果两个 GCC 版本很接近的话,用户可能会选择忽略这个 warning。在启用插件时,开发者应该注意先安装 gcc-plugin-devel,否则他们的 module 可能并没有按照你的要求来完成编译。

内核中的 GCC 插件的未来尚未决定。Clang 似乎是 hardening 工作的首选,这个方向也得到了 Torvalds 的鼓励,但是现有的各个 GCC 插件(除了一个以外)并没有 Clang 的对应物。看来,它们至少还会存在一段时间。

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

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

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

解决Nvidia驱动安装报错:GCC版本不兼容导致的‘-ftrivial-auto-var-init=zero’问题 本文详细解析了Ubuntu系统安装Nvidia驱动时遇到的GCC版本不兼容问题,特别是'-ftrivial-auto-var-init=zero'报错。通过升级GCC至12及以上版本、清理旧驱动并正确配置系统环境,提供了完整的解决方案,帮助用户顺利安装Nvidia显卡驱动。 阅读详情

相关推荐

Kernel: 编译配置:GCC_PLUGIN_RANDSTRUCT

编译时用到的种子在文件:scripts/gcc-plgins/randomize_layout_seed.h. make clean 不会删除这个文件,这样的话外部模块就可以根据这个种子文件进行同步编译。帮助:如果选择Y,编译时会对只含有函数指针的结构体(没有显示声明__no_randomize_layout),还有显示声明__randomize_layout的结构体,做布局上的随机化。同时,会带来性能的影响,和些许的内存损耗,而且会影响法律/开源验证相关工具的使用,例如Volatility。

mzhan017的博客 1749

安装Nvidia驱动出现 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’

安装Nvidia驱动出现 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’报错:cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’需要 gcc-12 才能正确编译。

weixin_40293999的博客 3337

Linux Kernel Hardening内核加固分析

SANS Institute研究所对Linux内核加固进行了整体的背景分析和建议方案,并详解GRSecurity团队的一些经典方案,非常值得做内核安全、系统安全以及想要对内核更深入理解的人

GCC 插件项目教程

GCC 插件项目教程 项目介绍 GCC 插件项目(GCC Plugins)是一个开源项目,旨在扩展 GCC 编译器的功能。通过加载这些插件,开发者可以在不修改 GCC 核心代码的情况下,为编译器添加新的特性和功能。该项目支持 GCC 4.5.0 及更高版本,提供了灵活的插件开发框架,使得开发者能够快速构建和测试新的编译器功能。 项目快速启动 环境准备 确保你已经安装了 GCC 4.5.0 或更高版...

gitblog_00718的博客 1302

AI编程助手Cursor如何革新经济学研究:从计量模型到可视化全流程实战

在数据科学和人工智能技术蓬勃发展的今天,如何高效地将前沿AI工具融入专业领域的研究工作流,成为提升科研效率的关键。其核心原理在于通过自然语言交互,将研究者的专业问题转化为机器可执行的指令,从而实现人机协作的范式转移。这一技术的核心价值在于大幅降低非计算机背景研究者的编程门槛,将精力从繁琐的代码实现中解放出来,更聚焦于学科本身的思想与逻辑。尤其在经济学、金融学等高度依赖数据分析和计量建模的领域,AI编程助手能够快速处理数据清洗、模型估计、可视化及结果解释等任务。具体到应用场景,研究者可以利用结构化提示词工程,

weixin_42531579的博客 296

如何下载安装Qt各个版本?(2025-4-28更新)

本文将教您快速获取Qt各版本安装包!妈妈再也不用担心我找不到Qt安装包了!

程序区 5113

编译安装 NV GPU 最新的开源 driver 时遇错 error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’

如果在编译安装 NV GPU 最新的开源 driver 时遇错 error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’那么,先执行 gcc --version 看看 gcc 的版本。应该是<=11有一说一,编译器选项 -ftrivial-auto-var-init=<value> 是 gcc-12 从clang借鉴过来的。先看clang中的解释,在 clang --help 中可以看到:-ftrivial-auto-var

eloudy的专栏 2228

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1057

Android R定制项目后编译失败,提示“clang++: error: unknown argument: ‘-ftrivial-auto-var-init=zero‘“

拿到高通的release代码之后,编译平台项目通过。但是根据平台项目去定制项目时编译遇到以下错误: [ 63% 49501/77678] target C++: libcamxgenerated <= out/target/product/sc161/obj/STATIC_LIBRARIES/libcamxgenerated_intermediates/generated/g_pars FAILED: out/target/product/sc161/obj/STATIC_LIBRARIES/lib

sunnywalden 4678

量化爬虫第一步:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向实战)

本文详细介绍了如何通过JS逆向技术破解同花顺问财数据接口的核心加密参数hexin-v,构建稳定可靠的量化数据采集方案。从抓包分析到Cookie Hook技术应用,再到环境补全与参数生成实现,手把手教你完成量化爬虫的第一步。文章还提供了实战注意事项与优化建议,帮助开发者规避常见问题。

weixin_42620202的博客 301

Simscape Multiboby学习笔记1——跟着官网学Multibody

文章目录一. 引言二. Simscape Multibody自学之路三. 本教程的目录 一. 引言 最近在倒腾Matlab的动力学仿真,起因是看到有人推荐Matlab的multbody模块,一经了解之下简直惊为天人。作为一名Matlab的小粉,看到这么好用的模块简直不要太开心,之前用simulink搭飞行器的仿真模型,虽然能够仿真看到六自由度位移,毕竟不能可视化,还是很不够直观,而且simulink仿真(以及更费力的脚本文件仿真)需要精确建模,模型不精确计算也是天差地别。而Multibody在具备其他动力学

qq_30267617的博客 8241

gcc9.4.0编译及plugin开发环境

2.2 添加参数执行./contrib/download_prerequisites --no-isl。当前目录手动在https://ftp.gnu.org/pub/pub/gnu/中找对应包用浏览器下载。注:我的gcc版本是9.4.0因此gcc-9-plugin-dev。先用gcc plugin搞点事情,参考网上文档先编译gcc。此处网络异常打印:服务器响应时发生错误,正在关闭控制连接。1、下载了本地gcc版本代码gcc-9.4.0。4、但是搞gcc plugin还是有问题。

luowutong的专栏 447

Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译

0、加密的原理 Unity3D 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。 Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 文件没什么区别。 为了防止别人破解,我们会对游戏资源加密,简单点的 比如修改文件的一个字节 或者 位移一下

Circle 8719

探索GCC与Python的深度融合:gcc-python插件

探索GCC与Python的深度融合:gcc-python插件 项目介绍 gcc-python 是一个为GCC编译器设计的插件,它通过链接libpython库,实现了在编译器内部调用任意Python脚本的功能。该项目的目标是允许开发者使用Python编写GCC插件,从而扩展GCC的功能。目前,该项目仍处于实验性阶段,但已经可以用于添加额外的编译器错误或警告,例如领域特定的检查或静态分析。 项目技术分...

gitblog_00630的博客 1139

DW3000芯片驱动API介绍

详细介绍DW3000驱动程序API的调用流程说明和中断处理程序流程说明

DT程序员的博客 1521

基于51单片机设计的花样流水灯设计

花样流水灯是一种常见的LED灯效果,通常由多个LED灯组成,通过控制每个LED灯的亮灭顺序和时间,实现花样流水灯的效果。在51单片机中,可以使用定时器和端口控制来实现这一效果。

3430

gcc plugin(1)——gcc安装

老板让我写生成trace的gcc plugin,在github上找了一份代码参考 https://github.com/GaloisInc/ivory-rtverification/tree/master/gcc-plugin/src 之前用LLVM PASS做这件事,但因为LLVM是IR级别插桩,丢失很多信息,导致生成的trace不准确,因此老板决定用gcc plugin实现插桩,...

anyaoyu9926的博客 683

深度学习工具包 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")

NVIDIA驱动安装失败,报错未能创建内核,请查看/var/log/nvidia-installer.log

发现我的第一条error是unrecognized command-line option '-ftrivial-auto-var-init=zero'这些解决方法写得不太清楚,我看不明白,找到另一个方法成功了,在此记录一下。我选择下载的驱动是NVIDIA-Linux-x86_64-535.154.05.run。总结一下就是,显卡版本高而gcc版本低,需要下载最新的gcc,因此执行命令。这里应该是会下载gcc的,但是不知道为什么还是需要自己去下载gcc-12。再重新进行nvidia驱动的下载,就成功了。

qq_45729028的博客 9430

计算机控制技术及应用

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

Devexpress16.2.6破解工具

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

开源项目 `kernel-hardening-checker` 使用教程

`kernel-hardening-checker` 项目的目录结构如下: ``` kernel-hardening-checker/ ├── bin/ │ └── kernel_hardening_checker ├── github/ │ └── workflows/ │ └── woodpecker ├── LICENSE.txt ├── MANIFEST.in ├──...

gitblog_00359的博客 555

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux系统安全加固指南(万字长文)

本指南旨在说明如何尽可能地加强Linux的安全性和隐私性,并且不限于任何特定的指南。免责声明:如果您不确定自己在做什么,请不要尝试在本文中使用任何内容。本指南仅关注安全性和隐私性,而不关注...

架构文摘 1340

gcc 插件实践 一

gcc 插件实践 一 重要内容参考自 https://zhuanlan.zhihu.com/p/49490338 在ubuntu中直接实践以下代码,通常会遇见以下几种错误。 /* ------ plugin1.c ------ */ #include "gcc-plugin.h" #include "plugin-version.h" int plugin_is_GPL_compatible;...

zhangji 2486

GCC编译器——GCC编译器安装教程

以下内容源于网络资源的整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 1万+

Kubernetes CKS【24】---System Hardening - Kernel Hardening Tools(seccomp)

文章目录1. Seccomp介绍2. Practice - Seccomp for Docker Nginx3. Practice - Seccomp for Kubernetes Nginx 1. Seccomp介绍 2. Practice - Seccomp for Docker Nginx root@master:~/cks/apparmor# docker run --security-opt seccomp=default.json nginx /docker-entrypoint.

爱死亡机器人 3830
上一篇: LWN: 终结 /dev/kmem!
下一篇: LWN: 多代化之后的LRU!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值