linux 内核编译:内核配置原理与常见配置问题的解决方法&&内核版本控制解析

格上签名论文 提出 lattice 提出 lattice-based 提出 LWE的密码 O. Regev. On lattices, learning with errors, random linear codes, and cryptography. J. ACM,56(6):1–40, 2009. Preliminary version in STOC 2005. Ring-LWE V. Lyubas... 阅读详情

摘要:在进行内核编译的时候,内核配置无疑是其中最为重要的环节,直接决定了编译的内核是否能够满足要求。而且,对于新加入的内核特性,我们往往无法在make menuconfig中找到相应的选项。本文主要为你解决如下问题:1)linux内核编译之前,配置文件的读取顺序是什么?2)对于比较新的内核特性,我们无法在.config之中找到某个配置,应该如何处理?3)如何将自己新添加的驱动添加进入内核?

一.linux内核配置系统的构成

     Linux内核的配置系统由三个部分组成,分别是:

   1)、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;

   2)、配置文件(config.in(2.4内核,2.6内核)):给用户提供配置选择的功能;

   3)、配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。

   这些配置工具都是使用脚本语言,如 Tcl/TK、Perl 编写的(也包含一些用 C 编写的代码)。本文并不是对配置系统本身进行分析,而是介绍如何使用配置系统。所以,除非是配置系统的维护者,一般的内核开发者无须了解它们的原理,只需要知道如何编写 Makefile 和配置文件就可以。

二、makefile menuconfig过程讲解——内核配置Kconfig文件的读取和.config的生成过程

当我们在执行make menuconfig这个命令时,系统到底帮我们做了哪些工作呢?

这里面一共涉及到了以下几个文件我们来一一讲解

(1)Linux内核根目录下的scripts文件夹

(2)arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件

(3)Linux内核根目录下的makefile文件、各层目录下的makefile文件

(4)Linux内核根目录下的的.config文件、arm/$ARCH/下的config文件

(5)Linux内核根目录下的 include/generated/autoconf.h文件

1)scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容


2)当我们执行make menuconfig命令出现上述蓝色配置界面以前,系统帮我们做了以下工作:

    首先系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项(Kconfig是整个linux配置机制的核心),那么ARCH环境变量的值等于多少呢?

它是由linux内核根目录下的makefile文件决定的,在makefile下有此环境变量的定义:


或者通过 make ARCH=arm menuconfig命令来生成配置界面,默认生成的界面是所有参数都是没有值的

    比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科可进行考试,系统就会读取arm/arm/kconfig文件生成配置选项(选择了arm科的卷子),系统还提供了x86科、milps科等10几门功课的考试题


Koncfig文件包含了配置选项的依赖关系,层次关系,各个选项的默认值。


3)假设教务处比较“仁慈”,为了怕某些同学做不错试题,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs下,对于arm科来说就是arch/arm/configs文件夹:


    此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)

#cp arch/arm/configs/s3c2410_defconfig .config

4).config

    假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项

    但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.

5)经过以上两步,我们可以正确的读取、配置我们需要的界面了

那么他们如何跟makefile文件建立编译关系呢?

当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在

Linux内核根目录下的 include/generated(linux)/autoconf.h文件下,它实际上是makefile文件读取的内容


内核中的源代码就都会包含以上.h文件,跟宏的定义情况进行条件编译。

当我们需要对一个文件整体选择如是否编译时,还需要修改对应的makefile文件,例如:


    我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。

    最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件。

    比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其生成过程

    首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;

    其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;

    最后修改对应目录下的makefile文件完成编译选项的添加;

    最后的最后执行make zImage命令进行编译。


总结一下,这个过程大致是这样的:各个目录之下存在Kconfig文件,里面的内容是相关的选项,depends和select;执行make menuconfig命令以后,会读取这些Kconfig里面的配置选项(配置选项的默认值也在各个Kconfig文件之中),生成如下图的图形界面。


