微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式 arm平台kernel启动第二阶段分析

嵌入式 arm平台kernel启动第二阶段分析

时间:11-09 来源:互联网 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top