当前位置:   article > 正文

powerpc-linux内核start_kernel之前启动分析(1)-开门见山_powerpc linux 启动

powerpc linux 启动

前段时间做了公司内核从arm处理器到一款powerpc处理器的移植(公司处理器换核,前期用FPGA仿真板进行了芯片验证和软件移植),借这个机会也学习了powerpc处理器的一些知识,对powerpc的内核启动也有所了解。
完成了arm版本内核start_kernel之前汇编分析,也想尝试写几篇文章对powerpc的启动进行分析,与大家分享。

在分析之前,首先罗嗦几句,这次移植工作之前我从来没有接触过powerpc相关的知识,因此是作为一个初学者来完成这次移植工作的。
初学者要完成一次完整的内核移植,我觉得首要一点是认真学习该处理器核的芯片手册,以我移植的处理器(ppc460s)为例,首先要找到该处理器核的芯片手册,不像SOC芯片手册会介绍SOC的外设资源,处理器核芯片手册介绍的是处理器内部逻辑以及特性,手册需要重点关注的几点有:
(1)地址空间管理,包括上电取指地址,MMU如何配置使用等
(2)寄存器定义,包括通用寄存器,特殊功能寄存器
(3)中断异常的定义,异常向量表如何定义和使用
(4)cache管理
(5)处理器核reset后如何初始化,处理器核手册会给出一些标准的步骤
(6)处理器核特定资源介绍,如ppc460s核内集成了timer,有指定指令进行操作

以上所述都是处理器核的特性,肯定会在处理器核的手册中进行介绍,学习了这些,再对基于该处理器核的SOC地址空间布局(看SOC手册,地址空间分布是由处理器核外的地址总线仲裁决定的)加以学习,对这款处理器就有了内在的了解。
当然处理器指令集也是一项处理器核特性,各架构处理器表面看最大的区别就是指令集不一样,但是我个人感觉指令集并不需要特别的关注,只需要看懂指令含义,会写最基本的指令即可,指令是我们操纵处理器的工具。处理器的核心区别还是在上述的几点。
每种架构处理器都会有些通用的处理器特性定义,也有专门的资料来介绍,可以与处理器核手册配合着看,如powerpc的BOOKE,MIPS的《see mips run》,ARM的《ARM指令体系架构》等。这些资料都对处理器的上述特性做了一些通用的定义。
linux内核在start_kernel之前的大部分工作都是对处理器核的一个初始化工作,将整个内核启动过程全部了解后你就会发现,内核启动其实就是一个处理器SOC由内到外进行初始化的过程!
了解了处理器核的特性,接下来就可以进行内核移植,内核移植的大体思路我总结了一篇文章,连接如下:
http://blog.csdn.net/skyflying2012/article/details/43281565

linux内核的入口是在_start,对于如何根据链接脚本来判断内核入口函数可以看我的arm内核启动分析第一篇文章:
http://blog.csdn.net/skyflying2012/article/details/41344377

kernel版本:3.4.55
处理器:ppc460s

今天首先来分析_start的前几行汇编,ppc460s属于ppc的44x系列,根据arch/powerpc/kernel/Makefile,_start在arch/powerpc/kernel/head_44x.S中。powerpc各个系列处理器差别较大,因此head文件也有好多个,本文只分析460s所属的head_44x.S,首先来看前几行汇编:

_ENTRY(_stext);
_ENTRY(_start);
    /*
     * nop指令在后面会被abatron_pteptrs页表指针替换掉
     * 
     */
    nop
    mr  r31,r3      /* save device tree ptr */
    li  r24,0       /* CPU number */

    //没有选RELOCATABLE,不走该分支
#ifdef CONFIG_RELOCATABLE
/*
 * Relocate ourselves to the current runtime address.
 * This is called only by the Boot CPU.
 * "relocate" is called with our current runtime virutal
 * address.
 * r21 will be loaded with the physical runtime address of _stext
 */
    bl  0f              /* Get our runtime address */
0:  mflr    r21             /* Make it accessible */
    addis   r21,r21,(_stext - 0b)@ha
    addi    r21,r21,(_stext - 0b)@l     /* Get our current runtime base */

    /*
     * We have the runtime (virutal) address of our base.
     * We calculate our shift of offset from a 256M page.
     * We could map the 256M page we belong to at PAGE_OFFSET and
     * get going from there.
     */
    lis r4,KERNELBASE@h
    ori r4,r4,KERNELBASE@l
    rlwinm  r6,r21,0,4,31           /* r6 = PHYS_START % 256M */
    rlwinm  r5,r4,0,4,31            /* r5 = KERNELBASE % 256M */
    subf    r3,r5,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/129943
推荐阅读
相关标签
  

闽ICP备14008679号