Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76064
  • 博文数量: 38
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-28 14:15
文章分类

全部博文(38)

文章存档

2013年(1)

2012年(37)

我的朋友

分类:

2012-04-17 11:07:34

浅析开发板相关函数bootloader传入的寄存器r1对应开发板nr值内部流程

r2数值最后会存到__atags_pointer指针变量中.


void __init setup_arch(char **cmdline_p)
{
    struct tag *tags = (struct tag *)&init_tags;
    struct machine_desc *mdesc;
    char *from = default_command_line;

    ......
    if (__atags_pointer)
        tags = phys_to_virt(__atags_pointer);   // bootloader传入了非0的tags的物理地址,优先使用bootloader指定地址[luther.gliethttp]
    else if (mdesc->boot_params)                // 使用arch/arm/mach-ep93xx/edb9312.c中默认参数地址[luther.gliethttp]
        tags = phys_to_virt(mdesc->boot_params);
    ......
}

文件:arch/arm/kernel/head.S
    .section ".text.head", "ax"
ENTRY(stext)
    ......
    ldr    r13, __switch_data        @ address to jump to after
                                @ mmu has been enabled
    adr    lr, __enable_mmu        @ return (PIC) address
    add    pc, r10, #PROCINFO_INITFUNC // pc跳转到b __arm920_setup语句所在地址,然后执行__arm920_setup处理函数,
                                    // 返回执行__enable_mmu[luther.gliethttp]

文件:arch/arm/kernel/head.S中
__enable_mmu:
#ifdef CONFIG_ALIGNMENT_TRAP
    orr    r0, r0, #CR_A
#else
    bic    r0, r0, #CR_A
#endif
#ifdef CONFIG_CPU_DCACHE_DISABLE
    bic    r0, r0, #CR_C
#endif
#ifdef CONFIG_CPU_BPREDICT_DISABLE
    bic    r0, r0, #CR_Z
#endif
#ifdef CONFIG_CPU_ICACHE_DISABLE
    bic    r0, r0, #CR_I
#endif
    mov    r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
              domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
              domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \
              domain_val(DOMAIN_IO, DOMAIN_CLIENT))
    mcr    p15, 0, r5, c3, c0, 0        @ load domain access register
    mcr    p15, 0, r4, c2, c0, 0        @ load page table pointer
    b    __turn_mmu_on               // 跳转到__turn_mmu_on函数继续执行

    .align    5
__turn_mmu_on:
    mov    r0, r0
    mcr    p15, 0, r0, c1, c0, 0        @ write control reg
    mrc    p15, 0, r3, c0, c0, 0        @ read id reg
    mov    r3, r3
    mov    r3, r3
    mov    pc, r13                     // 取出r13内容作为目的地址跳转过去,其值就是上面的__switch_data所在虚拟地址,就是下面的__mmap_switched函数.

    在中2.6.30.4内核arm920移植__lookup_processor_type
    我们介绍了__proc_info_begin为
文件:arch/arm/mm/proc-arm920.S对应的如下内容的地址指针
struct proc_info_list {
    unsigned int        cpu_val;
    unsigned int        cpu_mask;
    unsigned long        __cpu_mm_mmu_flags;    /* used by head.S */
    unsigned long        __cpu_io_mmu_flags;    /* used by head.S */
    unsigned long        __cpu_flush;        /* used by head.S */
    const char        *arch_name;
    const char        *elf_name;
    unsigned int        elf_hwcap;
    const char        *cpu_name;
    struct processor    *proc;
    struct cpu_tlb_fns    *tlb;
    struct cpu_user_fns    *user;
    struct cpu_cache_fns    *cache;
};
    .align
    .section ".proc.info.init", #alloc, #execinstr
    .type    __arm920_proc_info,#object
__arm920_proc_info:
    .long    0x41009200
    .long    0xff00fff0
    .long   PMD_TYPE_SECT | \
        PMD_SECT_BUFFERABLE | \
        PMD_SECT_CACHEABLE | \
        PMD_BIT4 | \
        PMD_SECT_AP_WRITE | \
        PMD_SECT_AP_READ
    .long   PMD_TYPE_SECT | \
        PMD_BIT4 | \
        PMD_SECT_AP_WRITE | \
        PMD_SECT_AP_READ
    b    __arm920_setup
    .long    cpu_arch_name
    .long    cpu_elf_name
    .long    HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB
    .long    cpu_arm920_name
    .long    arm920_processor_functions
    .long    v4wbi_tlb_fns
    .long    v4wb_user_fns
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
    .long    arm920_cache_fns
#else
    .long    v4wt_cache_fns
#endif
    .size    __arm920_proc_info, . - __arm920_proc_info


文件:arch/arm/kernel/head-common.S
    .type    __switch_data, %object
__switch_data:
    .long    __mmap_switched
    .long    __data_loc            @ r4
    .long    __data_start            @ r5
    .long    __bss_start            @ r6
    .long    _end                @ r7
    .long    processor_id            @ r4
    .long    __machine_arch_type        @ r5
    .long    __atags_pointer            @ r6        // 定义__atags_pointer地址,存入r6寄存器中[luther.gliethttp]
    .long    cr_alignment            @ r7
    .long    init_thread_union + THREAD_START_SP @ sp

文件:arch/arm/mach-ep93xx/edb9312.c
MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")
    /* Maintainer: Toufeeq Hussain */
    .phys_io    = EP93XX_APB_PHYS_BASE,
    .io_pg_offst    = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
    .boot_params    = 0x00000100,               // 如果bootloader没有定义__atags_pointer,那么使用该地址作为参数地址[luther.gliethttp]
    .map_io        = ep93xx_map_io,
    .init_irq    = ep93xx_init_irq,
    .timer        = &ep93xx_timer,
    .init_machine    = edb9312_init_machine,
MACHINE_END


文件:arch/arm/kernel/head-common.S
__mmap_switched:
    adr    r3, __switch_data + 4

    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

    ldmia    r3, {r4, r5, r6, r7, sp}
    str    r9, [r4]            @ Save processor ID
    str    r1, [r5]            @ Save machine type
    str    r2, [r6]            @ Save atags pointer// r6寄存器中存放的就是__atags_pointer地址,所以将r2中开发板传入的tags参数
                                                // 物理地址值数值放入__atags_pointer中[luther.gliethttp]
    bic    r4, r0, #CR_A            @ Clear 'A' bit
    stmia    r7, {r0, r4}            @ Save control register values
    b    start_kernel          
阅读(589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~