Linux双核SMP系统启动流程(Zynq-A…

来源:互联网 发布:防止网络诈骗 编辑:程序博客网 时间:2024/04/29 18:11

分类: LINUX

 

1:资料附录:
                              xilinx zynq7000技术参考手册
                            xilinx zynq 7000软件开发手册
                        xilinx zynq 7020板级开发手册
       ARM v7 cortex A系列和R系列参考手册
               ARM v7 cortex A9 MCORE技术参考手册
                      ARM v7 cortex A9 技术参考手册
              ARM 通用中断控制器V1手册
                                   ARM 过程调用ABI约定手册

注:上述手册为本人进行zynqzc702开发板研究时使用参考手册,希望在后续研究过程中能对该手册内容进行概略描述,以便大家查找相关细节。待补充。
2:源码索引:
    Linux源码

3:启动流程:

注:本博文以提出问题,回答问题方式进行记录本人研究双核系统的过程希望在一步步研究及分析后,能够完整回答各个问题。以下分析基于ARMv7架构Linux代码和XILINX的ZYNQ平台。由于本博文正在更新过程中,还未完成,若对单核启动有兴趣的朋友可以查看如下资源,该资源正是本人前半部分启动需要描述的内容

    网络资源

问题1-1:双核芯片上电后,是否同时启动的?

答案:双核芯片上电后,并非同时启动,启动代码运行在一个核上,而是一个核处于备用状态。

 

参见

 

Linux双核SMP系统启动流程(Zynq-ARM-CortexA9)

图1:CPU1启动工作状态

Linux双核SMP系统启动流程(Zynq-ARM-CortexA9)

图2:CPU1启动流程

问题1-2:根据上述参考资料,第二个核是通过CPU0进行设置并引导启动的,Linux是怎么完成这一步的呢?我们从内核入口函数开始研究启动过程。
答案:本部分从Linux系统启动部分开始分析,BOOT启动引导部分暂不做分析。
   1)入口函数

    \linux-xlnx\arch\arm\kernel\head.S

点击(此处)折叠或打开--CodeSegment1

  1. .arm

  2. __HEAD
  3. ENTRY(stext)

  4. THUMB( adr r9,BSYM(1f) ) @ Kernel is always entered in ARM.
  5. THUMB( bx r9 ) @ Ifthis is a Thumb-2 kernel,
  6. THUMB( .thumb ) @switch to Thumb now.
  7. THUMB(1:)

  8. setmode PSR_F_BIT |PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
  9. @ and irqsdisabled
  10. mrc p15, 0, r9, c0,c0 @ get processor id
  11. bl__lookup_processor_type @ r5=procinfo r9=cpuid
  12. movs r10, r5 @invalid processor (r5=0)?
  13. THUMB( it eq ) @force fixup-able long branch encoding
  14. beq __error_p @ yes,error 'p'

  15. #ifdefCONFIG_ARCH_XILINX
  16. movr0,#0x0
  17. ldrr1,=MACH_TYPE_XILINX
  18. #endif
  19. #ifdefCONFIG_XILINX_FIXED_DEVTREE_ADDR
  20. movr2,#0x1000000
  21. #endif
  22. #ifdefCONFIG_ARM_LPAE
  23. mrc p15, 0, r3, c0,c1, 4 @ read ID_MMFR0
  24. and r3, r3, #0xf @extract VMSA support
  25. cmp r3, #5 @long-descriptor translation table format?
  26. THUMB( it lo ) @force fixup-able long branch encoding
  27. blo __error_p @ onlyclassic page table format
  28. #endif

  29. #ifndefCONFIG_XIP_KERNEL
  30. adr r3,2f
  31. ldmia r3, {r4,r8}
  32. sub r4, r3, r4 @(PHYS_OFFSET - PAGE_OFFSET)
  33. add r8, r8, r4 @PHYS_OFFSET
  34. #else
  35. ldr r8, =PHYS_OFFSET@ always constant in this case
  36. #endif

  37. bl__vet_atags
  38. #ifdefCONFIG_SMP_ON_UP
  39. bl__fixup_smp
  40. #endif
  41. #ifdefCONFIG_ARM_PATCH_PHYS_VIRT
  42. bl__fixup_pv_table
  43. #endif
  44. bl__create_page_tables

  45. ldr r13,=__mmap_switched @ address to jump to after
  46. @ mmu has beenenabled
  47. adr lr, BSYM(1f) @return (PIC) address
  48. mov r8, r4 @ setTTBR1 to swapper_pg_dir
  49. ARM( add pc, r10,#PROCINFO_INITFUNC )
  50. THUMB( add r12, r10,#PROCINFO_INITFUNC )
  51. THUMB( mov pc, r12)
  52. 1: b__enable_mmu
  53. ENDPROC(stext)
  54. .ltorg
  55. #ifndefCONFIG_XIP_KERNEL
  56. 2: .long.
  57. .longPAGE_OFFSET
  58. #endif
注:本部分源码为汇编代码,汇编与C语言相互调用参数传递,返回值等相关约定参见
0 0
原创粉丝点击