嵌入式 arm平台kernel启动第二阶段分析
0007004处,以后依次递增
addr6,r4,r6,lsr#18@计算最后一个地址条目存放的位置
1:cmpr0,r6@填充这之间的地址条目
/*每一个地址条目代表了1MB空间的地址映射。物理地址将从0x30100000开始映射。0X30000000开始的1MB空间将在下面映射*/
addr3,r3,#1<20
strlsr3,[r0],#4
bls1b
…………………………………
…………………………………………
/*为了使用启动参数,将物理内存的第一MB映射到内核虚拟地址空间的第一个MB,r4存放的是页表的地址。映射0X30000000开始的1MB空间PAGE_OFFSET=0XC0000000,PHYS_OFFSET=0X30000000,r0=0x30007000,上面是从0x30007004开始存放地址条目的*/
addr0,r4,#PAGE_OFFSET>>18
orrr6,r7,#(PHYS_OFFSET&0xff000000)@r6=0x30000c1e
.if(PHYS_OFFSET&0x00f00000)
orrr6,r6,#(PHYS_OFFSET&0x00f00000)
.endif
strr6,[r0]@将0x30000c1e存于0x30007000处。
………………………
………………………………
movpc,lr@子程序返回
ENDPROC(__create_page_tables)
//
__create_page_tables函数的具体解析结束(\arch\arm\kernel\head.S)
//
/*把__switch_data标号处的地址放入r13寄存器,当执行完__enable_mmu函数时会把r13寄存器的值赋值给pc,跳转到__switch_data处执行*/
ldrr13,__switch_data@addresstojumptoaftermmuhasbeenenabled
/*把__enable_mmu函数的地址值,赋值给lr寄存器,当执行完__arm920_setup时,返回后执行__enable_mmu*/
adrlr,BSYM(__enable_mmu)@return(PIC)address
//
__enable_mmu函数的具体解析开始(\arch\arm\kernel\head.S)
//
__enable_mmu:
#ifdefCONFIG_ALIGNMENT_TRAP
orrr0,r0,#CR_A//使能地址对齐错误检测
#else
bicr0,r0,#CR_A
#endif
#ifdefCONFIG_CPU_DCACHE_DISABLE
bicr0,r0,#CR_C//禁止数据cache
#endif
#ifdefCONFIG_CPU_BPREDICT_DISABLE
bicr0,r0,#CR_Z
#endif
#ifdefCONFIG_CPU_ICACHE_DISABLE
bicr0,r0,#CR_I//禁止指令cache
#endif//配置相应的访问权限并存入r5中
movr5,#(domain_val(DOMAIN_USER,DOMAIN_MANAGER)|/
domain_val(DOMAIN_KERNEL,DOMAIN_MANAGER)|/
domain_val(DOMAIN_TABLE,DOMAIN_MANAGER)|/
domain_val(DOMAIN_IO,DOMAIN_CLIENT))
mcrp15,0,r5,c3,c0,0//将访问权限写入协处理器
mcrp15,0,r4,c2,c0,0//将页表基地址写入基址寄存器C2,0X30004000
b__turn_mmu_on//跳转到程序段去打开MMU
ENDPROC(__enable_mmu)
文件linux/arch/arm/kernel/head.S中
__turn_mmu_on:
movr0,r0
mcrp15,0,r0,c1,c0,0//打开MMU同时打开cache等。
mrcp15,0,r3,c0,c0,0@readidreg读取id寄存器
movr3,r3
movr3,r3//两个空操作,等待前面所取的指令得以执行。
movpc,r13//程序跳转
ENDPROC(__turn_mmu_on)
//
__enable_mmu函数的具体解析结束(\arch\arm\kernel\head.S)
//
/*执行__arm920_setup函数(\arch\arm\mm\proc-arm920.S),该函数完成对数据cache,指令cache,writebuffer等初始化操作*/
ARM(addpc,r10,#PROCINFO_INITFUNC)
//
__arm920_setup函数的具体解析开始(\arch\arm\mm\proc-arm920.S)
//
在上面程序段.section".text.head","ax"的最后有这样几行:
addpc,r10,#PROCINFO_INITFUNC
R10中存放的是在函数__lookup_processor_type中成功匹配的结构体proc_info_list。对于arm920来说在文件linux/arch/arm/mm/proc-arm920.S中有:
.section".proc.info.init",#alloc,#execinstr
.type__arm920_proc_info,#object
__arm920_proc_info:
.long0x41009200
.long0xff00fff0
.longPMD_TYPE_SECT|/
PMD_SECT_BUFFERABLE|/
PMD_SECT_CACHEABLE|/
PMD_BIT4|/
PMD_SECT_AP_WRITE|/
PMD_SECT_AP_READ
.longPMD_TYPE_SECT|/
PMD_BIT4|/
PMD_SECT_AP_WRITE|/
PMD_SECT_AP_READ
b__arm920_setup
………………………………
addpc,r10,#PROCINFO_INITFUNC的意思跳到函数__arm920_setup去执行。
.type__arm920_setup,#function//表明这是一个函数
__arm920_setup:
movr0,#0//设置r0为0。
mcrp15,0,r0,c7,c7//使数据cahche,指令cache无效。
mcrp15,0,r0,c7,c10,4//使writebuffer无效。
#ifdefCONFIG_MMU
mcrp15,0,r0,c8,c7//使数据T
嵌入式arm平台kernel启 相关文章:
- 嵌入式 arm平台kernel启动第一阶段汇编head.s分析(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)