Tiny4412 Linux 内核配置流程
1.配置交叉编译器
默认情况下,内核构建的是与宿主机相同的体系架构镜像。如果要交叉编译,需要设置两个变量ARCH和CORSS_COMPILE。
①ARCH:指明目标体系架构,如x86、arm、mips等。
②CROSS_COMPILE:指定使用的交叉编译器的前缀。例如arm-linux-。在内核顶层的Makefile中,可以看到工具链中的编译器、链接器等都是以$(CROSS_COMPILE)作为前缀。
- AS = $(CROSS_COMPILE)as
- LD = $(CROSS_COMPILE)ld
- REAL_CC = $(CROSS_COMPILE)gcc
- CPP = $(CC) -E
- AR = $(CROSS_COMPILE)ar
- NM = $(CROSS_COMPILE)nm
- STRIP = $(CROSS_COMPILE)strip
- OBJCOPY = $(CROSS_COMPILE)objcopy
- OBJDUMP = $(CROSS_COMPILE)objdump
我们可以在每次执行make时,通过下面的命令来给这两个变量赋值
- make ARCH=arm CROSS_COMPILE=arm-linux-
或者直接修改顶层Makefile,将
- ARCH ?= $ (SUBARCH)
- CROSS_COMPILE ?=
修改为
- ARCH ?= arm
- CROSS_COMPILE ?= arn-linux-
2.加载默认配置
在内核源码 arch/<arch>/configs 目录下,内核提供了各种平台的默认配置文件,加载默认配置时,我们可以使用
- make ARCH=arm CROSS_COMPILE=arm-linux- xxx_defconfig
这个操作等同于将arch/arm/configs/目录下的xxx_defconfig文件复制为.config
我们可以使用命令
- make help
来获取帮助
3.配置内核
我们可使用命令
- make menuconfig
来以菜单的形式配置内核。
4.生成内核
我们可以通过下面命令编译内核
- make zImage
可以通过下面的命令编译内核模块
- make modules
编译生成的内核镜像位于内核源码/arch/arm/boot目录和arch/arm/boot/compressed目录下。
①vmlinux.o是链接后生成的内核的目标文件
②vmlinux(根目录)是ELF格式的内核
③System.map是内核的富豪榜
④Image是二进制的内核文件,由vmlinux转换而成
⑤vmlinux(compressed目录)是经压缩的vmlinux镜像(通过gzip算法压缩)和解压缩程序的组合体,也是ELF格式
⑥zImage是解压缩程序和内核的组合
5.内核构建系统
名称 | 描述 |
顶层Makefile | 他是所有Makefile文件的核心,从总体上控制内核的编译和链接 |
.config | 配置文件,在配置内核时产生。所有Makefile文件(包括顶层目录及各级子目录)都是根据.config来决定使用哪些文件 |
arch/$(ARCH)/Makefile | 对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像。 |
scripts/makefile.* | Makefile公用的通用规则、脚本等 |
kbuild Makefiles | 各级子目录下的Makefile,他们相对简单,被上一层Makefile调用来编译当前目录下的文件 |
Makefile:分布在内核源代码中的Makefile,定义内核的编译规则,配合Kconfig使用
Kconfig:配置文件,给用户提供配置选项的功能,make menuconfig 等命令根据此文件生成配置菜单
配置工具:包括配置命令解析器(解析Kconfig)和内核配置用户界面程序等
5.1 内核Kconfig
在执行make zImage来构建内核镜像之前,我们通常会响拷贝一个默认的xxx_defconfig来替换掉.config,或者运行 make xxx_defconfig以此来获得一个默认的内核配置文件,然后再运行make menuconfig 等来进一步定制内核。
make menuconfig等配置工具是通过读取arch/<arch>/Kconnfig 文件来生成配置界面的,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。
内核源码每个子目录中,都有一个Makefile文件和Kconfig文件。Makefile用来配置目标文件的生成过程。Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。
内核的配置界面以树状的菜单形式组织,主菜单下有若干子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项都有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖的父项已经被选中,子项才会显示。下面看一下Kconfig的基本语法。
Kconfig语法比较丰富,按功能可分为配置选项描述语句和菜单结构描述语句。
①Kconfig 文件的基本要素:config关键字(entry)
config 条目常被其他条目包含,用来生成菜单,进行多项选择等。config 条目用来配置一个选项,或者这么说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件 .config 中。也就是说config关键字定义了新的配置选项,之后的几行定义了该配置选项的属性。配置选项的属性包括类型、数据范围、输入提示、依赖关系、帮助信息和默认值等。
比如有一个config 条目用来配置CONFIG_XXX,根据用户的选择,.config文件中可能出现下面3种配置结果中的一个。
- CONFIG_XXX=y # 对应的文件被编进内核
- CONFIG_XXX=m # 对应的文件被编成模块
- #CONFIG_XXX # 对应的文件没有被使用
比如
- config TINY4412_LEDS #配置选项的名称
- tristate "LED Support for FriendlyARM Tiny4412 GPIO LEDs"
- #tristate是变量类型有5种
- #Bool 布尔类型,结果是Y[*] , N[]
- #tristate 三项选择,结果是Y[*], N[], M[m]
- #String 字符串, 结果(arm-linux-)
- #Hex 十六进制
- #Int 十进制
- depends on MACH_TINY4412 #依赖
- #当依赖满足事,当前配置选项的提示信息才会出现,才能设置当前配置选项
- #如果依赖条件不满足,则它取默认值。
- default y #默认为y
- help #帮助信息
- This option enables support for LEDs connected to GPIO lines
- on Tiny4412 boards.
在通过make menuconfig来配置时的的效果如下
②menu关键字
menu条目用于生成菜单, 在menuconfig 中是以------>形式出现 格式如下:
- “menu” <prompt>
- <menu options>
- <menu block>
- "endmenu"
menu之后字符串是菜单名,“menu”和“endmunu”之间有很多config条目。在配置界面上回出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。
③Source关键字
在当前Kconfig包含其它目录下的kconfig,用于读入另一个Kconfig文件,格式如下:
- “source” <prompt>
下面看一个例子
- menu "Device Drivers" #菜单开始
- source "drivers/tty/Kconfig" #引入drivers/tty目录下的Kconfig
- ......
- config TINY4412_LEDS
- tristate "LED Support for FriendlyARM Tiny4412 GPIO LEDs"
- depends on MACH_TINY4412
- default y
- help
- This option enables support for LEDs connected to GPIO lines
- on Tiny4412 boards.
- ......
- endmenu#菜单结束
④Choice关键字
choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:
- “choice”
- <choice options>
- <choice block>
- "end choice"
实际使用中,也是在“choice”和“endchoice”之间定义多个config条目。
同样也来看一个例子
- choice
- prompt "Kernel compression mode"
- default KERNEL_GZIP
- depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA || HAVE_KERNEL_XZ || HAVE_KERNEL_LZO
- help
- The linux kernel is a kind of self-extracting executable.
- Several compression algorithms are available, which differ
- in efficiency, compression and decompression speed.
- Compression speed is only relevant when building a kernel.
- Decompression speed is relevant at each boot.
- If you have any problems with bzip2 or lzma compressed
- kernels, mail me (Alain Knaff) <alain@knaff.lu>. (An older
- version of this functionality (bzip2 only), for 2.4, was
- supplied by Christian Ludwig)
- High compression options are mostly useful for users, who
- are low on disk space (embedded systems), but for whom ram
- size matters less.
- If in doubt, select 'gzip'
- config KERNEL_GZIP
- bool "Gzip"
- depends on HAVE_KERNEL_GZIP
- help
- The old and tried gzip compression. It provides a good balance
- between compression ratio and decompression speed.
- config KERNEL_BZIP2
- bool "Bzip2"
- depends on HAVE_KERNEL_BZIP2
- help
- Its compression ratio and speed is intermediate.
- Decompression speed is slowest among the choices. The kernel
- size is about % smaller with bzip2, in comparison to gzip.
- Bzip2 uses a large amount of memory. For modern kernels you
- will need at least 8MB RAM or more for booting.
- config KERNEL_LZMA
- bool "LZMA"
- depends on HAVE_KERNEL_LZMA
- help
- This compression algorithm's ratio is best. Decompression speed
- is between gzip and bzip2. Compression is slowest.
- The kernel size is about % smaller with LZMA in comparison to gzip.
- config KERNEL_XZ
- bool "XZ"
- depends on HAVE_KERNEL_XZ
- help
- XZ uses the LZMA2 algorithm and instruction set specific
- BCJ filters which can improve compression ratio of executable
- code. The size of the kernel is about % smaller with XZ in
- comparison to gzip. On architectures for which there is a BCJ
- filter (i386, x86_64, ARM, IA-, PowerPC, and SPARC), XZ
- will create a few percent smaller kernel than plain LZMA.
- The speed is about the same as with LZMA: The decompression
- speed of XZ is better than that of bzip2 but worse than gzip
- and LZO. Compression is slow.
- config KERNEL_LZO
- bool "LZO"
- depends on HAVE_KERNEL_LZO
- help
- Its compression ratio is the poorest among the choices. The kernel
- size is about % bigger than gzip; however its speed
- (both compression and decompression) is the fastest.
- endchoice
配置时的界面如下所示
5.2 内核中的Makefile
内核中的Makefile的作用主要有以下几点:
①决定编译哪些文件
②怎样编译这些文件
③怎样连接这些文件,最重要的是它们的顺序如何
(1)决定编译哪些文件
Linux内核的编译过程从顶层Makefile开始,然后递归地进入各级子目录调用他们的makefile,分为3个步骤:
①顶层Makefile 决定内核根目录下哪些子目录将被编进内核;
②arch/<arch>/Makefile 决定arch/<arch>目录下哪些文件、哪些目录将被编进内核;
③各级子目录下的Makefile决定所在目录下哪些文件将被编进内核,哪些文件将被编成模块(即驱动程序),进入哪些子目录继续调用它们的Makefile。
在顶层Makefile 中可以看到如下内容:
- core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
- # Objects we will link into vmlinux / subdirs we need to visit
- init-y := init/
- drivers-y := drivers/ sound/ firmware/
- net-y := net/
- libs-y := lib/
- core-y := usr/
我们可以看到,最重要的arch目录没有出现在内核中。它在arch/$(ARCH)/Makefile中被包含进内核,在顶层Makefile中直接包含了这个Makefile
- include $(srctree)/arch/$(SRCARCH)/Makefile
对于ARCH变量,可以在执行make时传入,比如make ARCH=arm 。另外,对于非X86平台,还需要指定交叉编译工具,这也可以在执行make 命令时传入,比如make CROSS_COPILE=arm-linux- 。
对于arch/<arch>/Makefile,以ARM为例,在arch/arm/Makefile 中可以看到如下内容:
- #对应arch/arm/kernel/head.o
- head-y := arch/arm/kernel/head$(MMUEXT).o
- ......
- core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/
- core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ)
- core-$(CONFIG_VFP) += arch/arm/vfp/
- # If we have a machine-specific directory, then include it in the build.
- core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
- core-y += arch/arm/net/
- core-y += $(machdirs) $(platdirs)
- drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
- libs-y := arch/arm/lib/ $(libs-y)
CONFIG_在配置内核时定义,它的值有3种:y、m或空。y表示编进内核,m表示编为模块,空表示不使用。
编译内核时,将依次进入init-y、core-y、libs-y、drivers-y和net-y 所列出的目录中执行它们的Makefile,每个子目录都会生成一个 built-in.o(libs-y所列目录下,有可能生成lib.a文件)。最后,head-y所表示的文件将和在这些built-in.o、lib.a 一起被连接成内核映像文件 vmlinux。
在各级子目录下的也有各自的Makefile它的主要作用和为:
在配置内核时,生成配置文件.config。内核顶层Makefile使用如下语句间接包含.config 文件,以后就根据.config中定义的各个变量决定编译哪些文件。它包含了include/config/auto.conf 文件,然后将.config文件中的注释去掉,并根据顶层Makefile中定义的变量增加一些变量。
- #linux-3.5/drivers/char/Makefile
- obj-$(CONFIG_TINY4412_LEDS) += tiny4412_leds.o
- obj-$(CONFIG_TINY4412_HELLO_MODULE) += tiny4412_hello_module.o
- obj-$(CONFIG_TINY4412_BUTTONS) += tiny4412_buttons.o
- obj-$(CONFIG_TINY4412_BUZZER) += tiny4412_pwm.o
- obj-$(CONFIG_TINY4412_BACKLIGHT)+= tiny4412_backlight.o
- obj-$(CONFIG_TINY4412_ADC) += tiny4412_adc.o
链接方式:
对于ARM体系,连接脚本就是arch/arm/kernel/vmlinux.lds,它由 arch/arm/kernel/vmlinux/lds.S文件生成。
6.向内核中添加新模块
无论是向内核中添加新的功能还是驱动程序,都需要将相应的代码添加到内核构建系统中,需要完成以下三个工作:
①将编写的源码复制到Linux内核源码相应的目录下
②在目录的Kconfig文件中添加新源码对应项目的编译配置选项
③在目录Makefile文件中增加对新源码的编译条目
下面以刚才的Led驱动为例来说明
①将编写的源码复制到Linux内核源码相应的目录下
②在目录的Kconfig文件中添加新源码对应项目的编译配置选项
③在目录Makefile文件中增加对新源码的编译条目
Tiny4412 Linux 内核配置流程的更多相关文章
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】
本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...
- Linux 内核配置和编译
Linux 内核配置和编译 一.配置内核 (1). 为什么要配置内核 1. 硬件需求 2. 软件需求 选出需要的,去掉不要的 (2). 如何配置内核 1. make config 基于文本模式的交互 ...
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...
- linux 内核启动流程
Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...
- linux内核配置 kbuild
Linux 内核配置机制 http://blog.csdn.net/dianhuiren/article/details/6917132 linux kbuild文档 http://blog.chin ...
- Linux内核配置编译及基本调试方法
一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...
随机推荐
- Java中interface是否继承Object类
首先我们从C++说起, c++可以多继承.也就是一个类型 --- class,可以继承自2个以上的父类型.多继承导致一个问题,很多人知道.例如,如果类型B,类型C均继承自类型A.然后类型D继承自类型B ...
- Sharded数据分片定位数据
[http://www.tuicool.com/articles/UNnqUnU] Jedis分片 动机 在普通的Redis主/从方式,通常有一个主服务器负责"write"请求,多 ...
- spring boot: 线程池ThreadPoolTaskExecutor, 多线程
由于项目里需要用到线程池来提高处理速度,记录一下spring的taskExecutor执行器来实现线程池. ThreadPoolTaskExecutor的配置在网上找了很多解释没找到,看了下Threa ...
- DataGrid的组成论述(WPF)
DataGrid:它标示是一个整体概念,是个大容器,包含Row的感念 Column:是表格的组成成分(表格是由列组成的),它包括Header和Cell的概念
- 转:autofac在mvc和webapi集成的做法
本文转自:http://www.cnblogs.com/Hai--D/p/5992573.html var builder = new ContainerBuilder(); // Mvc Regis ...
- KMSpico软件下载:激活Windows系统和Office工具
每次都为激活Windows系统 和 Microsoft Offilce 工具头疼,为此特意记录并分享一下激活工具. 上资源:https://pan.baidu.com/s/1kI5YpCO2aYl-r ...
- linux 缺少libxxx.a 静态链接库
首先去官方网站下载gdb的源码包,我下载的7.4.1版本的源码包,解压开来,进入到源码包的根目录下.对于一个源码包,拿到手里首先要阅读的就是README,然后看一下INSTALL文件,这个文件里编译源 ...
- weinre
https://www.cnblogs.com/diva/p/3995674.html
- HDU3518Boring counting(后缀自动机)
Problem Description 035 now faced a tough problem,his english teacher gives him a string,which consi ...
- Java模版引擎:jsp、freemarker、velocity区别
在java领域,表现层技术主要有三种:jsp.freemarker.velocity. jsp是大家最熟悉的技术优点:1.功能强大,可以写java代码2.支持jsp标签(jsp tag)3.支持表达式 ...