注:
原文出自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)
/* 程序状态,禁止FIQ、IRQ,设定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 阅读(991)
评论(0) 编辑 收藏 引用