欢迎光临散文网 会员登陆 & 注册

分析Linux内核源码组织结构(超详细~)

2022-06-29 15:15 作者:补给站Linux内核  | 我要投稿

本文主要参考韦东山老师的《嵌入式Linux应用开发完全手册》,基于Linux-2.6.32.2源码。 概要:本文内容包含Linux源码树结构分析、Linux Makefile分析、Kconfig文件分析、Linux内核配置选项分析。这些知识是为了理解内核文件的组织形式,为具体移植内核做知识准备。

1. Linux源码树结构分析

  • 对Linux源码树下个子目录内包含的内容进行列表罗列:

 

2.Linux Makefile分析

主要从三个方面讲解:编译哪些文件、如何编译文件、如何连接文件

Linux Makefile的分类

  • 编译哪些文件

【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)   

顶层Makefile决定哪些目录中的文件将编译进内核

  • 顶层Makefile将13个子目录分成5个部分:init-y、drivers-y、net-y、libs-y、core-y

  • 顶层通过下列语句包含和体系架构有关的Makefile。仔细观察可以看到/arch子目录的根目录下是没有Makefile文件的,而其它各子目录都是有Makefile。

所以在编译内核之前先要确定ARCH


默认的ARCH不是我们需要的,所以要进行修改


$$(srctree)/arch/$(SRCARCH)/Makefile对内核的内容进行了扩充

  • 可以看到一个新元素head-y,它还有一个特殊的地方,它是直接对应着两个文件,而不是目录。之所以分成两个是为了同时支持有无MMU的CPU,它们对应着两个不同的head$(MMUEXT).o 文件,由变量MMUEXT控制,可以在配置时设定。

  • 至此我们知道了编译时将进入哪些文件进行编译。编译时依次进入init-y、core-y、libs-y、drivers-y、net-y中列的目录调用其中的Makefile进行编译,每一个子目录都会生成build-in.o(libs-y所列的目录下有可能生成lib.a)。最后head-y列出的文件和build-in.o、lib.a一起连接成vmlinux.

在配置内核时,将会产生.config文件,Makefile将会在.config文件中添加下面两行。

有可能是版本原因,在2.6.32.2版本中并没有上面两个语句,有下面两句。

  • 观察.config文件会发现变量的值主要有两种y、m,各级的Makefile将会根据这些变量的值来决定编译哪些文件,同时是编译进内核,还是作为内核模块存在。


  • obj-y中定义的.o文件将由当前目录下的.c、.S文件及子目录下的build-in.o文件编译连接得到的。

  • 注意:obj-y中定义的.o文件的顺序是由意义的。

  • 下面是一段取自子目录中的Makefile文件内容,在该目录下有ioat和ipu子目录

  • obj-m中定义的.o文件是由的当前目录下的.c、.S文件编译生成,它们不会与build-in.o一起编译进入内核。而是被编译成.ko文件,作为模块存在。

  • 当.o文件由单文件编译而成时,用下面的语句:

当.o文件由多文件编译而成时,用下面的语句:

  • 编写驱动程序时,也是以这种方式编写Makefile。

  • lib-y中定义的.o文件是由的当前目录下的.c、.S文件编译生成,他们被打包成当前目录下的lib.a文件。同时出现在lib-y和obj-y中的文件,不会被包含进lib.a文件。

  • obj-y和obj-m可以用来指定进入下一级目录。


  • 怎么编译这些文件

怎么编译文件就是意味着编译选项和连接选项是什么。 这些选项分成3类:全局的(适用整个代码树)、局部的(适用单个Makefile)、个体的(适用单个文件)。 全局选项是在顶层Makefile和arch/$(ARCH)/Makefile中定义的,这些选项是CFLAGS、AFLAGS、LDFLAGS、ARFLAGS,它们分别是编译C文件的选项,编译汇编文件的选项,连接文件的选项,制作库文件的选项。 局部选项在各自子目录中定义,名称为:EXTRA_CFLAGS、EXTRA_AFALGS、EXTRA_LDFALGS、EXTRA_ARFLAGS. 对单文件设定编译选项,可以用CLFAGS_$@、AFLAGS_$@,前者对C文件,后者对汇编文件。 注意:3类选项是一起使用的,在scripts/Makefile.lib中可以看到:

  • 如何连接文件

在顶层Makefile文件中有如下语句:

  • 可以看出以后的连接是相当于着五种built-in.o文件和head-o文件的连接。

  • 之后对这些文件再次进行合并

  • 可以看出初始化代码由两部分组成head-y和init-y两部分组成,而且head-y是在init-y的前面。所以总的代码顺序是arch/arm/kernel/head.o(假设有MMU,没有的话是head_nommu.o)、arch/arm/kernel/init_task.o、init/build-in.o。

  • 连接脚本是arch/$(SRCARCH)/kernel/vmlinux.lds,它由arch/$(SRCARCH)/kernel/vmlinux.lds.S生成。

  • 具体连接细节可以查看上面的文件内容。

3.内核的Kconfig分析

  • 内核配置工具读取各个Kconfig文件,生成配置界面共开放人员配置内核,最后生成配置文件.config。

  • 关于Kconfig的最权威资料在/Documentations/Kbuild/kconfig-language.txt

Kconfig语法分析:

  • Kconfig的基本要素:config

  • config经常被其它条目包含,用来生成菜单和多项选择。

上述代码是config的常用方式:

在配置界面中配置了该选项后,会在.config中出现 CONFIG_JFFS2_FS_WBUF_VERIFY = y或者m.

在配置界面中将会显示Verify JFFS2 write-buffer reads选项,bool是变量的类型,一共有5种变量类型:bool、tristate、 string 、hex 、int,bool变量有两种取值y,m;tristate变量有三种取值y,m,n;string可以取字符串;hex取十六进制数;int取十进制数。

代表只有在JFFS2_FS_WRITEBUFFER被配置时,才会进行该选项的配置。

代表默认的情况下是选择n

代表在该选项被选种时,会将FS_POSIX_ACL也选种。

当在配置时按H时会显示该信息。

menu条目

  • 配置界面的主界面是由根目录下Makefile中ARCH配置决定的,当选择arm时,/arch/arm中的Kconfig文件将会用来生成主目录。

设定主目录的名称

  • 将会创建System Type子目录

choice条目

  • choice将多个类似的配置选项组合在一起,供用户多选和单选

  • 上述代码给出提示信息,选中之后就可以进行选择配置

  • choice条目中定义的变量类型只能是bool和tristate,当配置的代码编译入内核时为bool,只能有一个条目选择为y;当编译成模块时为tristate或bool,为bool时,也只能是一个为y,当为tristate时,可以有多个m。

comment条目

  • comment条目用于提供帮助信息,出现在配置界面的第一行。

source条目

  • 用于包含其他Kconfig文件

菜单形式的配置界面的操作方法配置界面中[*]、< M >、[ ]分别表示相应的文件被编译进内核、编译成模块、没有被编译。

  • 当执行第一条语句时,将.config外的config文件加载,当执行第二条时,表示存储成处.config 外的config文件。

4.Linux内核配置选项

  • 与移植密切相关的内容是System Type、Device Driver。

内核配置主界面内容

  • 在配置内核的时候按照顺序进行,因为前面的配置会影响后面的。



分析Linux内核源码组织结构(超详细~)的评论 (共 条)

分享到微博请遵守国家法律