Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531780
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: 嵌入式

2009-08-03 13:26:29

arch/arm/kernel/vmlinux.lds
arch/arm/kernel/head.S
为入口位置
    .section ".text.head", "ax"
ENTRY(stext)
    msr    cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
                        @ and irqs disabled
    mrc    p15, 0, r9, c0, c0        @ get processor id
    bl    __lookup_processor_type        @ r5=procinfo r9=cpuid
    movs    r10, r5                @ invalid processor (r5=0)?
    beq    __error_p            @ yes, error 'p'
    bl    __lookup_machine_type        @ r5=machinfo
    movs    r8, r5                @ invalid machine (r5=0)?
    beq    __error_a            @ yes, error 'a'
    bl    __vet_atags
    bl    __create_page_tables



arch/arm/kernel/head-common.S
__lookup_processor_type:
    adr    r3, 3f
    ldmda    r3, {r5 - r7}   // r5 = __proc_info_begin虚拟地址值, r6 = __proc_info_end虚拟地址值, r7 = 3f对应的虚拟地址值[luther.gliethttp]
    sub    r3, r3, r7            @ get offset between virt&phys
    add    r5, r5, r3            @ convert virt addresses to
    add    r6, r6, r3            @ physical address space
1:    ldmia    r5, {r3, r4}    @ value, mask // 将__arm920_proc_info的前8个字节数据取出来,r3 = 0x41009200,r4 = 0xff00fff0
    and    r4, r4, r9            @ mask wanted bits // r9在ENTRY(stext)刚刚进入时,使用mrc p15, 0, r9, c0, c0指令获得了processor id
    teq    r3, r4              // r9 = 0x41129200
    beq    2f                  // 如果r4 & r9的结果为0x41009200,那么说明处理器id正确,跳转到2返回,内核一般不会在这里出问题[luther.gliethttp]
    add    r5, r5, #PROC_INFO_SZ        @ sizeof(proc_info_list)
    cmp    r5, r6
    blo    1b
    mov    r5, #0                @ unknown processor
2:    mov    pc, lr
ENDPROC(__lookup_processor_type)
    .long    __proc_info_begin
    .long    __proc_info_end
3:    .long    .
    .long    __arch_info_begin
    .long    __arch_info_end


反汇编之后.

c00082f4 <__lookup_processor_type>:
c00082f4:    e28f304c     add    r3, pc, #76    ; 0x4c  // pc向前跳76数值存入r3[luther.gliethttp]
c00082f8:    e81300e0     ldmda    r3, {r5, r6, r7}     // r5 = c001b9e4
c00082fc:    e0433007     sub    r3, r3, r7             // r6 = c001ba18
c0008300:    e0855003     add    r5, r5, r3             // r7 = c0008348
c0008304:    e0866003     add    r6, r6, r3
c0008308:    e8950018     ldmia    r5, {r3, r4}
......
c0008340:    c001b9e4     andgt    fp, r1, r4, ror #19
c0008344:    c001ba18     andgt    fp, r1, r8, lsl sl
c0008348:    c0008348     andgt    r8, r0, r8, asr #6


c001b9e4 <__proc_info_begin>:
c001b9e4:    41009200     tstmi    r0, r0, lsl #4       // arm920对应的id值
c001b9e8:    ff00fff0     swinv    0x0000fff0           // mask掩码[luther.gliethttp]
c001b9ec:    00000c1e     andeq    r0, r0, lr, lsl ip
c001b9f0:    00000c12     andeq    r0, r0, r2, lsl ip


arch/arm/mm/proc-arm920.S

    .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

阅读(1089) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~