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_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 \
};
- uboot Linux machine_arch_type辨析
- 辨析
- linux文件时间(atime,mtime,ctime)辨析
- uboot 启动linux小记
- uboot引导linux内核
- uboot+linux启动过程
- uboot 引导Linux
- 国嵌Linux视频Uboot
- linux uboot 启动顺序
- Linux嵌入式 -- Bootloader , Uboot
- uboot 引导Linux
- uboot....Linux机器码传递
- uboot引导linux内核
- Linux中Uboot详解
- Linux嵌入式 -- Bootloader , Uboot
- Blackfin537处理器的代码加载,启动模式和uboot引导的辨析
- uboot 与 Linux 内核移植
- uboot linux kernel 交汇处
- LUA学习笔记
- C#编码好习惯
- VFP的GRID中行记录上移或下移一行
- 16.4.5 等待多个事件
- 提高面试代码质量的三要素
- uboot Linux machine_arch_type辨析
- 鉴别真正牛奶生产日期
- uva 10247 complete tree labeling
- 如何在系统桌面启动之前启动其他界面
- Java读取文本配置文件
- 获取SqlServer表的字段
- 读取手机序列号IMEI,SIM序列号IMSI方法
- POJ 1011 Sticks 强大的剪枝
- 张维真:夫妻相处的人生哲学