配置过程最终结果是生成.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. Try-Catch真的会影响程序性能吗

    很多帖子都分析过Try-Catch的机制,以及其对性能的影响. 但是并没有证据证明,Try-Catch过于损耗了系统的性能,尤其是在托管环境下.记得园子里有位网友使用StopWatch分析过Try-C ...

  2. Windows事件--重复事件检测

    监视器--Windows事件--重复事件检测--计时器重置: 自动重置计时器:指定等待时间10分钟,则在10分钟后自动关闭该警报,更改状态为 正常(绿色) 检测事件1,事件3重置计数器状态,2分钟内检 ...

  3. 【转】】Vue项目部署tomcat,刷新报错404解决办法

    转自[https://blog.csdn.net/g631521612/article/details/82835518] 解决方式: - 在tocmat的webapps下的项目中创建WEB-INF文 ...

  4. faf

    1.Nginx的简单说明 a.  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器,期初开发的目的就是为了代理电子邮件服务器室友:Igor Sysoev开发 ...

  5. cmd命令提示符大全(干货)

    cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows CE与Windows NT平台为基础的操作系统(包括Windows 2000和XP中, Vista中,和Se ...

  6. Java集合框架中的快速失败(fail—fast)机制

      fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...

  7. 【[SDOI2013]泉】

    \(hash\)+容斥 但是看到这个令人愉快的数据范围还是直接枚举子集吧 首先我们发现\(6\)这个东西简直是小的可怜,复杂度里肯定有\(2^6\)的 于是我们可以直接先枚举子集,把所有状态的对应相等 ...

  8. druid相关资料

    官方资料直达地址: Druid 首页 https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5 Druid 常见问题 https://githu ...

  9. Spring(二)之入门示例

    任何编程技术,特别是入门示例,通常都是Hello World,在这里我也遵循这个业界公认的原则. 这里我使用的maven项目,大家如果想要演示,建议使用Eclipse(含maven插件)或Idea(含 ...

  10. ThinkPHP5入门(四)----模板篇

    一.模板访问 1.没有参数传递 $view = new View(); return $view->fetch(); 此时默认访问的模板路径为:[模板文件目录]/当前控制器名(小写+下划线)/当 ...