配置过程最终结果是生成.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. 从golang-gin-realworld-example-app项目学写httpapi (三)

    https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/serializers.go 序列化 ...

  2. 【Oracle】Update方法

    1.单表更新 update customers set city_name='山西省太原市' where city_name='山西太原' 2.两表(多表)关联update -- 被修改值由另一个表运 ...

  3. Mysql常用函数汇总-经典实用

    以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...

  4. Shell使用手册

    1.循环数组 list=(20180531 20180430 20180331 20180228 20180131 20171231 20171130 20171031 20170930 201708 ...

  5. Linq使用技巧及查询示例(一)

    Linq的使用大体分为两种:语句表达式   和  方法 首先,我们要在控制器中定义好context private ApplicationDbContext db = new ApplicationD ...

  6. Xposed模块开发基本方法记录

    由于某些课程实验的要求,需要通过xposed框架对某应用进行hook操作,笔者选用了开源且免费的xposed框架进行实现.虽然网上存在一些利用xposed实现特定功能的文章资源,但大多均将xposed ...

  7. CSS加载性能优化

    将首屏页面要用到的CSS文件,放在页面头部加载,其他模块的CSS可以使用异步加载:loadCSS 和 Preload. 关于preload,推进2篇文章给大家看下: 1.通过rel="pre ...

  8. Innodb_io_capacity 对于IO稳定性的一些研究

    背景:最近在做一台线上服务器IO负载情况的时候发现了以下现象: 24小时的IO_UTIL 的曲线看似风平浪静,毛刺较少 但当图片放大到半小时级别的时候发现IO_UTIL即磁盘使用率出现了规律性的波动, ...

  9. Codeforces Round #440 (Div. 2)【A、B、C、E】

    Codeforces Round #440 (Div. 2) codeforces 870 A. Search for Pretty Integers(水题) 题意:给两个数组,求一个最小的数包含两个 ...

  10. calayer 的特殊属性整理

    calayer: An object that manages image-based content and allows you to perform animations on that con ...