uboot Linux machine_arch_type辨析

来源:互联网 发布:听歌软件版权 编辑:程序博客网 时间:2024/06/15 23:34

mark


uboot和Linux kernel中均有对machine_arch_type的定义和使用。假设有这样的应用场景:一个bsp需要支持不同的板子,可能是同一个芯片的不同参考设计。在此情况下,bsp的大多数代码可以复用,只有极少数的板级配置不同。可以使用类似与machine_is_xx()的函数调用来区分。


uboot和Linux kernel下都有一个脚本文件gen_mach_type来生成mach-types.h文件,文件中的宏定义类似以下方式:

#ifdef CONFIG_MACH_S3C2410
# ifdef machine_arch_type
#  undef machine_arch_type
#  define machine_arch_type     __machine_arch_type
# else
#  define machine_arch_type     MACH_TYPE_S3C2410
# endif
# define machine_is_s3c410()        (machine_arch_type == MACH_TYPE_S3C2410)
#else
# define machine_is_s3c2410()        (0)
#endif


假设现在有s3c2410和s3c2440两个板子,CONFIG_MACH_S3C2410与CONFIG_MACH_S3C2440均有定义。在宏第一个s3c2410的时候

#  define machine_arch_type     MACH_TYPE_S3C2410

而在定义第二个s3c2440的时候,

#  define machine_arch_type     __machine_arch_type

因此machine_is_s3c410()和machin_is_s2c2440的真与假是由machine_arch_type也就是__machine_arch_type的值来决定的。如果只是定义一个配置,那就有CONFIG_MACH_S3C2410宏来决定。


那问题就回到__machine_arch_type的定义在哪里?参考网友的文章:


Setup_arch()函数主要工作是安装cpu和machine,并为start_kernel()后面的初始化函数指针指定值。
其中setup_processor()函数调用linux/arch/arm/kernel/head_common.S 中的lookup_processor_type函数查询处理器的型号并安装。
Setup_machine()函数调用inux/arch/arm/kernel/head_common.S 中的lookup_machine_type(__machine_arch_type)函数根据体系结构号__machine_arch_type,在__arch_info_begin和__arch_info_end段空间查询体系结构。问题是__machine_arch_type是在什么时候赋的初值?__arch_info_begin和__arch_info_end段空间到底放的是什么内容?
__machine_arch_type是一个全局变量,在arch/arm/boot/compress/misc.c的解压缩函数中得以赋值。
decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p, int arch_id)
{
  __machine_arch_type = arch_id;
}
__arch_info_begin和__arch_info_end段空间到底放的内容由链接器决定,存放是.arch.info.init段的内容。这个段是通过段属性__attribute__指定的。Grep一下.arch.info.init 得到./include/asm/mach/arch.h:53: __attribute__((__section__(".arch.info.init"))) = { \ 在linux/include/asm-arm/mach/arch.h 中发现MACHINE_START宏定义。
#define MACHINE_START(_type,_name) \
       static const struct machine_desc __mach_desc_##_type \
       __attribute_used__ \
  __attribute__((__section__(".arch.info.init"))) = { \
  .nr = MACH_TYPE_##_type, \
  .name = _name,
  #define MACHINE_END \
};
原创粉丝点击