start_kernel() -> setup_arch(&command_line) -> mdesc = setup_machine(machine_arch_type) -> list = lookup_machine_type(nr) -> return struct machine_desc。
内核在启动的时候就是最先运行start_kernel() , 然后她就会调用体系结构相关的setup_arch(&command_line), 如arm体系结构的在arch/arm/kernel/setup。c中, 进一步, 她就要初始化板级相关的设备,
但在此之前, 她必须找到这块目标板的描述结构, 所以她就先通过lookup_machine_type(nr)来查找这个结构, 传入的参数是又uboot传过来的, 存储在r2中。
如假设她传入的是'SMDK2410' 的nr, lookup_machine_type(nr) 就会找到如下的machine_desc。 这个结构在一个专门描述sddk2410的文件中--arch/arm/mach-s3c2410/mach-smdk2410。
c
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
/* Maintainer: Jonas Dietsche */
。
phys_io
= S3C2410_PA_UART,
。io_pg_offst
= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
。boot_params
= S3C2410_SDRAM_PA + 0x100,
//重要的板级初始化函数
。
map_io
= smdk2410_map_io,
。init_irq
= s3c24xx_init_irq,
。init_machine
= smdk2410_init,
。timer
= &s3c24xx_timer,
MACHINE_END
MACHINE_START的第一个参数是用来构造机器的类型的, 如这里的SMDK2410 ,
又下面的定义
。
nr
= MACH_TYPE_##_type
有 nr = MACH_TYPE_SMDK2410
而 MACH_TYPE_SMDK2410这些机器类型则在/include/asm-arm/mach-types。h中定义:
#define MACH_TYPE_SMDK2410
193
完整的结构描述如下:
struct machine_desc {
/*
* Note! The first four elements are used
* by assembler code in head-armv。
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
*/
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);
};。
全部