当前位置:Gxlcms > 数据库问题 > [Zedboard Linux系统移植]-从MACHINE_START开始

[Zedboard Linux系统移植]-从MACHINE_START开始

时间:2021-07-01 10:21:17 帮助过:18人阅读

) /* 64KB way size, 8-way associativity, parity disabled */ .l2c_aux_val = 0x00000000, .l2c_aux_mask = 0xffffffff, .smp = smp_ops(zynq_smp_ops), .map_io = zynq_map_io, .init_irq = zynq_irq_init, .init_machine = zynq_init_machine, .init_late = zynq_init_late, .init_time = zynq_timer_init, .dt_compat = zynq_dt_match, .reserve = zynq_memory_init, .restart = zynq_system_reset, MACHINE_END
    zynq_init_machine--->  当前的zybo的机器初始化主函数。如需上点后初始化该板子的其他外设,可以在本函数内添加相应的初始化功能。

玩过或者移植过arm-linux的都应该知道在/arch/arm目录下有许多与具体处理器相关的目录,当然对于zynq的话所对应的目录就是mach-zynq,在里面找到与具体板子相关的文件\Linux-Digilent-Dev-master\arch\arm\mach-zynq\armcommon.c,没错,就是它。无论是出于想移植到新的内核还是出于想深入学习某一款arm等,对这个文件的学习是必不可少的。这个文件大部分内容是对平台设备的结构体初始化,在这个文件的最后有一个非常重要的宏:

DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
    /* 64KB way size, 8-way associativity, parity disabled */
    .l2c_aux_val    = 0x00000000,
    .l2c_aux_mask   = 0xffffffff,
    .smp        = smp_ops(zynq_smp_ops),
    .map_io     = zynq_map_io,
    .init_irq   = zynq_irq_init,
    .init_machine   = zynq_init_machine,
    .init_late  = zynq_init_late,
    .init_time  = zynq_timer_init,
    .dt_compat  = zynq_dt_match,
    .reserve    = zynq_memory_init,
    .restart    = zynq_system_reset,
MACHINE_END

DT_:qMACHINE_START的定义在arch/arm/include/asm/mach/arch.h,如下:

#define DT_MACHINE_START(_name, _namestr)               \
static const struct machine_desc __mach_desc_##_name    \
 __used                                                  __attribute__((__section__(".arch.info.init"))) = {            .nr             = ~0,                                   .name           = _namestr,

#endif

噢,其实就是定义了一个struct machine_desc类型结构体变量,这个结构体还定义了其他一些成员,接下来着重关注.init_machine这个成员,它是一个函数指针,值为zynq_init_machine,这个函数也在common.c中定义。内容是什么呢?呵呵,因为在这里只给出大体流程,具体内容先不分析。现在最关心的是这个结构体变量在哪里被调用,从而调用它里面的成员和成员函数呢?先来看/arch/arm/kernel/setup.c里面的setup_arch()函数:

void __init setup_arch(char **cmdline_p)
{
    const struct machine_desc *mdesc;

    setup_processor();
    mdesc = setup_machine_fdt(__atags_pointer);
    if (!mdesc)
        mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);
    machine_desc = mdesc;
    machine_name = mdesc->name;

    if (mdesc->reboot_mode != REBOOT_HARD)
        reboot_mode = mdesc->reboot_mode;

    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;

    /* 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();

    early_paging_init(mdesc, lookup_processor_type(read_cpuid_id()));
    setup_dma_zone(mdesc);
    sanity_check_meminfo();
    arm_memblock_init(mdesc);

    paging_init(mdesc);
    request_standard_resources(mdesc);

    if (mdesc->restart)
        arm_pm_restart = mdesc->restart;

    unflatten_device_tree();

    arm_dt_init_cpu_maps();
    psci_init();
    ......................

这个函数在/init/main.c的start_kernel()函数里被调用。看到第10行,这里的setup_machine()函数的作用就是找到我们想要的struct machine_desc类型的变量,也就是在common.c里定义那个变量。函数的参数machine_arch_type的值是什么呢?继续看:

版权声明:本文为博主原创文章,未经博主允许不得转载。

[Zedboard Linux系统移植]-从MACHINE_START开始

标签:移植   内核   

人气教程排行