MACHINE_START MACHINE_END 宏(二)

2014-11-24 07:47:21 · 作者: · 浏览: 1
)
tags = (struct tag *)&init_tags;
if (mdesc->fixup) //若存在fixup方法则调用其方法
mdesc->fixup(mdesc, tags, &from, &meminfo);
if (tags->hdr.tag == ATAG_CORE) {
if (meminfo.nr_banks != 0)
squash_mem_tags(tags);
save_atags(tags);
parse_tags(tags);
}
init_mm.start_code = (unsigned long) _text;
init_mm.end_code = (unsigned long) _etext;
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = (unsigned long) _end;
/* parse_early_param needs a boot_command_line */
strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
/* populate cmd_line too for later use, preserving boot_command_line */
strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = cmd_line;
parse_early_param();
arm_memblock_init(&meminfo, mdesc); //这里可能会调用reserve方法
paging_init(mdesc); //->devicemaps_init(mdesc)->map_io方法
request_standard_resources(&meminfo, mdesc); //这里可能会调用video_start方法
#ifdef CONFIG_SMP
if (is_smp())
smp_init_cpus();
#endif
reserve_crashkernel();
cpu_init();
tcm_init();
arch_nr_irqs = mdesc->nr_irqs; //1设置全局变量 中断个数
init_arch_irq = mdesc->init_irq; //2设置全局变量 中断初始化函数
system_timer = mdesc->timer; //3设置全局变量 sys_timer结构体
init_machine = mdesc->init_machine; //4设置全局变量 板级初始化函数
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con;
#endif
#endif
early_trap_init();
}
0.
[cpp]
static struct machine_desc * __init setup_machine(unsigned int nr)
{
extern struct machine_desc __arch_info_begin[], __arch_info_end[];
struct machine_desc *p;
for (p = __arch_info_begin; p < __arch_info_end; p++)//遍历__arch_info_begin和__arch_info_end之间的machine_desc结构体
if (nr == p->nr) { //找到对应的板
printk("Machine: %s\n", p->name);//打印板级信息
return p;
}
early_print("\n"
"Error: unrecognized/unsupported machine ID (r1 = 0x%08x).\n\n"
"Available machine support:\n\nID (hex)\tNAME\n", nr);
for (p = __arch_info_begin; p < __arch_info_end; p++)
early_print("%08x\t%s\n", p->nr, p->name);
early_print("\nPlease check your kernel config and/or bootloader.\n");
while (true)
/* can't use cpu_relax() here as it may require MMU setup */;
}
1.中断个数
start_kernel->early_irq_init->arch_probe_nr_irqs函数中nr_irqs = arch_nr_irqs arch_nr_irqs : NR_IRQS;设置全局nr_irqs变量
2.中断初始化函数
start_kernel->init_IRQ->init_arch_irq()
3.sys_timer结构体
start_kernel->time_init()调用system_timer->init()方法既sys_timer->init()
4.板级初始化函数
[cpp]
static void (*init_machine)(void) __initdata;
static int __init customize_machine(void)
{
/* customizes platform devices, or adds new ones */
if (init_machine)//全局函数init_machine存在
init_machine();//则调用,既mdesc->init_machine()
return 0;
}
arch_initcall(customize_machine);//用arch_initcall修饰customize_machine函数
arch_iniitcall函数在/include/linux/init.h中定义
[cpp]
#define arch_initcall(fn) __define_initcall("3",fn,3)
__define_initcall的定义
[cpp]