uboot Linux machine_arch_type辨析
markuboot和Linux kernel中均有对machine_arch_type的定义和使用。假设有这样的应用场景:一个bsp需要支持不同的板子,可能是同一个芯片的不同参考设计。在此情况下,bsp的大多数代码可以复用,只有极少数的板级配置不同。可以使用类似与machine_is_xx()的函数调用来区分。uboot和Linux kernel下都有一个脚本文件gen_m
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_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 \
};
更多推荐
所有评论(0)