ARM Linux 的启动过程
时间:11-09
来源:互联网
点击:
- telychangesthestructureofthevisible
- *memoryspace.Youwillnotbeabletotraceexecutionthroughthis.
- *Ifyouhaveanenquiryaboutthis,*please*checkthelinux-arm-kernel
- *mailinglistarchivesBEFOREsendinganotherposttothelist.
- *
- *r0=cp#15controlregister
- *r13=*virtual*addresstojumptouponcompletion
- *
- *otherregistersdependonthefunctioncalleduponcompletion
- */
- .align5
- __turn_mmu_on:
- movr0,r0
- /*将r0的值写到控制寄存器中。这里,终于开启MMU功能了。
- *查阅手册说控制寄存器的0位置1表示开启MMU,但这里r0的第0是多少呢(还请大家指正)
- */
- mcrp15,0,r0,c1,c0,0@writecontrolreg
- mrcp15,0,r3,c0,c0,0@readidreg
- /*这里的两个mov似乎是否流水线有关的,开启MMU语句后面几条是不能进行内存寻址的。但仍未搞明白具体东西的。*/
- movr3,r3
- movr3,r3
- /*转跳到r13的函数中去,r13为__mmap_switched函数的虚拟地址,
- *从stext函数的未尾可以找到它的赋值。故从此开始pc的值就真正在内存的虚拟地址空间了。
- */
- movpc,r13
- ENDPROC(__turn_mmu_on)
[cpp]view plaincopy
- /*
- *SetupcommonbitsbeforefinallyenablingtheMMU.Essentially
- *thisisjustloadingthepagetablepointeranddomainaccess
- *registers.
- */
- __enable_mmu:
- /*这里设置是否为非对齐内存访问产生异常*/
- #ifdefCONFIG_ALIGNMENT_TRAP
- orrr0,r0,#CR_A
- #else
- bicr0,r0,#CR_A
- #endif
- /*是否禁用数据缓存功能*/
- #ifdefCONFIG_CPU_DCACHE_DISABLE
- bicr0,r0,#CR_C
- #endif
- /*是否禁用CPU_BPREDICT?,不是很清楚此选项*/
- #ifdefCONFIG_CPU_BPREDICT_DISABLE
- bicr0,r0,#CR_Z
- #endif
- /*是否禁用指令缓存功能*/
- #ifdefCONFIG_CPU_ICACHE_DISABLE
- bicr0,r0,#CR_I
- #endif
- /*设置域访问寄存器的值。这里设置每个domain的属性是否上面建立的页表中,
- *每个目录项的damon值一起进行访问控制检查。具体情况请参考ARM处理器手册。
- */
- 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@loaddomainaccessregister
- mcrp15,0,r4,c2,c0,0@loadpagetablepointer
- b__turn_mmu_on
- ENDPROC(__enable_mmu)
- /*
- *EnabletheMMU.Thiscompletelychangesthestructureofthevisible
- *memoryspace.Youwillnotbeabletotraceexecutionthroughthis.
- *Ifyouhaveanenquiryaboutthis,*please*checkthelinux-arm-kernel
- *mailinglistarchivesBEFOREsendinganotherposttothelist.
- *
- *r0=cp#15controlregister
- *r13=*virtual*addresstojumptouponcompletion
- *
- *otherregistersdependonthefunctioncalleduponcompletion
- */
- .align5
- __turn_mmu_on:
- movr0,r0
- /*将r0的值写到控制寄存器中。这里,终于开启MMU功能了。
- *查阅手册说控制寄存器的0位置1表示开启MMU,但这里r0的第0是多少呢(还请大家指正)
- */
- mcrp15,0,r0,c1,c0,0@writecontrolreg
- mrcp15,0,r3,c0,c0,0@readidreg
- /*这里的两个mov似乎是否流水线有关的,开启MMU语句后面几条是不能进行内存寻址的。但仍未搞明白具体东西的。*/
- movr3,r3
- movr3,r3
- /*转跳到r13的函数中去,r13为__mmap_switched函数的虚拟地址,
- *从stext函数的未尾可以找到它的赋值。故从此开始pc的值就真正在内存的虚拟地址空间了。
- */
- movpc,r13
- ENDPROC(__turn_mmu_on)
7.__mmap_switched函数
__mmap_switched函数专用来设置C语言的执行环境,比如重定位工作,堆栈,以及BSS段的清零。
__switch_data变量先定义了一系里面处量的数据,如重定位和数据段的地址,BSS段的地址,pocessor_id和__mach_arch_type变量的地址等。
[cpp]view plaincopy
- .type__switch_data,%object
- __switch_data:
- .long__mmap_switched
- .long__data_loc@r4
- .long_data@r5
- .long__bss_start@r6
- .long_end@r7
- .longprocessor_id@r4
- .long__machine_arch_type@r5
- .long__atags_pointer@r6
- .longcr_alignment@r7
- .longinit_thread_union+THREAD_START_SP@sp
- /*
- *ThefollowingfragmentofcodeisexecutedwiththeMMUoninMMUmode,
- *andusesabsoluteaddresses;thisisnotpositionindependent.
- *
- *r0=cp#15controlregister
- *r1=machineID
- *r2=atagspointer
- *r9=processorID
- */
- __mmap_switched:
- adrr3,__switch_data+4
- /*r4=__data_loc,r5=_data,r6=_bss_start,r7=_end*/
- ldmiar3!,{r4,r5,r6,r7}
- /*下面这段代码类似于这段C代码,即将整个数据段从__data_loc拷贝到_data段。
- *if(__data_loc==_data||_data!=_bass_start)
- *memcpy(_data,__data_
ARMLinux启动过 相关文章:
- arm linux 启动过程(11-09)
- ARM Linux启动过程学习(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)