Linux 内核配置及Makefile介绍

本文介绍了Linux内核源码结构,重点关注Makefile在编译过程中的作用。Makefile主要负责决定编译哪些文件、如何编译以及文件的链接顺序。内核配置可以通过make menuconfig进行,有三种方法:直接配置、基于默认配置修改和使用厂家配置。文章还简述了配置过程中ARCH变量的使用和图形化界面的配置选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Linux内核源码结构

Linux内核文件数目很多,除去其他CPU架构的代码,支持S3C2440、S3C2410这两款芯片的完整内核文件就有1万多个,这些文件的组织结构并不复杂,都是位于顶层目录下的17个子目录。个子目录功能如下图,最后两个目录不包含内核代码:



我们常需要用到的是 arch 目录,driver目录,kernel目录。

二、Linux的Makefile分析

在编译内核时,内核中的哪些文件将被编译?它们是怎样被编译的?它们链接时的顺序如何确定?哪个文件在最前面?哪些文件或函数先执行?这些都是通过makefile来管理的,Makefile最主要的三个作用:

1.决定编译哪些文件

2.怎样编译这些文件

3.怎样链接这些文件,它们的顺序是怎样的?

内核源码中Makefile文件分为以下5类:


由于能力时间有限,以后再来具体分析各级Makefile的实现。这是一个很庞大的工程,想要学习可以看下内核文档Documentation/kbuild/makefiles.txt,这个文件对Makefile讲解的非常清楚透彻,可惜是30页左右英文档,可能要花上好长一段时间来学习安静

下面简要总结一下Makefile的功能:

1.顶层Makefile决定内核根目录下哪些子目录被编译进内核

2.arch/$(ARCH)/Makefile 决定arch/$(ARCH)目录下哪些文件、哪些目录被编译进内核

3.各级子目录下的Makefile决定所在目录下的哪些文件将被编译进内核,那邪恶文件将被编译成模块(驱动),进入哪些子目录继续调用它们的Makefile

4. .config文件在配置内核时生成(make menuconfig时会读取该文件),Makefile结合.config来决定哪些文件编译进内核,哪些编译成模块,涉及到哪些子目录

5.顶层Makefile和arch/$(ARCH)/Makefile设置了可以影响所有文件的编译、链接选项:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS

6.各级子目录下的Makefile中可以设置能够影响当前目录下文件的编译、链接选项:EXTRA_CFLAGS、EXTRA_AFLAGS、EXTRA_LDFLAGS、EXTRA_ARFLAGS;还可设置可以影响某个文件的编译、链接选项:CFLAGS_$@、AFLAGS_$@

7.顶层Makefile按照一定的顺序组织文件,根据链接脚本arch/$(ARCH)/kernel/vmlinux.lds 生成vmlinux,继而生成内核镜像文件uImage。

三、Linux内核配置过程

有三种方法:

1.直接进行make menuconfig。这是最麻烦的一种方法,所有的配置都需要你来操作。

2.在默认配置上自己修改,也就是修改defconfig文件。使用 find -name "*defconfig*"查找你的架构对应的默认配置文件。在arch/arm/configs找到自己板子的默认配置文件。执行defconfig文件: make XXX_defconfig。XXX是你具体使用的板子型号。执行这一操作后,结果保存在.config文件。然后再执行make menuconfig命令。这时的配置就是在默认配置上稍加修改就可以了。

3.使用厂家的配置文件。如果你的硬件有厂家提供的config文件那是最轻松的。直接cp XXX .config。然后执行make menuconfig。

make menuconfig后会出来一个图形化界面,手动配置内核,一般进行驱动开发,会在这里选择,要把哪些驱动包含进内核,是直接编译进内核,还是编译成模块.ko文件,Y表示编译进内核,N表示不包含,M表示编译成模块

对于ARCH变量可以在执行 make时传入,如"make ARCH=arm s3c2410_defconfig"

以第二种方法为例:

执行命令 make ARCH=arm s3c2410_defconfig 后,生成了.comfig文件


接着执行 make menuconfig,出现图形化配置界面:


要配置某个驱动,上面有介绍怎么配置,移动到某个选项,按大写“Y”就显示[*],表示编译进内核;按大写“M”就显示[M],表示编译成模块;按大写“N”就显示[],表示不编译该文件。如下图


配置完成后,执行 make 或者 make uImage 编译生成Linux内核镜像文件uImage。

下一节学习下,Linux内核启动过程再见再见再见

参考 《嵌入式Linux应用开发完全手册》

参考:http://www.cnblogs.com/CrazyCatJack/p/6121231.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值