kernel内核中处理器类型的定义mach-types.h文件的生成

来源:互联网 发布:手机电视遥控器软件 编辑:程序博客网 时间:2024/06/05 15:39

在linux的kenel配置的时候,会生成一个mach-types.h文件,里面用来定义处理器的ID,在2.6.36之前好像是生成到include/asm-arm文件夹里面,2.6.36之后则会生成到include/generated目录里面。

这个处理器的ID作用大家都知道,就是bootloader一定要把处理器ID号传给内核,这样内核才能找到相应的处理器,如果匹配时出错,则会出现系统死掉。如果是新添加一个处理器,则需要修改arch/arm/tools/mach-types 文件,并在文件里面加上你的处理器的ID号

machine_is_xxx    CONFIG_xxxx     MACH_TYPE_xxx    number

例如,S3C2440的定义如下

s3c2440    ARCH_S3C2440    S3C2440   362

362即是2440的处理器ID号。。。

 

转一篇有用的文章:

http://hi.baidu.com/youren4548/blog/item/2a3eb699ac841d1b6e068cd7.html

 

mach-types.h 的生成
2011-01-27 20:42
        准备将Linux的启动过程仔细的看看,内核为2.6.16,芯片为SEP4020,首先看的部分是机器号的添加。修改的文件为:linux/arch/arm/tools/mach-types,在其最后添加了
sep4020            ARCH_4020     GFD4020         194
bootloader一定要把机器号传给内核,这样内核才能找到相应的处理器,如果匹配时出错,则会出现系统死掉。但是内核又是如何根据这个194找到我们的处理器,找到我们的板级设备??
       对我们有用的是 /linux/include/asm-arm/mach-types.h文件,但是我们在编译内核时此文件时没有的,在编译的时候才会生成,本文主要就是描述一下mach-types.h的大概生成过程,其它就不再多说了。
1、首先看linux/arch/arm/tools/目录:
有三个文件:
gen-mach-types 
mach-types 
Makefile
我们刚才修改了其中的一个文件mach-types ,这里面保存了机器号等数据,但是我们现在看看怎么使用。
2、先分析Makefile文件:

a)include/asm-arm/mach-types.h:$(src)/gen-mach-types $(src)/mach-types

 目标文件:include/asm-arm/mach-types.h

 依赖文件:gen-mach-typesmach-types
 
就是本目录下的另外两个文件了。

b)@echo '  Generating$@'
用来在编译时输出:Generating include/asm-arm/mach-types.h

c)$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }

此行为命令,相当于:

@awk -fgen-mach-typesmach-types >include/asm-arm/mach-types.h

这个部分还没用到(暂时还不知道啥意思|| { rm -f $@; /bin/false; }
就是通过 awk 命令,由gen-mach-types,mach-types两个文件生成mach-types.h文件。

其中gen-mach-types为命令文件mach-types为所要读取的源文件。下面来分析gen-mach-types文件,这是这篇文章的的重点。

3、分析gen-mach-types文件:

a)首先介绍一下awk(可以baidu一下):

      AWK是一种优良的文本处理工具,它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。

b)使用方法:

一、awk命令行,你可以象使用普通UNIX命令一样使用awk。

二、使用-f选项调用awk程序。awk允许将一段awk程序写入一个文本文件,然后在awk命令行中用-f选项调用并执行这段程序。此处的gen-mach-types就是一个例子。

c)语法:网上很多但是要注意元字符的使用。

d)分析代码:


第 5 行:BEGIN   { nr = 0 }

        显然此处是给变量nr赋初值为0。

        在awk 中两个特别的表达式,BEGIN和END,这两者都可用于pattern中,提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

第 6 行/^#/    { next }

       此处的目的是如果遇到目标文件中 #开头的行,则跳过这一行。

      //内是要匹配的字符。

      ^ 为 元字符,表示在文件中的行首进行匹配。           例如:/^sun/表示模式匹配以sun开头的行。

      { next }awk 的 nex t语句导致 awk 读取下一个记录并完成模式匹配,即放弃此行读取下一行。

第 7 行: /^[     ]*$/ { next }

    此处的目的是如果遇到目标文件中以0个或多个空格开头的 行和结尾,则跳过这一行(理解可能有误)。

第 9 ~ 14 行:‍‍ 

NF == 4 { 
            machine_is[nr] = "machine_is_"$1;
            config[nr] = "CONFIG_"$2;
            mach_type[nr] = "MACH_TYPE_"$3;
            num[nr] = $4; nr++
          }

    如果此行的字段数为 4 ,则将此行的每一段添加上对应的头后保存到指定的数组中,$1,$2,$3,$4分别为四个字段的数据。语句语句执行完后,mach-types文件中的所有字段就被保存下来了。

第 16 ~ 23 行:类似于上一段,此处不讲了。

     上面的操作都属于 BEGIN,由于任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行。所以这些操作执行完后,准备执行END 部分。

第 24 行:END     {

    已经在第 5 行介绍BEGIN处讲过。
第 25 ~ 37 行:

   主要是向mach-types.h 文件中写入数据,有提示语句,也有头文件之类的。

    其中第 31 行:

    printf("#include <linux/config.h>/n/n");

    用来包含config.h头文件来获知#define CONFIG_ARCH_SEP4020 1   
第 38 ~ 40 行:

     定义对应的芯片类型为对应的机器号。

第 39 行: if (num[i] ~ /..*/)

    如果数组的值为一个字符或者多个字符则表达式为真。

    .表示匹配任意单个字符,如果一个单字符紧跟*,匹配0个或多个此字符。

    ~ 为相等时,不等用!~来表示,如第 65 行。

第 43 ~ 57 行:

      写入每个芯片对应的配置宏定义,写完后的例子为:

      #ifdef CONFIG_ARCH_4020                                             //此处为真,CONFIG_ARCH_4020 = 1
      # ifdef machine_arch_type
      #  undef machine_arch_type
      #  define machine_arch_type     __machine_arch_type
      # else
      #  define machine_arch_type     MACH_TYPE_GFD4020               //定义芯片类型为GFD4020

      # endif
      # define machine_is_sep4020()   (machine_arch_type == MACH_TYPE_GFD4020)            //判断是否为4020

      #else
      # define machine_is_sep4020()   (0)
      #endif
第 59 ~ 73 行:

     显示没有注册的芯片类型。

至此gen-mach-types先分析完毕,中间有for循环判断的地方,还得查找资料看看。