内核版本

linux 2.6.32.2

配置内核的过程

配置内核可以通过执行 make menuconfig 来进行,下面分析该命令的执行流程

执行该目标

%config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

依赖目标

scripts_basic:
    $(Q)$(MAKE) $(build)=scripts/basic

$(build) 的作用

### 
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
# 原文件中的注释已经说得很清楚了,这是一个执行特定 Makefile 的缩写
# 因此 $(Q)$(MAKE) $(build)=scripts/basic 可以转换为
# $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
# 即 make 执行 Makefile.build 这个文件

Makefile.build 关键语句

这几句的目的是把 obj 记录的目录下的 Makefile include 进来,从而编译一些主机上运行的程序

# src := $(obj)
# The filename Kbuild has precedence over Makefile
# kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
# kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
# include $(kbuild-file)

make menuconfig

现在回到原始目标上,make menuconfig 执行的指令如下

%config: scripts_basic outputmakefile FORCE
    $(Q)mkdir -p include/linux include/config
    $(Q)$(MAKE) $(build)=scripts/kconfig $@

# 即主要是执行
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig

同样的,它还会再次进入到 Makfile.build 文件中,并把 scripts/kconfig 目录下的 Makefile 包含进来,同时执行的目标变成了 menuconfig

scripts/kconfig/Makefile

对应的目标如下

ifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
# 实际是这个值,比如 arch/arm/Kconfig
Kconfig := arch/$(SRCARCH)/Kconfig
endif

menuconfig: $(obj)/mconf
    $< $(Kconfig)

其依赖于 scripts/kconfig/mconf 这个程序,而此程序并不存在,在该 Makefile 以下的内容中给出了其生成规则,并且还会检查生成该程序所以来的程序是否存在,执行的脚本是 scripts/kconfig/lxdialog/check-lxdialog.sh,如果没有安装依赖库,则出现错误提示

# Check if we can link to ncurses
check() {
        $cc -xc - -o $tmp 2>/dev/null <<'EOF'
#include CURSES_LOC
main() {}
EOF
    if [ $? != 0 ]; then
        echo " *** Unable to find the ncurses libraries or the"       1>&2
        echo " *** required header files."                            1>&2
        echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
        echo " *** "                                                  1>&2
        echo " *** Install ncurses (ncurses-devel) and try again."    1>&2
        echo " *** "                                                  1>&2
        exit 1
    fi
}

这就是为什么执行 make menuconfig 之前需要先安装该程序的原因,因为需要用到它~

以上步骤顺利完成之后,scripts/kconfig/mconf 程序就顺利生成了,接下来就是真正的开始启动配置了

scripts/kconfig/mconf $(Kconfig)
# 以 arm 为例,以下路径其实已经被替换成了绝对路径,这里省略
scripts/kconfig/mconf arch/arm/Kconfig

至此,真正的配置工作开始了,mconf 开始读取 Kconfig 并进行解析,其解析规则可以查看 mconf.c 文件,当然了,没必要去看它如何实现的,只需要了解 Kconfig 的语法即可,其语法可以参考https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.html

如果不出意外,现在终端上会显示一个图形界面,然后就可以对各个选项进行配置了,退出之后程序会把配置项写入到 .config 文件中,并生成相应的头文件供源码使用。

LInux内核配置过程的更多相关文章

  1. Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】

    本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...

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

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

  3. Linux内核配置编译及基本调试方法

    一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...

  4. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  5. Linux 内核配置和编译

    Linux 内核配置和编译 一.配置内核 (1). 为什么要配置内核 1. 硬件需求 2. 软件需求 选出需要的,去掉不要的 (2). 如何配置内核 1. make  config 基于文本模式的交互 ...

  6. linux内核配置 kbuild

    Linux 内核配置机制 http://blog.csdn.net/dianhuiren/article/details/6917132 linux kbuild文档 http://blog.chin ...

  7. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  8. Linux内核启动过程start_kernel分析

    虽然题目是start_kernel分析,但是由于我在ubuntu环境下配置实验环境遇到了一些问题,我觉得有必要把这些问题及其解决办法写下来. 首先我使用的是Ubuntu14.04 amx64,以下的步 ...

  9. 学习笔记之Linux内核编译过程

    准备工作 物理主机:win8(32位) 虚拟机工具:VirtualBox_4.3.16_Win32 虚拟主机:xubuntu-12.04.4 安装virtualBox功能增强包 设置好虚拟机与主机的共 ...

随机推荐

  1. Vue导入非模块化的第三方插件功能无效解决方案

    一.问题: 最近在写vue项目时,想引入某些非模块化的第三方插件时,总是发现会有报错.且在与本地运行插件测试对比时发现插件根本没有注入到jQuery中(console.log($.fn)查看当前jq有 ...

  2. 安装Fedora后

    更新操作系统版本: https://fedoraproject.org/wiki/DNF_system_upgrade    靠谱: 设置ssh:ssh生成公钥私钥.默认root(.ssh/confi ...

  3. ubuntu server 1604 配置网络信息

    对于新安装的linux 服务器(ubuntu server 1604)   一,配置网络 连接网线与路由器 查看系统的网卡信息 ifconfig -a //列出所有的网卡信息,不管启用还是没有启用的 ...

  4. 论文阅读:Face Recognition: From Traditional to Deep Learning Methods 《人脸识别综述:从传统方法到深度学习》

     论文阅读:Face Recognition: From Traditional to Deep Learning Methods  <人脸识别综述:从传统方法到深度学习>     一.引 ...

  5. 扛把子组20191031-8 alpha week 1/2 Scrum立会报告+燃尽图 06

    此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9916 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 ...

  6. 爬虫json文件存储形式

    json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...

  7. vue路由跳转

  8. js对象的直接赋值、浅拷贝与深拷贝

    最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期 ...

  9. 2019牛客暑期多校训练营(第二场)J.Subarray

    题意:给你一个n 表示有n段连续的1序列 现在问你 在总长度为0~1e9-1的范围内有多少个大于0的子段 思路:假设我们统计了当前的前缀和 我们显然可以用树状数组维护一下前缀和 这样我们可以nlogn ...

  10. R语言学习笔记(2)——数据结构与数据集

    一.数据集 数据集的概念 数据集是由数据组成的矩阵数组,行表示观测(observation),列表示变量(variable) 数据类型 数值型变量 PatientID.AdmData.Age 为数值型 ...