#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type \
__used \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};
struct machine_desc {
/*
* Note! The first four elements are used
* by assembler[汇编程序] code in head.S, head-common.S
*/
unsigned int nr; /* architecture[体系结构] number */
unsigned int phys_io; /* start of physical io */
unsigned int io_pg_offst; /* byte offset for io
* page tabe entry */
const char *name; /* architecture name */
unsigned long boot_params; /* tagged list uboot传递参数的物理地址在setup_arch中被转成虚拟地址*/
unsigned int video_start; /* start of video RAM */
unsigned int video_end; /* end of video RAM */
unsigned int reserve_lp0 :1; /* never has lp0 */
unsigned int reserve_lp1 :1; /* never has lp1 */
unsigned int reserve_lp2 :1; /* never has lp2 */
unsigned int soft_reboot :1; /* soft reboot */
void (*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void (*map_io)(void);/* IO mapping function*/
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
};
该结构中的函数何时被调用
1,fixup
在函数setup_arch中,解析uboot传递的tags时被调用到。
if (mdesc->fixup)
mdesc->fixup(mdesc, tags, &from, &meminfo);
2,map_io
setup_arch
->paging_init
->devicemaps_init
if (mdesc->map_io)
mdesc->map_io();
3,init_irq
1>先在setup_arch中被赋值给全局变量init_arch_irq
init_arch_irq = mdesc->init_irq;
2>再在start_kernel函数中调用init_IRQ函数时被调用
start_kernel
->init_IRQ
->init_arch_irq
4,init_machine
1>先在setup_arch中被赋值给全局变量init_machine
init_machine = mdesc->init_machine;
2>被customize_machine函数调用
if (init_machine)
init_machine();
3>customize_machine被arch_initcall(customize_machine)宏声明
4>arch_initcall被按如下顺序调用
start_kernel
->rest_init
->kernel_init
->do_basic_setup
->do_initcalls
被调用
以上这4个函数被调用的顺序依次为:
1,fixup, 2,map_io, 3,init_irq, 4,init_machine
5,timer结构中的函数
1>timer先在setup_arch中被赋值给全局变量system_timer
system_timer = mdesc->timer;
2>在time_init中调用system_timer->init()
system_timer->init();
3>在start_kernel函数中调用time_init函数