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
a)include/asm-arm/mach-types.h:$(src)/gen-mach-types $(src)/mach-types 目标文件:include/asm-arm/mach-types.h 依赖文件:gen-mach-types,mach-types b)@echo ' Generating$@' c)$(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; } 此行为命令,相当于: @awk -fgen-mach-typesmach-types >include/asm-arm/mach-types.h 这个部分还没用到(暂时还不知道啥意思):|| { rm -f $@; /bin/false; } 其中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)分析代码: 显然此处是给变量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 { 第 16 ~ 23 行:类似于上一段,此处不讲了。 上面的操作都属于 BEGIN,由于任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行。所以这些操作执行完后,准备执行END 部分。 第 24 行:END { 已经在第 5 行介绍BEGIN处讲过。 主要是向mach-types.h 文件中写入数据,有提示语句,也有头文件之类的。 其中第 31 行: printf("#include <linux/config.h>/n/n"); 用来包含config.h头文件来获知#define CONFIG_ARCH_SEP4020 1 定义对应的芯片类型为对应的机器号。 第 39 行: if (num[i] ~ /..*/) 如果数组的值为一个字符或者多个字符则表达式为真。 .表示匹配任意单个字符,如果一个单字符紧跟*,匹配0个或多个此字符。 ~ 为相等时,不等用!~来表示,如第 65 行。 第 43 ~ 57 行: 写入每个芯片对应的配置宏定义,写完后的例子为: #ifdef CONFIG_ARCH_4020 //此处为真,CONFIG_ARCH_4020 = 1 # endif #else 显示没有注册的芯片类型。 至此gen-mach-types先分析完毕,中间有for循环判断的地方,还得查找资料看看。
就是本目录下的另外两个文件了。
用来在编译时输出:Generating include/asm-arm/mach-types.h
就是通过 awk 命令,由gen-mach-types,mach-types两个文件生成mach-types.h文件。
第 5 行:BEGIN { nr = 0 }
machine_is[nr] = "machine_is_"$1;
config[nr] = "CONFIG_"$2;
mach_type[nr] = "MACH_TYPE_"$3;
num[nr] = $4; nr++
}
第 25 ~ 37 行:
第 38 ~ 40 行:
# ifdef machine_arch_type
# undef machine_arch_type
# define machine_arch_type __machine_arch_type
# else
# define machine_arch_type MACH_TYPE_GFD4020 //定义芯片类型为GFD4020
# define machine_is_sep4020() (machine_arch_type == MACH_TYPE_GFD4020) //判断是否为4020
# define machine_is_sep4020() (0)
#endif
第 59 ~ 73 行:
- kernel内核中处理器类型的定义mach-types.h文件的生成
- linux3.1.0内核中/include/generated下mach-types.h的产生
- 早期版本的内核头文件kernel.h
- linux内核学习中--“list.h”文件中 hlist所有函数与宏定义的详解
- types.h的作用
- 28 ubuntu的bits/types.h 等头文件位置
- C语言头文件#include<sys/types.h>的作用
- sys/types.h的作用
- <sys/types.h>的作用
- DB2 存储过程的异常处理器类型有几种?
- linux内核中的fcntl.h文件操作中的打开文件模式的宏定义
- sys/types.h中howmany宏的使用
- 对linux内核中compiler.h文件的分析
- 读Kernel感悟-Linux内核启动-内核的生成
- kernel内核的头文件#include
- 一些函数的头文件<stdio.h><unistd.h><sys/types.h><stdlib.h><sys/wait.h>头文件的作用
- #include <sys/types.h>的作用
- #include <sys/types.h>的作用
- windows编程基础
- Window服务
- MySQL安装 For win
- gevent 安装
- gridview合并单元格
- kernel内核中处理器类型的定义mach-types.h文件的生成
- 对应数据关系的交叉表
- UBI文件系统
- Eclipse building workspace 不终止
- 关于CentOS的几个网站
- Telnet performance analysis on Windows XP
- VS2005 SP1 “无法使用此产品的安装源,请确认安装源存在,并且您可以访问它”的错误
- Windows Socket IO 模型【转帖】
- 转载 达芬奇五年沉浮——嵌入式处理器架构之争决战2012