我们对相关的symbol进行配置,然后点击保存,就写入了.config文件和相应头文件。大致如此:Kconfig *******menuconfig*********.config&& include/generated/autoconf.h************make


三、如何向内核中添加自己的配置

下面我们以前面做过的模块实验为例,讲解如何通过make menuconfig机制将前面单独编译的模块编译进内核或编译为模块

假设我已经有了这么一个驱动:

modules.c

  1. #include <linux/module.h>       /*module_init()*/   
  2. #include <linux/kernel.h> /* printk() */   
  3. #include <linux/init.h>       /* __init __exit */   
  4.   
  5. #define DEBUG   //open debug message   
  6.   
  7. #ifdef DEBUG   
  8. #define PRINTK(fmt, arg...)     printk(KERN_WARNING fmt, ##arg)   
  9. #else   
  10. #define PRINTK(fmt, arg...)     printk(KERN_DEBUG fmt, ##arg)   
  11. #endif   
  12.   
  13. /* Module Init & Exit function */  
  14. static int __init myModule_init(void)  
  15. {  
  16.     /* Module init code */  
  17.     PRINTK("myModule_init\n");  
  18.     return 0;  
  19. }  
  20.   
  21. static void __exit myModule_exit(void)  
  22. {  
  23.     /* Module exit code */  
  24.     PRINTK("myModule_exit\n");  
  25.     return;  
  26. }  
  27.   
  28. module_init(myModule_init);  
  29. module_exit(myModule_exit);  
  30.   
  31. MODULE_AUTHOR("dengwei");                          /*模块作者,可选*/  
  32. MODULE_LICENSE("GPL");                             /*模块许可证明,描述内核模块的许可权限,必须*/  
  33. MODULE_DESCRIPTION("A simple Hello World Module"); /*模块说明,可选*/  

Step1:将modules.c拷到drivers/char/目录下(这个文件夹一般存放常见的字符驱动)

Step2: vi driver/char/Kconfig,在
    config DEVKMEM后添加以下信息

config MODULES
tristate "modules device support"
default y
help
 Say Y here,the modules will be build in kernel.
 Say M here,the modules willbe build to modules.
 Say N here,there will be nothing to be do. 

Step3:make menuconfig
     Device driver-character devices
           [*]modules device suppor

Step4:vi driver/char/Makefile,在js-rtc后添加
obj-$(CONFIG_MODULES)+= modules.o
CONFIG_MODULES 必须跟上面的Kconfig中保持一致,系统会自动添加CONFIG_前缀

modules.o必须跟你加入的.c文件名一致

最后执行:make zImage modules就会被编译进内核中


第三步:

Step3:make menuconfig
     Device driver-character devices
           [M]modules device suppor
把星号在配置界面通过空格改为M,最后执行make modules,在driver/char/目录下会生成一个modules.ko文件

跟我们前面讲的单独编译模块效果一样,也会生成一个模块,将它考入开发板执行insmod moudles.ko,即可将生成的模块插入内核使用。


四 常见问题解答

    1)linux内核编译之前,配置文件的读取顺序是什么?

    参考第二部分的总结


    2)对于比较新的内核特性,我们无法在.config之中找到某个配置,应该如何处理?

    如果一个配置没有出现在.config之中,我们首先要在make menuconfig的界面中进行寻找,如果在这个界面中能够找到,那么多半是我们没有将这个对应symbol的depends满足,所以导致config之中没有相关的选项。此时,我们只要查看相关symbl的depends,然后满足它们即可,就可以在.config之中找到相应选项。如果在make menuconfig的界面中也无法找到,说明Kconfig之中没有相关的配置选项,就说明它还没有被编入内核。


3)如何将自己新添加的驱动添加进入内核?

    参看第三部分


五 内核编译实践经验


1)比那一centos 6.3出错“crypto/signature/ksign-publickey.c: key.h: No such file or directory”

解决方法:

