微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux 的启动过程

ARM Linux 的启动过程

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

  1. telychangesthestructureofthevisible
  2. *memoryspace.Youwillnotbeabletotraceexecutionthroughthis.
  3. *Ifyouhaveanenquiryaboutthis,*please*checkthelinux-arm-kernel
  4. *mailinglistarchivesBEFOREsendinganotherposttothelist.
  5. *
  6. *r0=cp#15controlregister
  7. *r13=*virtual*addresstojumptouponcompletion
  8. *
  9. *otherregistersdependonthefunctioncalleduponcompletion
  10. */
  11. .align5
  12. __turn_mmu_on:
  13. movr0,r0
  14. /*将r0的值写到控制寄存器中。这里,终于开启MMU功能了。
  15. *查阅手册说控制寄存器的0位置1表示开启MMU,但这里r0的第0是多少呢(还请大家指正)
  16. */
  17. mcrp15,0,r0,c1,c0,0@writecontrolreg
  18. mrcp15,0,r3,c0,c0,0@readidreg
  19. /*这里的两个mov似乎是否流水线有关的,开启MMU语句后面几条是不能进行内存寻址的。但仍未搞明白具体东西的。*/
  20. movr3,r3
  21. movr3,r3
  22. /*转跳到r13的函数中去,r13为__mmap_switched函数的虚拟地址,
  23. *从stext函数的未尾可以找到它的赋值。故从此开始pc的值就真正在内存的虚拟地址空间了。
  24. */
  25. movpc,r13
  26. ENDPROC(__turn_mmu_on)

[cpp]view plaincopy

  1. /*
  2. *SetupcommonbitsbeforefinallyenablingtheMMU.Essentially
  3. *thisisjustloadingthepagetablepointeranddomainaccess
  4. *registers.
  5. */
  6. __enable_mmu:
  7. /*这里设置是否为非对齐内存访问产生异常*/
  8. #ifdefCONFIG_ALIGNMENT_TRAP
  9. orrr0,r0,#CR_A
  10. #else
  11. bicr0,r0,#CR_A
  12. #endif
  13. /*是否禁用数据缓存功能*/
  14. #ifdefCONFIG_CPU_DCACHE_DISABLE
  15. bicr0,r0,#CR_C
  16. #endif
  17. /*是否禁用CPU_BPREDICT?,不是很清楚此选项*/
  18. #ifdefCONFIG_CPU_BPREDICT_DISABLE
  19. bicr0,r0,#CR_Z
  20. #endif
  21. /*是否禁用指令缓存功能*/
  22. #ifdefCONFIG_CPU_ICACHE_DISABLE
  23. bicr0,r0,#CR_I
  24. #endif
  25. /*设置域访问寄存器的值。这里设置每个domain的属性是否上面建立的页表中,
  26. *每个目录项的damon值一起进行访问控制检查。具体情况请参考ARM处理器手册。
  27. */
  28. movr5,#(domain_val(DOMAIN_USER,DOMAIN_MANAGER)|\
  29. domain_val(DOMAIN_KERNEL,DOMAIN_MANAGER)|\
  30. domain_val(DOMAIN_TABLE,DOMAIN_MANAGER)|\
  31. domain_val(DOMAIN_IO,DOMAIN_CLIENT))
  32. mcrp15,0,r5,c3,c0,0@loaddomainaccessregister
  33. mcrp15,0,r4,c2,c0,0@loadpagetablepointer
  34. b__turn_mmu_on
  35. ENDPROC(__enable_mmu)
  36. /*
  37. *EnabletheMMU.Thiscompletelychangesthestructureofthevisible
  38. *memoryspace.Youwillnotbeabletotraceexecutionthroughthis.
  39. *Ifyouhaveanenquiryaboutthis,*please*checkthelinux-arm-kernel
  40. *mailinglistarchivesBEFOREsendinganotherposttothelist.
  41. *
  42. *r0=cp#15controlregister
  43. *r13=*virtual*addresstojumptouponcompletion
  44. *
  45. *otherregistersdependonthefunctioncalleduponcompletion
  46. */
  47. .align5
  48. __turn_mmu_on:
  49. movr0,r0
  50. /*将r0的值写到控制寄存器中。这里,终于开启MMU功能了。
  51. *查阅手册说控制寄存器的0位置1表示开启MMU,但这里r0的第0是多少呢(还请大家指正)
  52. */
  53. mcrp15,0,r0,c1,c0,0@writecontrolreg
  54. mrcp15,0,r3,c0,c0,0@readidreg
  55. /*这里的两个mov似乎是否流水线有关的,开启MMU语句后面几条是不能进行内存寻址的。但仍未搞明白具体东西的。*/
  56. movr3,r3
  57. movr3,r3
  58. /*转跳到r13的函数中去,r13为__mmap_switched函数的虚拟地址,
  59. *从stext函数的未尾可以找到它的赋值。故从此开始pc的值就真正在内存的虚拟地址空间了。
  60. */
  61. movpc,r13
  62. ENDPROC(__turn_mmu_on)

7.__mmap_switched函数

__mmap_switched函数专用来设置C语言的执行环境,比如重定位工作,堆栈,以及BSS段的清零。

__switch_data变量先定义了一系里面处量的数据,如重定位和数据段的地址,BSS段的地址,pocessor_id和__mach_arch_type变量的地址等。

[cpp]view plaincopy

  1. .type__switch_data,%object
  2. __switch_data:
  3. .long__mmap_switched
  4. .long__data_loc@r4
  5. .long_data@r5
  6. .long__bss_start@r6
  7. .long_end@r7
  8. .longprocessor_id@r4
  9. .long__machine_arch_type@r5
  10. .long__atags_pointer@r6
  11. .longcr_alignment@r7
  12. .longinit_thread_union+THREAD_START_SP@sp
  13. /*
  14. *ThefollowingfragmentofcodeisexecutedwiththeMMUoninMMUmode,
  15. *andusesabsoluteaddresses;thisisnotpositionindependent.
  16. *
  17. *r0=cp#15controlregister
  18. *r1=machineID
  19. *r2=atagspointer
  20. *r9=processorID
  21. */
  22. __mmap_switched:
  23. adrr3,__switch_data+4
  24. /*r4=__data_loc,r5=_data,r6=_bss_start,r7=_end*/
  25. ldmiar3!,{r4,r5,r6,r7}
  26. /*下面这段代码类似于这段C代码,即将整个数据段从__data_loc拷贝到_data段。
  27. *if(__data_loc==_data||_data!=_bass_start)
  28. *memcpy(_data,__data_

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

网站地图

Top