配置过程最终结果是生成.config文件,我们想要对配置的目的有很清楚的了解,必须先对.config文件进行分析。通过cd命令切换到linux-2.6.22.6内核目录,输入vi .config 可以看到如下图所示内容(截图仅部分内容):

分析.config文件被什么文件使用,为了简便化我们以网卡DM9000配置项为例进行分析。首先要在.config文件内找到关于DM9000相应配置,vi编辑器环境下输入 /DM9000  命令既能执行搜索命令,搜索的结果如下图:

这里CONFIG_DM9000=y代表编译时对DM9000的支持会被编译进内核,如果不进行设置,内核就不支持网卡,如果CONFIG_DM9000=m的话,最终网卡会被编译成一个模块,这个模块可以动态加载到内核中。

输入 :q 命令退出vi编辑器,通过 grep "CONFIG_DM9000" * -rwR 可以查找到哪些文件包含 "CONFIG_DM9000" 这个值。执行上面搜索命令,可以找到有很多和 "CONFIG_DM9000" 相匹配的文件目录,省去一些默认配置和一些其他芯片的配置文件,可以看到下图内容:

由以上分析可以看出下面四类文件(省去默认配置和一些不相关)包含"CONFIG_DM9000"

  1. c源码文件:CONFIG_DM9000
  2. 子目录下的Makefile文件:drivers/net/Makefile
  3. include/config/auto.conf
  4. include/linux/autoconf.h

C源码中使用的"CONFIG_DM9000"宏显然不可能在Makefile中定义,它的来源只能是include/linux/autoconf.h,也就是说C源码中一定包含autoconf.h文件。由autoconf.h文件名称可以大概猜测到,它来源于执行 make 命令或 make uImage 命令根据.config文件内容自动生成。切换到include/linux/目录,使用 vi autoconf.h 可以看到"CONFIG_DM9000"被定义成宏。

不管配置项中 CONFIG_DM9000=y 或者CONFIG_DM9000=m,只要使能网卡,CONFIG_DM9000不为空,autoconf.h中宏都被定义为1,这些宏在c源码中被包含使用。显然.config中这些配置项中配置等于y或者等于m的差异不是在自动生成.h文件中体现,那么我们可以先去猜测这些差异是在子目录下的Makefile中体现。

先介绍一下子目录的Makefile文件格式,它们格式一般比较简单,可以分为两种形式 obj-y +=xxx.o 、obj-m +=yyy.o。使用obj-y +=xxx.o时,xxx.c文件最终会被编译到内核中去,使用obj-m +=yyy.o,yyy.c文件最终被编译成一个模块,运行时可自动加载到内核中。通过 vi  drivers/net/Makefile 可以看到子目录下Makefile文件,找到DM9000项可以看到下面内容:

子目录里的CONFIG_DM9000是在哪里定义呢?我们可以通过 vi include/config/auto.conf 命令查看auto.conf文件,auto.conf文件内容如下:

我们可以看出auto.conf文件内容与.config文件内容相似,由它的名字也可以猜到auto.config文件也是执行make 命令或 make uImage 命令根据.config文件内容自动生成。auto.config文件也会和autoconf,h文件一样被其它文件包含,而包含它的文件是顶层的Makefile文件。

总结:通过以上分析可以知道,配置内核时会生成.config文件。执行 make  命令或 make uImage 命令会根据配置生成的.config文件,执行以下两种操作:

1 .config文件内容被用来自动创建生成auto.conf文件,auto.config文件被顶层Makefile文件包含,被子目录下的Makefile文件使用。

    例如子目录下obj-$(CONFIG_DM9000) +=dm9000.o语句,CONFIG_DM9000由配置文件确定。当配置文件中CONFIG_DM9000等于y时,$(CONFIG_DM9000)等于y,此时dm9000.c被编入内核中,当配置文件中CONFIG_DM9000等于m时,$(CONFIG_DM9000)也为m,dm9000.c被编入模块中。

2 .config文件内容同时被用来自动创建生成autoconf.h文件,autoconf.h文件定义相应宏作为头文件被c源代码包含使用。

