• linux的MACHINE_START-MACHINE_END(转)


    转自: http://blog.sina.com.cn/s/blog_753fd0b00100t8js.html 

    在友善mini2440提供的linux2.6.32.2内核中,有如下定义:

    MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")
    .phys_io = S3C2410_PA_UART,
    .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params = S3C2410_SDRAM_PA + 0x100,
     
    .init_irq = s3c24xx_init_irq,
    .map_io = mini2440_map_io,
    .init_machine = mini2440_machine_init,
    .timer = &s3c24xx_timer,
    MACHINE_END
     
    下面分析一下:
    在include/asm-arm/mach/arch.h中,有定义
    #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 
    };
     
    列出machine_desc的定义:
    struct machine_desc {
    unsigned int nr;
    unsigned int phys_io;
    unsigned int io_pg_offst;
    const char *name;
    unsigned long boot_params;
     
    unsigned int video_start;
    unsigned int video_end;
     
    unsigned int reserve_lp0 :1;
    unsigned int reserve_lp1 :1;
    unsigned int reserve_lp2 :1;
    unsigned int soft_reboot :1;
    void (*fixup)(struct machine_desc *,
    struct tag *, char **,
    struct meminfo *);
    void (*map_io)(void);
    void (*init_irq)(void);
    struct sys_timer *timer;
    void (*init_machine)(void);
    };
     
     
    按定义展开后:
    static const struct machine_desc __mach_desc_MINI2440 
     __used 
     __attribute__((__section__(".arch.info.init"))) = {
    .nr = MACH_TYPE_MINI2440,
    .name = "FriendlyARM Mini2440 development board",
     
     .phys_io = S3C2410_PA_UART,
    .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params = S3C2410_SDRAM_PA + 0x100,
     
    .init_irq = s3c24xx_init_irq,
    .map_io = mini2440_map_io,
    .init_machine = mini2440_machine_init,
    .timer = &s3c24xx_timer,
    };
    MACH_TYPE_MINI2440 是mini2440开发板在linux中的机器号。
    "FriendlyARM Mini2440 development board"是开发板信息,在终端输入cat /proc/cpuinfo可以查看。
     
    MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。
    其余各个成员函数在setup_arch()中被赋值到内核结构体,在不同时期被调用:
    1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。
    static int __init customize_machine(void)
    {
     
     if (init_machine)
      init_machine();
     return 0;
    }
    arch_initcall(customize_machine);
    2. .init_irq在start_kernel()(文件init/main.c)--> init_IRQ() (在文件arch/arm/kernel/Irq.c)--> init_arch_irq()中被调用
    3. .map_io 在 setup_arch(&command_line) (在文件arch/arm/kernel/setup.c)--> paging_init()(在文件arch/arm/kernel/mm/Mmu.c) --> devicemaps_init()(在文件arch/arm/kernel/mm/Mmu.c)中被调用
    4. .timer是定义系统时钟,定义TIMER4为系统时钟,在arch/arm/plat-s3c/time.c中体现。在start_kernel() --> time_init()(在文件arch/arm/kernel/Time.c)中被调用。
    5. .boot_params是bootloader向内核传递的参数的位置,这要和bootloader中参数的定义要一致。
     
    其他主要都在 setup_arch() 中用到。
  • 相关阅读:
    JS代码判断IE不同版本
    极简技术类录--正则表达式
    Java读取系统Properties
    极简技术类录--maven
    极简技术类录--git
    JVM字节码增强
    如何避免死锁?
    有三个线程T1,T2,T3,怎么确保它们按顺序执行?
    编写两个线程,顺序输出自然顺序:1,2,3,4,...,99,100
    对文本单词进行技数,并倒序列出计数统计
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/5796081.html
Copyright © 2020-2023  润新知