随笔-118  评论-133  文章-4  trackbacks-0

注:
    原文出自taoyuetao大侠的博客上:
http://www.eetop.cn/blog/html/45/11145_itemid_1367.html
    小弟参考之研究s3c2410相关代码,然后做了稍微的修改,作为一个学习笔记,方便以后的学习,也希望对后人有所帮助^_^


在网上参考很多高手的文章,又加入了自己的一点儿内容,整理了一下,里面还有很多不明白的地方,而且也会有理解错误的地方,望高手指点,自己也会不断进行修改


当进入linux内核后,arch/arm/kernel/head.S是内核最先执行的一个文件,包括从内核入口ENTRY(stext)start_kernel之间的初始化代码,下面以我所使用的平台s3c2410为例,说明一下他的汇编代码:

1:      __INIT

2:      .type   stext, %function

3:  ENTRY(stext)

/* 程序状态,禁止FIQIRQ,设定SVC模式 */

4:      msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode

                                                  @ and irqs disabled

    /* 判断CPU类型,查找运行的CPU ID值与Linux编译支持的ID值是否支持 */

5:      bl  __lookup_processor_type     @ r5=procinfo r9=cpuid

6:      movs    r10, r5             @ invalid processor (r5=0)?

    /* 判断如果r10的值为0,则表示函数执行错误,跳转到出错处理,*/

7:      beq __error_p               @ yes, error 'p'

    /* 判断体系类型,查看R1寄存器的Architecture Type值是否支持 */

8:      bl  __lookup_machine_type       @ r5=machinfo

9:      movs    r8, r5              @ invalid machine (r5=0)?

    /* 判断如果r8的值为0,则表示函数执行错误,跳转到出错处理,*/

10:     beq __error_a           @ yes, error 'a'

    /* 创建核心页表 */

11:     bl  __create_page_tables

 

12:     ldr r13, __switch_data      @ address to jump to after

                                @ mmu has been enabled

13:     adr lr, __enable_mmu        @ return (PIC) address

14:     add pc, r10, #PROCINFO_INITFUNC
                             
4行,准备进入SVC工作模式,同时关闭中断(I_BIT)和快速中断(F_BIT)
5行,查看处理器类型,主要是为了得到处理器的ID以及页表的flags
8行,查看一些体系结构的信息。
11行,建立页表。
14行,跳转到处理器的初始化函数,其函数地址是从__lookup_processor_type中得到的,需要注意的是第13行,当处理器初始化完成后,会直接跳转到__enable_mmu去执行,
这是由于初始化函数最后的语句是mov pc, lr

posted on 2007-08-04 09:23 lfc 阅读(992) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。