[转帖]Linux 内核的 Makefile

linux,内核,makefile · 浏览次数 : 0

小编点评

**Linux内核配置系统的基本结构** **1. Makefile** *位于内核源代码根目录及各层目录中,定义 Linux 内核的编译规则。 * 负责指定编译内核目标文件(vmlinux )和模块(module )。 * 编译内核或模块时,该文件会被读取,并根据读到的内容配置编译环境变量。 *根据.config文件决定了内核根目录下那些文件、子目录被编译进内核。 **2. 配置文件(config.in(2.4内核,2.6内核))** * 给用户提供配置选择的功能。 * 包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。 **3. 配置工具** * 配置命令解释器:对配置脚本中使用的配置命令进行解释。 * 配置用户界面:提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面。 **4. Kernel Makefile** * 位于Linux 内核源代码的顶层目录,也叫 Top Makefile 。 * 主要用于指定编译Linux Kernel 目标文件(vmlinux )和模块(module )。 * 编译内核或模块时,该文件会被首先读取,并根据读到的内容配置编译环境变量。 * 根据.config文件决定了内核根目录下那些文件、子目录被编译进内核。 **5. Kbuild Makefile** * 系统使用Kbuild Makefile来编译内核或模块。 * 从Linux 内核2.6 开始,Linux 内核的编译采用Kbuild 系统 ,这同过去的编译系统有很大的不同。 * Kbuild Makefile指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。

正文

https://www.cnblogs.com/chenyuting/p/10773313.html

 

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 和配置文件就可以。

Linux内核中的Makefile

       Linux内核中的Makefile虽然复杂,但是它的目的和作用与简单的Makefile都是一样的,无非是将文件编译,链接。它复杂在Linux内核文件太多,包括各种架构、各种设备,如何根据用户需求把它们巧妙的联系在一起,是Linux内核Makefile的难点。在Linux内核里,每个子目录都有一个makefile,它被称作Kbuilt-makefile,它将当前目录的文件编译成built-in.o、以及库文件、模块文件。然后顶层Makefile里指定这些built-in.o的路径,将它们连接在一起,具体的细节,请看下文.

内核makefile.txt中将makefile分为 5部分,Kernel Makefile、ARCH Makefile、KBuild Makefile、.config文件以及scripts/Makefile.* 。

  • Kernel Makefile

Kernel Makefile 位于Linux 内核源代码的顶层目录,也叫 Top Makefile 。它主要用于指定编译Linux Kernel 目标文件(vmlinux )和模块(module )。编译内核或模块时,这个文件会被首先读取,并根据读到的内容配置编译环境变量。它根据.config文件决定了内核根目录下那些文件、子目录被编译进内核。

对于内核或驱动开发人员来说,这个文件几乎不用任何修改。

  • Kbuild Makefile

Kbuild 系统使用Kbuild Makefile 来编译内核或模块。从Linux 内核2.6 开始,Linux 内核的编译采用Kbuild 系统 ,这同过去的编译系统有很大的不同,当Kernel Makefile 被解析完成后,Kbuild 会读取相关的Kbuild Makefile 进行内核或模块的编译。Kbuild Makefile 有特定的语法指定哪些编译进内核中、哪些编译为模块、及对应的源文件是什么等。

内核及驱动开发人员需要编写这个Kbuild Makefile 文件。

  • ARCH Makefile

ARCH Makefile 位于ARCH/$(ARCH)/Makefile ,是系统对应平台的Makefile 。Kernel Top Makefile 会包含这个文件来指定平台相关信息。ARCH Makefile同样根据.config文件,决定了ARCH/$(ARCH) 目录下 那些文件、子目录被编译进内核。

只有平台开发人员会关心这个文件。

  • scripts/Makefile.* 通用规则

Makefile.build          被顶层Makefile所调用,与各级子目录的Makefile合起来构成一个完整的Makefile文件,定义built-in.o、.lib以及目标文件.o的生成规则。这个Makefile文件生                                          成了子目录的.lib、built-in.o以及目标文件.o
Makefile.clean         被顶层Makefile所调用,用来删除目标文件等
Makefile.lib              被Makefile.build所调用,主要是对一些变量的处理,比如说在obj-y前边加上obj目录
Kbuild.include          被Makefile.build所调用,定义了一些函数,如if_changed、if_changed_rule、echo-cmd 

  • .config

       来自配置过程,生成 auto.conf 以及 autoconf.h,被顶层Makefile所包含,参考http://blog.csdn.net/lizuobin2/article/details/51429937

 

 

 

【参考文献】

https://haohetao.iteye.com/blog/994620

https://blog.csdn.net/lizuobin2/article/details/51464152

https://blog.csdn.net/zhengmeifu/article/details/7682373 

与[转帖]Linux 内核的 Makefile相似的内容:

[转帖]Linux 内核的 Makefile

https://www.cnblogs.com/chenyuting/p/10773313.html Linux内核的配置系统的基本结构 Linux内核的配置系统由三个部分组成,分别是: 1、Makefile:分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则; 2、

[转帖]linux中内核的一个不错的参数somaxconn

最近发现很多内核优化参数都记不住了,写下文章来备记,方便以后查看. 编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释) #设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数) net.ipv4.ip_conntrack_max = 25000000 #最大

[转帖]Linux内核线程kthread简介【最好的一篇!】

https://zhuanlan.zhihu.com/p/581587583 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的

[转帖]Linux内核源码之Netfilter框架

https://zhuanlan.zhihu.com/p/413179209 一、概述:Netfilter是什么 对于不经常接触Linux内核的应用层开发者来说,可能对Netfilter了解的比较少。但大多数Linux用户多少都用过或知道iptables,然而,iptables的功能实现就是在Net

[转帖]Linux:页表中PGD、PUD、PMD、TLB等概念介绍

1、PGD: Page Global Directory Linux系统中每个进程对应用户空间的pgd是不一样的,但是linux内核 的pgd是一样的。当创建一个新的进程时,都要为新进程创建一个新的页面目录PGD,并从内核的页面目录swapper_pg_dir中复制内核区间页面目录项至新建进程页面目

[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别

本文介绍几种常用的Linux内核映像的区别。 一、vmlinux vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。 该映像可用于定位内核问题,但不能直接引导Linux系统启动。 使用readelf命令查看RockPI 4A单板Linux内核编译的vmlinux,内容

[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别

https://zhuanlan.zhihu.com/p/466226177 本文介绍几种常用的Linux内核映像的区别。 一、vmlinux vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。 该映像可用于定位内核问题,但不能直接引导Linux系统启动。 使用rea

[转帖]嵌入式Linux的基础知识介绍

https://zhuanlan.zhihu.com/p/598268657 嵌入式Linux是Linux内核的改编版,用于嵌入式系统。嵌入式Linux最流行的例子是Android 操作系统。 但是,需要大量硬件资源来支持嵌入式 Linux,特别是如果它将部署在实时机器对机器 (M2M) 通信、机器

[转帖]Linux内核信息相关命令:dmesg

https://bbs.huaweicloud.com/blogs/381167 【摘要】 在Linux 操作系统中,dmesg命令来显示与内核相关的消息,dmesg 命令提供了许多不同的消息,比如与消息相关的存储、模块、中断等。作为提供信息的底层工具,dmesg 命令需要root 权限,sudo

[转帖]linux 内核参数优化

Sysctl命令及linux内核参数调整 一、Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现。 命令格式: sysctl [-n] [-e] -w variable=value sysctl [-n]