Linux内核tag分析

const struct machine_desc * __init
setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
{
    struct tag *tags = (struct tag *)&default_tags;
    const struct machine_desc *mdesc = NULL, *p;
    char *from = default_command_line;

    default_tags.mem.start = PHYS_OFFSET;

    /*
     * locate machine in the list of supported machines.
     */
    for_each_machine_desc(p)
        if (machine_nr == p->nr) {
            pr_info("Machine: %s\n", p->name);
            mdesc = p;
            break;
        }

    if (!mdesc) {
        early_print("\nError: unrecognized/unsupported machine ID"
                " (r1 = 0x%08x).\n\n", machine_nr);
        dump_machine_table(); /* does not return */
    }

    if (__atags_pointer)
        tags = phys_to_virt(__atags_pointer);
    else if (mdesc->atag_offset)
        tags = (void *)(PAGE_OFFSET + mdesc->atag_offset);

#if defined(CONFIG_DEPRECATED_PARAM_STRUCT)
    /*
     * If we have the old style parameters, convert them to
     * a tag list.
     */
    if (tags->hdr.tag != ATAG_CORE)
        convert_to_tag_list(tags);
#endif
    if (tags->hdr.tag != ATAG_CORE) {
        early_print("Warning: Neither atags nor dtb found\n");
        tags = (struct tag *)&default_tags;
    }

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

    if (tags->hdr.tag == ATAG_CORE) {
        if (memblock_phys_mem_size())
            squash_mem_tags(tags);
        save_atags(tags);
        parse_tags(tags);
    }

    /* parse_early_param needs a boot_command_line */
    strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);

    return mdesc;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值