run make menuconfig.
1) Select "Enable loadable module support", then "Module signature verification (EXPERIMENTAL)". Disable it.
2) Then go back to the main menu, select "Cryptographic API" then "In-kernel signature checker (EXPERIMENTAL)" and disable that one too.
Then go back again, save your config and make your kernel. At least, it will pass this phase successfully.


六、关于内核版本号


Linux内核使用三种不同的版本编号方式。
  第一种方式用于1.0版本之前(包括1.0)。第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。
第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5,而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。
第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。3.0版本之前,是一种“A.B.C.D”的格式。七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。第三种方式中不使用偶数代表稳定版,奇数代表开发版这样的命名方式。举个例子:3.7.0代表的不是开发版,而是稳定版!

内核编译时候对版本号的控制:
KERNELRELEASE:这个变量的值,我们可以在/include/config/kernel.release文件中找到。
内核版本的构成和控制部分如下:
#       $(KERNELVERSION)
#         $(VERSION)                    eg, 2

#         $(PATCHLEVEL)                 eg, 6

#         $(SUBLEVEL)                   eg, 18
#         $(EXTRAVERSION)               eg, -rc6
#       $(localver-full)
#         $(localver)
#           localversion*               (files without backups, containing '~')
#           $(CONFIG_LOCALVERSION)      (from kernel config setting)
#         $(localver-auto)              (only if CONFIG_LOCALVERSION_AUTO is set)
#           ./scripts/setlocalversion   (SCM tag, if one exists)
#           $(LOCALVERSION)             (from make command line if provided)
#  Note how the final $(localver-auto) string is included *only* if the
# kernel config option CONFIG_LOCALVERSION_AUTO is selected.  Also, at the
# moment, only git is supported but other SCMs can edit the script
# scripts/setlocalversion and add the appropriate checks as needed.

注意:VERSION,PATCHLEVEL,SUBLEVEL之间是会自动加上“.”的,但是EXTRAVERSION之前不会自动加“.”。版本控制是通过脚本文件scripts/setlocalversion来执行的,如果CONFIG_LOCALVERSION_AUTO=y

CONFIG_LOCALVERSION_AUTO=N:

                 如果没有定义LOCALVERSION,版本号后面会添加“+”号

                 没有定义LOCALVERSION,版本后不会添加“+”

如果既不想添加字符,又不想有“+”号:不定义CONFIG_LOCALVERSION_AUTO,将LOCALVERSION变量定义为空:LOCALVERSION=


自定义版本号的方法:

在scripts/setlocalversion文件中还有有这么一段:
# localversion* files in the build and source directory
res="$(collect_files localversion*)"
if test ! "$srctree" -ef .; then
 res="$res$(collect_files "$srctree"/localversion*)"
fi

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
由此可看出,如果想往版本号里添加字符,有几种方式:
1. 使用LOCALVERSION变量(或者在命令行,或者添加为环境变量)
2. 在linux-2.6.35目录下添加文件localversion,文件内容会自动添加到版本号里去。
3. 定义CONFIG_LOCALVERSION变量
4. 如果linux-2.6.35目录下有文件localversion(其内容为.33),也使用了LOCALVERSION变量,也定义了CONFIG_LOCALVERSION=".XYZ"。
make LOCALVERSION=.44 include/config/kernel.release
此时对2.6.35.7的内核,include/config/kernel.release的内容为2.6.35.7.33.XYZ.55。
可看到添加的三种字符的顺序:文件localversion内容在前,然后是CONFIG_LOCALVERSION的值,最后是LOCALVERSION的值。


转自:http://blog.youkuaiyun.com/trochiluses/article/details/9663743

本文来源:


linux 内核编译:内核配置原理与常见配置问题的解决方法:http://blog.youkuaiyun.com/trochiluses/article/details/9663743


外部参考:http://blog.youkuaiyun.com/dianhuiren/article/details/6917132

