Linux 启动流程 粗解(三)

http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FKernelTech%2Fkernelsrc_reading_20040130%2FM.1038836997.A

1.改源代码编译的Makefile,将gcc 改成gcc -g
使成生的vmlinux中含有debug信息
2.所有生成.o的rule中再加一条gcc /*其他参数除了-c外抄生成.o文件用的参数*/-E
-dD -C $< > /preprocessing/$(shell pwd)/$<
生成预处理文件从这个文件里面能很容易找到c源文件的宏定义
3.objdump -S -l -z vmlinux > vmlinux.txt
反汇编vmlinux到vmlinux.txt,vmlinux.txt含有汇编和c源文件的混合代码,看起来很方
便。而且能一步步看linux怎么一步步运行的。
4.objdump -x vmlinux > x.txt
vmliux中所有段的头信息,其中包口vmlinux的入口地址等
5.objdump --debugging vmlinux > debugging.txt
很多有用的debug信息,如函数名,结构体定义等
我觉的用根据以上信息,ultraedit看很方便。尤其在vmlinux.txt中选中文件名,用ult
raedit右键的open能马上打开文件,很方便。
大家试试根据vmlinux.txt从头到尾看一遍linux的启动过程,肯定很有感受。


参照以上方法 对vmlinux进行分析


ENTRY(stext)
    setmode    PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ 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    __fixup_machine_type
    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

    /*
     * The following calls CPU specific code in a position independent
     * manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of
     * xxx_proc_info structure selected by __lookup_machine_type
     * above.  On return, the CPU will be ready for the MMU to be
     * turned on, and r0 will hold the CPU control register value.
     */
    ldr    r13, __switch_data        @ address to jump to after
                        @ mmu has been enabled
    adr    lr, BSYM(__enable_mmu)        @ return (PIC) address
 ARM(    add    pc, r10, #PROCINFO_INITFUNC    )
 THUMB(    add    r12, r10, #PROCINFO_INITFUNC    )
 THUMB(    mov    pc, r12                )
ENDPROC(stext)


__lookup_processor_type:

从__proc_info_begin到__proc_info_end的__proc_info

c002d114 T __proc_info_begin
c002d114 t __v6_proc_info
c002d114 T _einittext
c002d17c T __proc_info_end

从arch\arm\mm\proc-v6.S得到__v6_proc_info


__fixup_machine_type:

查询可以使用的machine_type


__lookup_machine_type:

从__arch_info_begin到__arch_info_end

c002d17c T __arch_info_begin
c002d17c t __mach_desc_MSM7X25_FFA
c002d1b0 t __mach_desc_MSM7X25_SURF
c002d1e4 t __mach_desc_MSM7X27_FFA
c002d218 t __mach_desc_MSM7X27_SURF
c002d24c T __arch_info_end

从board-xxx.c得到MSM7X27_SURF的machine_info

    .boot_params    = PHYS_OFFSET + 0x100,
    .map_io        = msm7x2x_map_io,
    .init_irq    = msm7x2x_init_irq,
    .init_machine    = msm7x2x_init,
    .timer        = &msm_timer,

这些参数在start_kernel()启动时候会用到


__vet_atags:
c002d24c T __tagtable_begin
c002d24c t __tagtable_parse_tag_cmdline
c002d254 t __tagtable_parse_tag_revision
c002d25c t __tagtable_parse_tag_serialnr
c002d264 t __tagtable_parse_tag_ramdisk
c002d26c t __tagtable_parse_tag_videotext
c002d274 t __tagtable_parse_tag_mem32
c002d27c t __tagtable_parse_tag_core
c002d284 t __tagtable_parse_tag_initrd2
c002d28c t __tagtable_parse_tag_initrd
c002d294 t __tagtable_parse_tag_msm_partition
c002d29c T __tagtable_end

#define __tagtable(tag, fn) \
static struct tagtable __tagtable_##fn __tag = { tag, fn }


__create_page_tables:

创建页表


    .align    2
    .type    __switch_data, %object
__switch_data:
    .long    __mmap_switched
    .long    __data_loc            @ r4
    .long    _data                @ r5
    .long    __bss_start            @ r6
    .long    _end                @ r7
    .long    processor_id            @ r4
    .long    __machine_arch_type        @ r5
    .long    __atags_pointer            @ r6
    .long    cr_alignment            @ r7
    .long    init_thread_union + THREAD_START_SP @ sp


__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

 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
    bic    r4, r0, #CR_A            @ Clear 'A' bit
    stmia    r7, {r0, r4}            @ Save control register values
    b    start_kernel---------------------------------------------------------------------->到此进入C语言代码
ENDPROC(__mmap_switched)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值