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

 

此函数在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);    //重新初始化页表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值