【2】linux内核配置系统解析:http://www.ibm.com/developerworks/cn/linux/kernel/l-kerconf/

【3】linux内核版本号:http://blog.youkuaiyun.com/adaptiver/article/details/7225980

从零开始:RK3568 Linux内核编译与烧录全流程解析(基于Rockchip官方kernel仓库) 本文详细解析了RK3568 Linux内核编译与烧录的全流程,基于Rockchip官方kernel仓库,涵盖环境搭建、内核配置、设备树定制、编译烧录及调试技巧。帮助开发者快速掌握RK3568嵌入式开发的核心技术,适用于工业控制、智能NVR等场景。 阅读详情

相关推荐

Linux内核模块Makefile编写指南:从Kbuild原理到实战配置

Makefile是Linux内核开发中的核心构建配置文件,它定义了模块的编译规则和依赖关系。其工作原理基于内核的Kbuild系统,通过声明式变量(如obj-m)告知构建系统如何将源代码编译为可加载的内核模块(.ko文件)。理解Makefile对于确保模块与内核版本兼容性、管理符号导出和优化编译过程至关重要。在嵌入式开发、设备驱动编写等应用场景中,掌握Makefile的编写能有效解决模块加载错误、符号未定义等常见问题。本文结合Kbuild系统原理和工程实践,深入解析了如何编写高效、健壮的内核模块Makefil

weixin_30268921的博客 442

Linux内核版本信息全解析:从启动日志到构建原理与调试应用

在Linux系统开发与运维中,内核版本管理是确保系统稳定性和驱动兼容性的基础。内核版本信息不仅遵循语义化版本规则,更在编译时嵌入了构建环境、编译器版本等关键元数据,其实现原理涉及Kbuild构建系统和UTS命名空间。理解这些信息对于诊断ABI兼容性问题、排查内核崩溃以及进行嵌入式系统调试具有重要技术价值。通过分析启动日志中的版本字符串,结合uname命令、/proc/version文件等多种查询方式,开发者可以精准定位问题,实现驱动模块的跨版本兼容。本文以Linux kernel version的构成与获取

weixin_30245867的博客 398

三电平逆变器LC滤波设计避坑指南:从SVPWM谐波到Simulink仿真验证

本文详细解析了三电平逆变器LC滤波设计中的关键问题,从SVPWM谐波特性到Simulink仿真验证,提供了800V/10kW系统的参数计算方法和优化技巧。通过实际案例和仿真配置示例,帮助工程师避免常见设计误区,提升电能质量和系统稳定性。

weixin_29261711的博客 173

Virtualbox报错------>make sure the kernel module has been loaded successfully

错误描述 很久没有用virtualbox了,今天打算在virtualbox上安装一个Ubuntu系统的时候,新建好Ubuntu后启动的时候,直接报错: Cannot access the kernel driver! Make sure the kernel module has been loaded succe...

weixin_34087503的博客 1396

AI量化投资开源平台——Qlib(微矿)的学习使用笔记(随缘更新)

Qlib 涵盖了量化投资的全过程,为用户的 AI 算法提供了高性能的底层基础架构,从框架设计上让用户可以更容易地应用 AI 算法来辅助解决量化投资的各个关键问题(例如 Alpha 预测,风险预测,市场动态性建模)。本文旨在记录一些面向初学者的基础内容。

in_void的博客 3133

VisionMaster Qt二次开发:图像获取、COM组件渲染与本地化存储实战

本文详细介绍了基于VisionMaster进行Qt二次开发的核心实战流程,涵盖环境搭建、方案加载、图像数据获取、COM组件渲染与本地化存储。重点解析了如何通过COM组件在Qt界面中实时显示图像,以及将VM图像数据转换为QImage并保存为本地文件的关键步骤与常见问题,为工业视觉项目开发提供稳定高效的解决方案。

weixin_29229261的博客 206

Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

但是一般我们不采取这个方案,我们选择在配置界面中通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当你执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config即可.

