ARM平台device tree是如何工作的?(一)

bootloader传递给内核的参数


在bootloader启动kernel之前会设置ARM CPU的r0,r1,r2,r9寄存器:
未使用device tree的2.6版本中,只需要将:
r0=0;
r1=machine_id;
r2=atags_address;

使用device tree之后,就稍微复杂一些,设置如下:
r0=cp#15 control register;
r1=machine ID;
r2=atags/dtb pointer;
r9=processor ID;

在arm/arm/kernel/head-common.S中,汇编代码会将这几个寄存器的值保存到几个变量中。

/*
 * The following fragment of code is executed with the MMU on in MMU mode,
 * and uses absolute addresses; this is not position independent.
 *
 *  r0  = cp#15 control register                                                                                                                                                                             
 *  r1  = machine ID
 *  r2  = atags/dtb pointer
 *  r9  = processor ID
 */
        __INIT
__mmap_switched:
        adr     r3, __mmap_switched_data

        ldmia   r3!, {r4, r5, r6, r7}
        cmp     r4, r5                          @ Copy data segment if needed
1:      cmpne   r5, r6
        ldrne   fp, [r4], #4
        strne   fp, [r5], #4
        bne     1b

        mov     fp, #0                          @ Clear BSS (and zero fp)
1:      cmp     r6, r7
        strcc   fp, [r6],#4
        bcc     1b

 ARM(   ldmia   r3, {r4, r5, r6, r7, sp})
 THUMB( ldmia   r3, {r4, r5, r6, r7}    )
 THUMB( ldr     sp, [r3, #16]           )
        str     r9, [r4]                        @ Save processor ID
        str     r1, [r5]                        @ Save machine type
        str     r2, [r6]                        @ Save atags pointer
        cmp     r7, #0
        strne   r0, [r7]                        @ Save control register values
        b       start_kernel
ENDPROC(__mmap_switched)

        .align  2
        .type   __mmap_switched_data, %object
__mmap_switched_data:
        .long   __data_loc                      @ r4
        .long   _sdata                          @ r5
        .long   __bss_start                     @ r6
        .long   _end                            @ r7
        .long   processor_id                    @ r4
        .long   __machine_arch_type             @ r5
        .long   __atags_pointer                 @ r6
#ifdef CONFIG_CPU_CP15
        .long   cr_alignment                    @ r7
#else
        .long   0                               @ r7
#endif
        .long   init_thread_union + THREAD_START_SP @ sp
        .size   __mmap_switched_data, . - __mmap_switched_da

上述代码做了三件事:
1、如果需要,保存数据段信息到__data_loc,_sdata,__bss_start_end变量中;
2、保存r9寄存器的值,即processor ID到processor_id变量中,保存r1寄存器的值,即machine ID到__machine_arch_type中,保存r2寄存器的值,即atags或dtb的地址到__atags_pointer变量中;
3、跳转到start_kernel()这个函数中去执行;

start_kernel()这个函数是C代码实现的。

阅读更多
文章标签: arm kernel devicetree
想对作者说点什么? 我来说一句

Power_ePAPR_APPROVED_v1.12

2018年02月09日 1.6MB 下载

Using the device tree to describe embedded

2014年12月23日 202KB 下载

没有更多推荐了,返回首页

不良信息举报

ARM平台device tree是如何工作的?(一)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