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;
}