linux-2.6.22.6内核启动分析之配置的更多相关文章

  1. linux-2.6.22.6内核启动分析之Makefile文件

    学习目标 分析Makefile文件,了解内核中的哪些文件被编译,如何被编译,连接时顺序如何确定! Linux内核源码中包含很多的Makefile文件,这些Makefile文件又包含其它的一些文件,比如 ...

  2. linux-2.6.22.6内核启动分析之编译体验

    1 解压缩.打补丁操作 1.1 打开ubuntu,通过FTP将windows相应文件夹下的linux-2.6.22.6.tar.bz2和补丁文件linux-2.6.22.6-jz2440.patch上 ...

  3. linux-2.6.22.6内核启动分析之head.S引导段代码

    学习目标: 了解arch/arm/kernel/head.S作为内核启动的第一个文件所实现的功能! 前面通过对内核Makefile的分析,可以知道arch/arm/kernel/head.S是内核启动 ...

  4. 第3阶段——内核启动分析之start_kernel初始化函数(5)

    内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...

  5. mkimage工具 加载地址和入口地址 内核启动分析

    第三章第二节 mkimage工具制作Linux内核的压缩镜像文件,需要使用到mkimage工具.mkimage这个工具位于u-boot-2013. 04中的tools目录下,它可以用来制作不压缩或者压 ...

  6. Linux内核启动分析过程-《Linux内核分析》week3作业

    环境搭建 环境的搭建参考课件,主要就是编译内核源码和生成镜像 start_kernel 从start_kernel开始,才真正进入了Linux内核的启动过程.我们可以把start_kernel看做平时 ...

  7. Linux内核启动分析

    张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...

  8. linux内核启动分析(2)

    -----以下内容为从网络上整理所得------ 主要介绍kernel_init线程(函数),这个线程在rest_init函数中被创建,kernel_init函数将完成设备驱动程序的初始化,并调用in ...

  9. Linux内核启动分析笔记

    一.驱动加载 1.驱动加载调用关系 start_kernel //init/main.c rest_init //最后执行它 kernel_init //使用kernel_thread创建一个进程执行 ...

随机推荐

  1. linux下部署redis

    基础知识: 1.Redis的数据类型: 字符串.列表(lists).集合(sets).有序集合(sorts sets).哈希表(hashs)2.Redis和memcache相比的独特之处: (1)re ...

  2. In-app Billing 概述

    这个文档讲解了In-app Billing的基础构成和功能,为了能够把In-app Billing功能添加到你的程序中,你需要很好的理解这些内容. 注意: 保证你的应用遵从发布地国家的相关法律. 举例 ...

  3. [BZOJ 4036][HAOI2015]按位或

    4036: [HAOI2015]按位或 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 746  Solved: 4 ...

  4. 020.2.2 runtime类

    基本不用,简单看一下就行了 1.属于单例的一个实例,可以通过getRuntime()获取对象Runtime r = Runtime.getRuntime();r.exec("winmine. ...

  5. CSS样式命名规则

    1.样式命名外 套: wrap主导航: mainnav子导航: subnav页 脚: footer整个页面: content页 眉: header页 脚: footer商 标: label标 题: t ...

  6. Apache Kafka系列(七)Kafka Repartition操作

    Kafka提供了重新分区的命令,但是只能增加,不能减少 我的kafka安装在/usr/local/kafka_2.12-1.0.2目录下面, [root@i-zk1 kafka_2.-]# bin/k ...

  7. UVa 12230 - Crossing Rivers(数学期望)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. 「bzoj 4025: 二分图」

    题目 显然二分图没有奇环 于是考虑使用并查集维护一下看看是否存在奇环 我们可以考虑加权并查集,维护出\(x\)到\(fa_x\)的实际距离 由于我们只需要考虑奇偶性,于是我们处理出到根的路径异或一下就 ...

  9. StackExchange.Redis学习笔记(一) Redis的使用初探

    Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...

  10. PAT——1065. 单身狗

    “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数:随后N行 ...