tecoes的博客 2086

ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)

萌新常用的都在这了,本萌新的模板集。

张天枭の博客 5万+

内核配置与裁剪浅析

Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下, #tar xzvf linux-2.6.38.4.tar.gz -----解压缩. ii) 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux. (2)设置内核. # cd /usr/s...

weixin_30802171的博客 1023

[LaTeX] 使用natbib宏包实现参考文献的“作者-年份”引用格式及常见编译错误排查

本文详细介绍了在LaTeX中使用natbib宏包实现参考文献“作者-年份”引用格式的完整流程。从宏包配置、.bib文件准备到标准编译步骤,重点解析了常见的“Bibliography not compatible with author-year”错误成因,并提供了彻底清理辅助文件等解决方案,帮助用户高效排版符合学术规范的参考文献。

moon9的博客 481

Keras神经网络可视化模块keras.utils.visualize_util的安装配置方法

本文介绍了如何安装和配置keras.utils.visualize_util模块,并提供了一个简单的示例演示如何使用该模块来可视化神经网络的结构。在上述代码中,我们首先定义了一个简单的神经网络模型,该模型具有一个输入层、一个隐藏层和一个输出层,其中隐藏层具有512个神经元,输出层具有10个神经元。运行上述代码后,我们将在当前工作目录下找到一个名为model.png的文件,它显示了神经网络的结构图。这种方式有效地展示了整个过程,让我们能够更好地理解神经网络的结构,方便对其进行改进和调试。

. 892

非常好的Linux编译内核详解 - -

转载: http://blog.chinaunix.net/uid-263488-id-2138150.html非常好的Linux编译内核详解 - -一、内核简介   内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。   Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分...

zhenguo26的博客 4万+

实现基于 Python 和 xterm.js 的 Web 交互终端demo

前端 (HTML):使用 xterm.js 作为前端终端模拟器库。创建了一个 WebSocket 连接到 ws://localhost:8765,这与后端服务器的地址和端口匹配。监听 WebSocket 消息,并将数据写入终端。同时监听用户输入并发送到服务器。后端 (Python):使用 websockets 库来创建 WebSocket 服务器,监听端口 8765。使用 paramiko 库来创建 SSH 客户端并连接到指定的远程服务器。

u010674101的专栏 876

3分钟搞懂Fastfetch:从内核版本到编译信息的全解析

作为系统信息展示工具的佼佼者,Fastfetch能够快速抓取并展示操作系统的核心信息,其中内核版本与编译信息是系统管理员和开发者最关注的内容之一。本文将深入解析Fastfetch如何获取操作系统版本信息,以及如何通过编译参数了解软件构建细节。 ## 操作系统版本检测机制 Fastfetch通过`FFOSResult`结构体存储操作系统的完整信息,包括名称、版本、代号等关键属性。该结构体定义在[...

gitblog_01170的博客 1070

【WorkBuddy专栏27】WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

WorkBuddy 和 CodeBuddy 到底什么关系——一篇文章终结所有混淆

AI人人懂 2679

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

详解Linux内核编译配置(menuconfig)、文件系统制作

Linux内核编译流程(Menuconfig图形化方式)Menuconfig配置内核原理:在Linux里面我们所看到的menuconfig界面是通过配置内核顶层的Kconfig产生的,而当输入make menuconfig命令的时候系统会读取Makefile来解析Kconfig。  通常会在Kconfig里面编写以下四项:   1、模块的名字,用module开头;   2、选项,通常设为bool

HowieXue 薛永浩的博客 6万+

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

Linux内核配置与构建原理

Linux/uboot的配置和构建细节

mapleay的博客 1954

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何在20.04Ubuntu编译并安装Linux 5.4.34内核

在22.04Ubuntu安装5.4.34版本Linux内核

always_on_way的博客 1451

Linux 内核编译 LOCALVERSION 配置(分析内核版本号自动添加的“+“号)

