29、(8)Linux内核启动第二阶段之 setup_arch函数分析

来源:互联网 发布:网络语999999什么意思 编辑:程序博客网 时间:2024/04/26 03:42
 

此函数在arch/arm/kernel/setup.c中定义

 

void __init setup_arch(char **cmdline_p)

{

    struct tag *tags = (struct tag *)&init_tags;

    struct machine_desc *mdesc;

    char *from = default_command_line;

 

    unwind_init();

 

    setup_processor();     //进行处理器相关的一些设置

    mdesc = setup_machine(machine_arch_type); //获得开发板的

machine_desc结构

    machine_name = mdesc->name;

 

    if (mdesc->soft_reboot)

       reboot_setup("s");

 

    if (__atags_pointer)

       tags = phys_to_virt(__atags_pointer);

    else if (mdesc->boot_params)   //定义了Bootloader传入参数的地址

       tags = phys_to_virt(mdesc->boot_params);

 

    /*

     * If we have the old style parameters, convert them to

     * a tag list.

     */

    if (tags->hdr.tag != ATAG_CORE)

       convert_to_tag_list(tags);

    if (tags->hdr.tag != ATAG_CORE)

       tags = (struct tag *)&init_tags;

 

    if (mdesc->fixup)

       mdesc->fixup(mdesc, tags, &from, &meminfo);

 

    if (tags->hdr.tag == ATAG_CORE) {

       if (meminfo.nr_banks != 0) //如果已经在内核中定义了meminfo结构

           squash_mem_tags(tags);   则忽略内存tag

       save_atags(tags);    

       parse_tags(tags);    //解释每个tag

    }

 

    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;

 

    memcpy(boot_command_line, from, COMMAND_LINE_SIZE);

    boot_command_line[COMMAND_LINE_SIZE-1] = '\0';

    parse_cmdline(cmdline_p, from); //对命令行进行一些先期的处理

    paging_init(mdesc);    //重新初始化页表

原创粉丝点击