atags--__vet_atags标签

atags–__vet_atags标签

常量值ATAG_CORE定义为0x54410001。表示atag list启动幻数(magic number)。

  • tagged list 由struct teg数组组成,包含内存、视屏、ramdisk、initrd等信息。tagged list从ATAG_CORE开始启动,用ATAG_NONE表示数组结束。
  • tagged list不得被内核解压器或bootp程序复写,主要位于RAM的第一个16KB。
  • 在u-boot下可查看\arch\arm\lib\bootm.c的setup_start_tag和setup_end_tag函数,分别设置ATAG_CORE和ATAG_NONE的代码。

在_vet_atags中,确认启动加载向第二个参数传递的标记列表的第一个item是否是ATAG_CORE。若不是的话将该参数值设置为0并返回。

arch/arm/kernel/head-commom.S

__vet_atags:
    tst r2, #0x3            @ aligned?
    bne 1f

    ldr r5, [r2, #0]
#ifdef CONFIG_OF_FLATTREE
    ldr r6, =OF_DT_MAGIC        @ is it a DTB?
    cmp r5, r6
    beq 2f
#endif
    cmp r5, #ATAG_CORE_SIZE     @ is first tag ATAG_CORE?
    cmpne   r5, #ATAG_CORE_SIZE_EMPTY
    bne 1f
    ldr r5, [r2, #4]
    ldr r6, =ATAG_CORE
    cmp r5, r6
    bne 1f

2:  ret lr              @ atag/dtb pointer is ok

1:  mov r2, #0
    ret lr
ENDPROC(__vet_atags)

转换成C语言如下:

void __vet_atags(struct tag* atag_list)
{
    if(atag_list & 0x3)
        goto err_clear;

    if(!(atag_list->hdr.size == ARAG_CORE_SIZE && agag_list->hdr.tag == ATAG_CORE)){
        goto err_clear;
    }

    return;

err_clear:
    atag_list = 0;
    return;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值