加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-05-22 11:41:36)
分类: Linux

分类: LINUX

 

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

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

3:启动流程:

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

    网络资源

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

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

 

参见

 

http://blog.chinaunix.net/attachment/201208/28/20648445_1346157677N05x.png

图1:CPU1启动工作状态

http://blog.chinaunix.net/attachment/201208/28/20648445_13461578302PnP.png

图2: CPU1启动流程

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

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

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

  1. .arm

  2. __HEAD
  3. ENTRY(stext)

  4. THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM.
  5. THUMB( bx r9 ) @ If this 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 irqs disabled
  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. #ifdef CONFIG_ARCH_XILINX
  16. mov r0,#0x0
  17. ldr r1,=MACH_TYPE_XILINX
  18. #endif
  19. #ifdef CONFIG_XILINX_FIXED_DEVTREE_ADDR
  20. mov r2,#0x1000000
  21. #endif
  22. #ifdef CONFIG_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 @ only classic page table format
  28. #endif

  29. #ifndef CONFIG_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. #ifdef CONFIG_SMP_ON_UP
  39. bl __fixup_smp
  40. #endif
  41. #ifdef CONFIG_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 been enabled
  47. adr lr, BSYM(1f) @ return (PIC) address
  48. mov r8, r4 @ set TTBR1 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. #ifndef CONFIG_XIP_KERNEL
  56. 2: .long .
  57. .long PAGE_OFFSET
  58. #endif
注:本部分源码为汇编代码,汇编与C语言相互调用参数传递,返回值等相关约定参见

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有