优快云 GitHub Linux 内核编译 LOCALVERSION 配置(分析内核版本号自动添加的”+”号) AderXCoding/system/tools 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供

OSKernelLAB(gatieme) 1万+

内核设计原理与实战:从NVIDIA驱动到嵌入式内核配置的深度解析

操作系统内核作为计算机系统的核心,负责硬件抽象、资源管理和系统调用,其设计直接决定了系统的性能、安全性与稳定性。内核通过特权级运行和集中管理,在提升I/O效率、保障系统隔离的同时,也带来了驱动兼容性、模块加载等复杂性挑战。这一原理在高性能计算和嵌入式开发中尤为关键,例如NVIDIA GPU驱动依赖内核模块与CUDA运行时交互,而嵌入式设备的内核配置则决定了硬件功能的可用性。理解内核空间与用户空间的交互机制,能有效解决“NVRM: kernel module unloaded”等驱动错误,并指导RK3588等

weixin_34342905的博客 503

Linux进阶篇06:内核编译与定制,原理与架构解析

本文详细介绍了在Rocky Linux 9虚拟机中定制化Linux内核的全流程,包括内核裁剪、PREEMPT_RT实时补丁合入、编译安装及验证。主要内容涵盖:环境准备与依赖检查、内核源码获取、make menuconfig图形化配置工具使用、关键选项保留与裁剪原则、实时补丁的版本匹配与合入方法、编译优化技巧、GRUB引导更新,以及通过cyclictest工具验证实时性。文章特别强调操作顺序的重要性,并提供了常见错误排查速查表,帮助用户规避因配置不当导致的启动失败问题。

2502_93585879的博客 942

【kernel】内核版本添加字符和内核版本'+'解决

每次由于git仓库编译出来每次都带有'+', 导致都需要使用git archive单独拉出一个干净的源码出来编译,这样一方面要重新编译,耗费时间,另一方面,改动会更麻烦,可能要本地来回打patch. 于是分享下面来解决这个问题。 有个简单的办法:无论kernel还是uboot,都可以在本地仓库的根目录下touch .scmversion空文件,然后编译即可, .config中CONFIG_LOC...

zhangna的博客 711

手把手教你Linux内核编译:从零开始编写

Linux 内核作为操作系统的核心,其魅力在于多方面。首先,它负责资源管理和设备驱动等重要任务。学习 Linux 内核编程,能够让开发者深入了解操作系统内部工作机制。例如,Linux 的内核功能强大,包括进程管理、内存管理、文件系统、网络功能、硬件驱动和安全机制等。在进程管理方面,内核负责创建和销毁进程,处理进程与输入和输出设备的不同进程间的数据处理,调度器控制进程如何共享 CPU。

深度Linux 2841

linux驱动开发之常见面试问题

A:可以通过宏找到这个私有结构体的指针。是 Linux 内核中一个常用的宏,用于从一个结构体中的某个字段获取该结构体的指针。这在实现容器数据结构时非常有用,尤其是在链表中。

墨染锦年的博客 3659

解锁Linux内核移植:开启嵌入式开发新世界

Linux 内核移植作为嵌入式开发的关键环节,涵盖了从准备工作到内核编译安装的一系列复杂步骤,每一步都需要开发者精准把控。从挑选合适的内核版本、搭建交叉编译环境,到对内核源码进行细致修改、精心配置以及完成编译安装,每个环节都环环相扣,任何一个小的失误都可能导致移植失败。在这个过程中,串口打印异常、文件系统挂载故障、驱动适配难题等常见问题也时刻考验着开发者的技术能力和耐心。但通过对硬件连接、配置参数、驱动程序等方面的仔细排查和针对性解决,这些问题都能逐一攻克。

大雨淅淅的博客 1148
上一篇: VirtualBox安装Debian发行版
下一篇: CentOS7/RHEL7上安装KVM(QEMU)
Clef
博客等级 码龄12年 125粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值