配置过程最终结果是生成.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. Python初学者第二十一天 函数(4)-内置函数

    21day 内置函数: 1.abs()绝对值函数 2.dict()创建一个字典 3.help()获取帮助信息 4.min()从一个列表中取出最小的数 5.max()从一个列表中取出最大值 6.bool ...

  2. Linux命令--目录处理

    ls命令 Linux ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录). 语法 ls [-alrtAFR] [name...] 参数 : -a 显示所有文件及目录 (ls内定 ...

  3. TCP/IP 协议图--网络层中的 IP 协议

    IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的主要作用是 ...

  4. fzu_oop_east 第一次作业

    第一题 题目: 代码: #include<iostream> #include<cstdio> using namespace std; class Date { public ...

  5. 使用android studio检测app内存泄漏【转载】

    Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的crash,甚至可能出现因内存不足而导致APP崩溃. 一般检测android ...

  6. django创建项目问题解决办法

    问题描述: Python编程:从入门到实践第十八章18.1.6 ❶(ll_env)learning_log$ django-admin.py startproject learning_log .❷ ...

  7. python中基于descriptor的一些概念(上)

    @python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2 ...

  8. 【[APIO2007]动物园】

    我好\(sb\)啊,把\(>>\)打成\(<<\)结果就写了两节课 那个一个人只能看到五个动物显然很鬼畜 那我们就可以压这一维了 \(dp[i][s]\)表示从第\(i\)个位 ...

  9. Window窗口布局 --- DecorView浅析

    开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局,我们知道,页面都是依附在窗口之上的,而DecorView即 ...

  10. ionic和angularjs的区别?

    a.ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化HTML.css和js的性能,构建高效的应用程序,而且还可以用于构建sass和angularJS的优化 b.AngularJS ...