配置过程最终结果是生成.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. 设置OWA访问HTTP到HTTPS的重定向

    需求:公司要求使用Http://mail.ever.com的方式来统一访问邮箱,所以需要进行相关的设置,将访问需求重定向到https://extest.ever.com/owa 首先在DNS里的eve ...

  2. Linq to Entities,ADO.NET Entity Framework 模型优先

    一.概念: Database First(数据库优先):存在的DB------------->生成Data Model  .edmx文件 Model First(模型优先):Data Model ...

  3. Hdfs&MapReduce测试

    Hdfs&MapReduce测试 测试 上传文件到hdfs 随意打开一个文件夹传一个文件试试(把javafx-src.zip传到hdfs的/根目录下):hadoop fs -put javaf ...

  4. codeforces 497E Subsequences Return

    codeforces 497E Subsequences Return 想法 做完这题,学了一些东西. 1.求一个串不同子序列个数的两种方法.解一 解二 2.这道题 \(n\) 很大,很容易想到矩阵加 ...

  5. host 'xx' is not allowed to connect to this MySql server

    update mysql.user set host = '%' where user = 'root'; FLUSH PRIVILEGES; select * from mysql.user;

  6. css3鼠标经过出现转圈菜单(仿)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. BZOJ 1008 越狱 组合数学

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1008 题目大意: 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗 ...

  8. Java中this关键字使用小结

    当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this. 因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this ...

  9. ubuntu命令安装jdk

    1.ubuntu使用的是openjdk,所以我们需要先找到合适的jdk版本.在命令行中输入命令: $apt-cache search openjdk 1 返回结果列表(因个人电脑而有所不同): def ...

  10. Modal实现页面跳转和控制器数据传递

    一.Model跳转的实现 1.新建工程 2.新建View控制器和导航控制器 (1)为拖控件,两个view一个navigation; 如图: (2)view的“GotoTwo”按键添加Segues到Na ...